2012-01-20 118 views
3

我需要爲應用程序創建一個API(可以說庫管理器)。像許多典型的應用程序一樣,它是在一個ORM工具的基礎上製作的,它使得POJO被保存到dbms中。 現在我必須製作API,以便其他開發人員可以將它用作JAR。比方說,我們希望用戶添加圖書到圖書館。 我有很多關於最佳設計方法的問題。API設計和DAO模式

1)是否有類似的DAO類的POJO是一個好主意:
BookManager { create(...) delete(Book book); List<Book> getAll(); ... }

2)曝光對象:

一)我應該揭露實際應用POJO對API層? 這些有一些可能不想公開的應用程序邏輯以及我想公開的某些邏輯。例如,我想公開book.getPages()而不是book.deletePage(int pageNo)

b)專門爲API層創建重複的對象。只有界面將被暴露。

c)根本不暴露對象。 API使用參數。例如

BookManager { create(String name, int price); delete(String name); List<Pair<String, Integer>> getAll(); ... }

這意味着,與系統接入的單個點。如果某些操作要在POJO上執行,它將從BookManager中調用。例如,ClockManager.start(String clockName)。它還具有靈活性,例如在ClockManager中具有諸如startAll()的方法。 3)最後,BookManager應該包含一個update()方法,還是它應該出現在Book本身中?更新意味着將配置保存到數據庫中。什麼更有意義:

Book book = bookManager.create("API Design"); book.setPrice(); book.update();

或者,

Book book = bookManager.create("API Design"); book.setPrice(); bookManager.update(book);

在此先感謝,
阿曼

回答

1

我不禁覺得有些問題,這這種情況會發生,因爲你的POJO包含的功能更接近ActiveRecord之類的功能。作爲包含「.GetPages()」方法的示例書。如果它是一個真正的POJO,它已經加載了頁面(或者隱藏的DAO引用,因此它們可以被延遲加載)。同樣,當你刪除一個頁面時,你不需要了解那個時候的DAO。您從書中刪除頁面,然後將書保存到BookDAO。此外,我不會推薦您通過API公開的任何POJO的延遲加載方法。

要嘗試,準確地回答你的問題:

  1. 喜歡的東西,我認爲是的。

  2. 很明顯,選項(c)最有可能被所有消費者使用。如果你打電話給你的API,並且你想要刪除一本書,你真的想先拿到這本書先通過,還是隻想傳入ID或名字(你可能已經擁有)。

  3. BookManager應該有更新(書籍)。如果你把更新放在書本上,那麼你正在將POJO轉換成ActiveRecord類型的功能。在正確的情況下都可以,但混合動力總是令人困惑。

注:(3)完全活動記錄類型將

Book book = Book.Load("API Design"); book.SetPrice(45); book.Update() 
+0

感謝保羅,這並不是真正的圖書館管理系統。我只是試圖想出一些真實世界的例子。 – amanmanocha

+0

好吧,剛剛用你的例子來說明我的意思是由activerecord patten - load是一個靜態(C#,不知道它是什麼在Java中)方法的對象,因爲它的目的是創建一個實例,而Update方法該實例。 –

+0

謝謝保羅,它實際上不是一個圖書館管理系統。我只是試圖想出一些真實世界的例子。
我完全同意你關於將POJO轉換爲ActiveRecord類型功能的觀點。你能解釋一下這樣一個場景,它適合擁有book.update()。我相信通過使用bookManager.update()我向用戶發出明確的信號,如果您想與API交互,請通過Manager界面。 – amanmanocha

0

簡短的回答:

  1. 不一定。我不會讓我使用的ORM工具決定我的設計。你沒有說你使用的是什麼工具,但好的東西非常靈活,並且可以堅持幾乎所有的POJO設計。

  2. 選擇b)。不要暴露比你更需要的,但最好是公開對象,而不是引進c)中使用的那種間接的

3)第一個選項是更好的。

我實際上並不確定我會給你正確的建議,因爲我聽起來很可能。原因在於他們需要考慮許多折衷因素。這是我所知道的關於你的項目我都基於最好的建議...

我保持一個關於API設計的網站:

http://theamiableapi.com/

您也可能想讀一兩本書。查看菜單中的資源。在一個由Joshua布洛赫或者也許是一個由雅羅斯拉夫Tulach

費倫茨

+0

謝謝Ferenc,剛完成Joshua Bloch的API設計視頻。已經開始閱讀一本書。 ORM工具是DataNucleus。 – amanmanocha

+0

看到兩個回答(迄今爲止)幾乎相互矛盾,這一定非常令人困惑。有趣的是,我不反對保羅下面。他正在給你關於典型的ORM使用模式的正確建議。我已經從Java API設計的角度更加關注了您的問題,您可以儘可能多地隱藏實現細節(在這種情況下,持久層如何工作)。只有你可以告訴你的情況更重要。 –