2013-02-07 61 views
3

假設A,B,C從AbstractBaseClass派生和它們是相同的java項目的所有組成部分,是形式的封裝結構...將抽象類放在包含派生類的相同包中是不是很糟糕的編程習慣?

package com.whatever.### 
AbstractBaseClass.java 

package com.whatever.###.### 
A.java 
B.java 
C.java 

...通常優於形式的封裝結構...

package com.whatever.###.### 
AbstractBaseClass.java 
A.java 
B.java 
C.java 

...還是有少數人可能會在意嗎?

+2

我期待的情況恰恰相反:將抽象框架類package-private與實現保持在同一個包中是一個很好的習慣。 –

回答

1

我寫的,所用的第一個例子,這裏是我如何合理的設計相當複雜的應用程序。在我的情況下,有一個與定價承保案例相關的通用界面,但是有幾家供應商可以提供不同的Web服務來填充實際數據。這是封裝結構

com.example.pricing 
\IPricingProvider.java 
\AbstractPriceProvider.java 
com.example.pricing.vendorA 
    \PricingEngine.java 
com.example.pricing.vendorB 
    \PricingEngine.java 
com.example.pricing.vendorC 
    \PricingEngine.java 

然後在我的代碼我用import接線我想要的發動機。就像這樣:

import com.example.pricing.*; 
import com.example.pricing.vendorB.*; 

IPricingProvider provider = Engine.create(); 

對我來說,優勢是有每個供應商複雜而凌亂的實現(兩個人基於REST之一是使用wsimport所以有很多生成的Java文件的Web服務),而不是能力使Eclipse自動完成看起來像一個完整的噩夢。此外,它更容易將單個供應商交給不同的開發人員。

+1

我不同意你的回答,因爲對我來說,在不同的包中使用相同的類名是一場噩夢。我更喜歡相同的包和不同的類名。 我只是將不同的實現打包到不同的罐子(如果可能的話),只包括實際使用的供應商罐子。 但我認爲這就像喜歡巧克力比香草。 –

+0

我想這歸結於你想用什麼機制來管理不同的實現。有了像寫得很好的Ant Build文件或者Maven,你的方法可能不會變得更加繁瑣,並且事實上會導致運行時間更短,部署更容易。也許是時候讓我退出香草,嘗試巧克力(從視角來看+1) –

0

它實際上是比較好的做法。太多的軟件包會很快混淆。將實現類保留在同一個包中可以避免額外的導入語句,並且隨着應用程序代碼庫的增長,可以很容易地找到抽象類。如果你有更多的實現類都來自抽象類,那麼這個例外就是這種情況。例如,如果你有一個MySQL實現和一個抽象類的Mongo實現,你可能想把它們放在不同的子包中。類似於

com.foo.data <--- abstract classes 
com.foo.data.mysql <-- impl 
com.foo.data.mongo <-- impl 
0

包結構有兩個目的,有時候不一致。

  1. 讓人們很容易學習你的API和代碼,找到他們想做的事。在這種情況下,您希望將事情組織在一起,並使用軟件包名稱,這對瀏覽Javadoc的用戶來說很明顯。這就涉及到一小部分包含廣泛部門的軟件包,這對API客戶端來說是有意義的。
  2. 允許類訪問彼此的包私有的API。這爲許多緊密耦合的小類羣提出了爭議。

像包這樣的大型組織不應該依賴於當前的實現細節,所以我更喜歡(1)超過(2)。

深層次的刻苦學習,因此,如果添加名稱元素不會使你的學習更簡單的API,並不能幫助人們過濾掉不相關的他們目前的任務位,然後離開它。

0

我認爲這取決於這部分是比較重要的一個客戶端:超類或子類?

後者通常是這樣的情況,當你首先考慮子類時,只是將某些常見部分重構爲超類。然後,這個超級類應該在同一個包中,而不是公開可見的,就像路易斯在評論中所說的那樣。如果客戶需要查看子類的類型,那麼你傾向於使用這種模式。但是,當你從實現中抽象出來時,客戶通常只能像Jason的答案一樣使用超類,那麼你應該遵循將每個子類放入它自己的包中的策略。通常這些子類需要與外部代碼無關的其他類,所以對於它們自己的包是一件好事。

0

令人驚訝的是答案是。這取決於。

如果你打算做兩個兄弟姐妹的後代,那麼每個文件(如三)是有道理的。如果他們很小,並且/或者你會一直使用兩者(例如目錄和文件),那麼無論如何都有一個務實的論點來保持它們的一致性。

如果你正在構建一些深層次的繼承層次結構,其中只有最後的後代具有可用的功能(類越抽象,它越少),那麼把它放在一個單獨的文件中是毫無意義的。

相關問題