2012-04-02 31 views
8

我正在使用JDBC(不包括Spring,Hibernate或其他)在Java中編寫一些簡單的DAO。DAO包結構

將實現DAO放在與它們的接口相同的包中,還是將它們放入子包中是否更好?

例子:

com.mycompany.myproject.dao.MyDao 
com.mycompany.myproject.dao.MyDaoImpl 

OR

com.mycompany.myproject.dao.MyDao 
com.mycompany.myproject.dao.impl.MyDaoImpl 

如果您認爲子包結構,你會建議作爲一個子包的名字嗎? .impl? .SQL? .jdbc?

實際上,我不會有多個實現。我是否過度設計了這個?

+0

根本沒有替代實現?甚至沒有單元測試嘲笑? – 2012-04-02 18:03:05

回答

5

在設計應用程序時,沒有標準包的結構化方式,經驗通常有助於每個人決定什麼是我們包的合適名稱。

關於在同一個軟件包或不同的軟件包中打包接口的實現,只需考慮Java本身是如何構建的:通常一個實現類與其接口封裝在同一個包中,但並非全部都是這樣。

如果你將要有幾個相同的DAO實現,那麼它們在.jdbc,.jpa.jdo子包中的結構是有意義的。如果你只有一個實現,你列舉的兩個選項都是有意義的(相同的包或者.impl子包)。

關於過度工程,我會建議你這article。即使你將只有一個DAO的實現,將它們定義爲一個接口和實現是有意義的,因爲這將有助於你在潛在的將來爲其他框架重寫你的DAO,而利用他們保持不變。

最後,由您(或您和您的同事)達成共識並做出更有意義的決定。

編輯

的應用程序通常有每個DAO接口一個實現,這是不是過度設計的話,那根本就沒有意義,有JPA和JDO實現了相同的DAO接口。一些使用接口/實現模式的目的是爲了簡化重新分解,通過模擬對象進行測試等。

PS:我通常依靠JDepend將我的應用程序類分發到程序包中,避免了循環如我所能。

2

我不認爲要麼更好,但在這種情況下,我更喜歡第一個選擇。這與符合ArrayList,LinkedList等,與List相同。

當使用其他框架,如hibernate我更喜歡MyDaoHibernateDao作爲實現者的第二個選項。

0

名稱空間和包只存在以防止衝突。只要它們是獨特的,它們都不是優選的。

+1

所以沒關係,只要給你的包命名很長的隨機字符串就行了?明智的軟件包名稱使人們更輕鬆地瀏覽您的API,並且可以更輕鬆地進行重構。另外,例如,實現和接口是在由包指定了導出和依賴項的環境中的良好實踐,因爲您通常只想依賴於接口或實現。 – 2014-09-29 11:01:30

+0

我的答案是特定於OP的情況。他/她提出的替代方案之間沒有客觀的區別。關於你的評論,我只能說創建一個可理解的命名空間是常識。 – nsfyn55 2014-09-29 13:22:36

2

我會與你的第二個選項(儘管沒有更好),因爲你可以立即在導入中看到,如果impl被導入,並且重構將會更簡單,如果你想在另一個項目中移動你的impl。

這不是過度工程。有多種優勢,使用DAO:

  1. 它可以改善你的代碼,若解除其他考慮
  2. 測試代碼的數據庫訪問質量變得更容易,你可以用更細的晶粒進行測試。
  3. 如果有一天,你發現Hibernate對你來說實際上更容易,它不會影響你的其他代碼。