2014-02-21 41 views
1

假設您爲某個庫設計了一個API。類型分離(API設計)

您想在API中公開某些數據類型(例如Person)(例如getAllPeople())。

考慮以下目標:

  • 可以很容易地添加成員Person(可擴展)
  • 不引入庫的客戶端之間的依賴關係,以及實現(耦合)
  • Person可能包括一點意思都沒有圖書館

的客戶端內部狀態信息如何Y就應該你去了嗎?

  1. 在庫頭/ API包中定義Person;使庫的客戶端和實現都依賴於它(高耦合;非常容易擴展)
  2. 在API /頭中定義Person;在您的庫實現中定義PersonModel extends Person(易於擴展;仍有一些耦合)
  3. 定義PersonModel in impl .;在API中定義Person extends PersonModel(可怕的依賴關係)
  4. 在impl中定義PersonModel;在API中定義Person並在需要時複製內容(難以擴展;無耦合)
  5. 其他任何東西?

回答

2

實際上,Person是API的一部分。圖書館用戶有責任選擇如何在他的架構環境中解耦你的API。你不應該強加它。

如果用戶不想使用Person對象,他必須封裝/複製您的對象。

當然,您可以將Person設計爲可擴展的,但無論如何它都是API的一部分。該API的用戶與其耦合。他必須選擇何時何地需要與之脫鉤以及如何去做。如果Person設計得很好,他可能會在任何地方使用它。如果設計不好或不易使用/擴展,那麼他會複製有趣的部分並重新設計它。

當你設計一個API時,'Person'類型的對象應該是一個接口,例如用戶不應該有權訪問該實現。如果person是API的服務輸入,則任何實現都應該起作用(Liskov原理)。如果Person是一個輸出參數,那麼用戶應該得到一個引用,以及任何底層的內部實現,將不會與客戶端代碼耦合。處理對象構造很難,但使用*工廠設計模式,甚至可以管理它。如果沒有具體落實到客戶端的代碼可見,你有:-)

+0

一個很好的API我加了一個約束細化的問題 – benzaita

+0

謝謝你的詳細解答。我想知道我是否過度簡化了這個問題,因爲我覺得我還沒有解決方案。如果'Person'對象必須是可序列化的,那麼它可以用於RPC?然後客戶_must_有一個具體的類定義'人' – benzaita

+0

(+1)第一段總結了答案;-) – umlcat