簡體   English   中英

Java包結構約定

[英]Java package structure convention

我正在使用 Typescript 和 Javascript,我停下來思考了命名空間以及我們如何在 Java 中組織代碼。

現在,我經常看到多個具有相同目的的類,只是為了用於不同的數據,被放置在具有不同名稱的不同包中。

雖然將這些類放在不同的包中是保持項目/模塊處於良好狀態的好習慣,但為什么我們必須給它們不同的名稱? 我的意思是,他們的目的是一樣的。

我自己可以回答這個問題:因為我們經常在同一個單元中使用這些類,它們會發生沖突,因此需要一個長完整的包規范。

但是我們不是違反了 DRY 原則嗎? 我們應該使用我們的目錄(包)結構來了解這些類在哪個域空間中工作。

正如我上面寫的,我想許多開發人員並沒有尊重這個 DRY 原則,只是為了避免長包名。 那么,我們為什么要創建那些 monstruos 包層次結構?
谷歌搜索"Java packages best practices"得到如下建議:

com.mycompany.myproduct.[...]

這些建議從何而來? 我們不是在浪費空間嗎?
我們顯然不想每次都寫那個。

MyClass myInstance;
com.mycompany.myproduct.mypackage.MyClass myOtherInstance;

但它本來可以

myfeature.MyClass myInstance
myotherfeature.MyClass myInstance;

我們甚至可以為兩者指定完整的包。
那么,這些最佳實踐從何而來?

如前所述,這個約定可以追溯到 Java 的第一個版本。 通過使用包的層次結構限定導入的依賴項(例如類路徑庫)類,強調並保持我們自己的代碼更清晰,可以輕松解決名稱沖突。 同樣重要的是要記住我們可以訪問包級別的可見性,這在今天似乎被忽視了。

正如評論者指出的那樣,這個約定是在 Java 最開始時建立的,以允許對所有類使用全局命名空間。

Java 影響這一點的一件事——與 TypeScript 和 JavaScript 不同——類的名稱及其包(以及它使用的所有類和包的名稱)在編譯時是固定的。 您不能在不修改源代碼的情況下將類重新組合到不同的層次結構中。 因此,它不像解釋性語言那樣靈活,您可以在其中移動層次結構並更改加載代碼的位置。

當然,例如,您可以將應用程序中的所有內容都放在頂級包中,並且非常有信心可以逃脫。 只要其他遵循現有約定,您就可以做到這一點。 一旦他們停止這樣做,並且庫開始將類放在他們想要的任何地方,您就會發生沖突,您將不得不更改您的應用程序。 或者庫會開始相互沖突,如果你沒有源,你將無法真正修復它。

所以有充分的理由。

我基於意見的部分——堅持慣例和語言(或平台)文化是有道理的。 在我們看來,即使這些約定很愚蠢。 有一個地方可以打破它們,但優勢必須非常大。 其他開發人員將習慣於約定,工具將對約定做出假設……通常順其自然是有意義的。

對 Java 中的每個屬性使用 getter 和 setter 真的有意義嗎? 如果您了解您正在使用的域,那么它可能不會很好。 但是停止這樣做,你的代碼對你團隊的其他成員沒有意義,你必須在人們加入時不斷地重新審視這個決定,等等。

如果這是一個單人項目,並且永遠都是,當然,你可以做你想做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM