包装类型与包装类别_包装的重要性
包裝類型與包裝類別
我記得大約15年前開始學(xué)習(xí)Java的時(shí)候。 我讀到了很多有關(guān)“包裝”和“命名空間”的東西,但我完全不了解。 可悲的是:雖然包裝的某些方面幾乎為行業(yè)中的每個(gè)人所了解,但其他方面卻不是。 因此,讓我們看一下哪些軟件包最適合。
命名空間:
通過為您的所有程序包加上您所控制的域的前綴,可以確保您的類名是唯一的。 這對(duì)于數(shù)量驚人的開源項(xiàng)目的成功至關(guān)重要。 每個(gè)項(xiàng)目都可以(并且可能在某個(gè)階段進(jìn)行定義)定義一個(gè)“ Filter”類,而不會(huì)干擾該類的所有其他同名類(除了可憐的開發(fā)人員,他們從網(wǎng)絡(luò)上復(fù)制了一些沒有導(dǎo)入語句的代碼,現(xiàn)在以找出實(shí)際引用了哪個(gè)Filter類)。 這是一個(gè)很好的理解,而且我還沒有看到根軟件包的任何相關(guān)用法。
組織:
我兒子有一大盒樂高積木。 可能有成千上萬個(gè)。 當(dāng)他尋找簡(jiǎn)單的2×4磚塊時(shí),這不是問題。 但是,當(dāng)他正在搜索僅在集合中存在4次甚至只有一次的特殊磚塊時(shí)? 可能需要很長(zhǎng)時(shí)間才能找到它。 將其與藥劑師柜子比較。 數(shù)百種藥物,通常只需幾秒鐘即可找到合適的藥物。 而且他們甚至都沒有使用Google! 它們只是每種藥物所屬的嚴(yán)格訂購(gòu)原則,包括一條規(guī)則,即如何確定新藥的正確框。 由于涉及的每個(gè)人都知道該原理,因此很容易確定要在其中找到毒品的正確盒子。 當(dāng)在項(xiàng)目早期建立時(shí),這樣的排序原則將非常有用。
當(dāng)定義這樣的原則時(shí),一個(gè)標(biāo)準(zhǔn)在大多數(shù)時(shí)間是不夠的。 但是,如果您使用更多的規(guī)則,則使規(guī)則正交,以確保它們不會(huì)干擾。 這意味著沒有規(guī)則說:“所有數(shù)據(jù)庫(kù)訪問代碼都必須放入軟件包x中”,而另一條規(guī)則規(guī)定“與客戶相關(guān)的所有代碼都必須放入軟件包y中”。 否則,您將不知道將CustomerDAO放在哪里。 而是在包樹的不同深度上應(yīng)用正交規(guī)則。 我的默認(rèn)包結(jié)構(gòu)如下所示:
這將導(dǎo)致軟件包名稱,例如com.mycompany.theCoolApp.server.user.persistence或com.mycompany.theCoolApp.client.shoppingCart.presentation 。
如果您查看這樣的包結(jié)構(gòu),則很明顯新類屬于什么地方,或者類似的東西已經(jīng)存在的地方。 如果避免使用諸如util或misc類的名稱,它們可能會(huì)或多或少地隱藏所有內(nèi)容,則效果會(huì)更好。 您也可以查看這些軟件包并立即了解有關(guān)體系結(jié)構(gòu)的知識(shí)。 一旦看到一個(gè)名為client , webserver和batchserver的軟件包級(jí)別,您就會(huì)在腦海中形成一個(gè)模型,說明應(yīng)用程序的結(jié)構(gòu)以及名稱的選擇是否正確。 由于在每個(gè)module中都應(yīng)用了相同的layers規(guī)則,因此您也可以在較低的軟件包中找到有關(guān)應(yīng)用程序結(jié)構(gòu)的更多信息。
之間的module傳達(dá)應(yīng)用程序要處理的領(lǐng)域的類型。 很自然,重要的概念會(huì)得到自己的包裝,從而使每個(gè)檢查代碼的人都可以聲明:這是此應(yīng)用程序中的重要概念。
我還喜歡添加規(guī)則,“一個(gè)包應(yīng)包含a – b類,但不得包含c或更多類”,并為a,b和c設(shè)置適當(dāng)?shù)闹怠?隨著應(yīng)用程序的增長(zhǎng),這將強(qiáng)制創(chuàng)建新的軟件包,從而使每個(gè)軟件包保持可管理的大小。
當(dāng)然,在較小的應(yīng)用程序中,結(jié)構(gòu)可能會(huì)縮小。 例如,如果只有一個(gè)部署單元,則無需為該分類使用單獨(dú)的程序包級(jí)別。
包的最后一種用法是最被忽略的: 中間建模塊 :Joe Average Developer主要關(guān)注類和方法以及單行代碼,同時(shí)嘗試在該級(jí)別上提出適合應(yīng)用程序需求的代碼結(jié)構(gòu)。 通常,有些架構(gòu)師會(huì)弄清楚如何部署應(yīng)用程序,從而確定必要的部署單元(請(qǐng)考慮單獨(dú)的jar)。 如果您查看這些工件的規(guī)模,可能會(huì)發(fā)現(xiàn)一些有趣的東西:
- 1種方法由大約10行代碼組成。
- 1類包括大約10種方法。
- 1罐子大約包含100 – 1000類。
如果沒有人照顧包裹,則至少會(huì)缺少一種結(jié)構(gòu),常常會(huì)缺少兩層結(jié)構(gòu)! 可以并且應(yīng)該用包裝來填補(bǔ)這個(gè)空白。 這不僅意味著包裝應(yīng)該存在并且具有合理的尺寸,還意味著它們應(yīng)該遵循通用的設(shè)計(jì)準(zhǔn)則。 特別是“ 單一責(zé)任原則”和對(duì)依賴項(xiàng)的正確處理:
單一責(zé)任原則:
通過上面提出的命名方案,完成了兌現(xiàn)SRP的大量工作。 如果軟件包的內(nèi)容符合其名稱說明,那么在此方面一切都很好。
依賴性管理:
是更強(qiáng)悍的野獸。 Java當(dāng)前沒有提供適當(dāng)?shù)南到y(tǒng)來控制軟件包之間的依賴關(guān)系,尤其是超級(jí)軟件包,即包含多個(gè)其他軟件包的軟件包。 有OSGI ,但是我發(fā)現(xiàn)使用它很麻煩 ,特別是因?yàn)槲也恍枰械膭?dòng)態(tài)加載內(nèi)容,但是卻遭受了類加載器問題的困擾。 也有拼圖,但還不存在。 因此,我更喜歡使用自定義測(cè)試來定義和驗(yàn)證所使用的應(yīng)用程序的程序包結(jié)構(gòu)。 我選擇的工具是JDepend 。 它為您提供了程序包之間的依賴關(guān)系列表,您可以使用它們將它們與您定義的規(guī)則進(jìn)行比較。 有人創(chuàng)建了從程序包A到程序包B的依賴關(guān)系,該依賴關(guān)系不應(yīng)該存在? 動(dòng)臂,測(cè)試變成紅色。
那么對(duì)程序包依賴性有用的規(guī)則是什么? 第一:無周期。 不在包級(jí)別上,也不在layer級(jí)別上或module級(jí)別上,如上所述。 第二:模塊和層具有嚴(yán)格的順序,在順序上它們可以相互依賴,其他所有內(nèi)容均被禁止。
這些規(guī)則極大地限制了開發(fā)人員的自由度。 但是以我的經(jīng)驗(yàn),它消除了違反“單一責(zé)任原則”的情況,該原則經(jīng)常以循環(huán)依賴的形式出現(xiàn)。 例如,如果您有一個(gè)Order模塊和一個(gè)Customer模塊,則感覺這兩個(gè)需要彼此了解。 如果您有訂單,則想知道該訂單所屬的客戶。 如果您有客戶,您必須能夠告訴她所下的訂單。 對(duì)? 很可能是。 但是,您是否需要兩側(cè)都有完整的對(duì)象和功能? 可能不是。 例如,通過提供一個(gè)界面包,其中僅包含訂購(gòu)模塊所需的客戶功能的最核心部分,以及一個(gè)單獨(dú)的完整的具有參考訂單的客戶模塊, 可以打破這些依賴關(guān)系并在您的需求中實(shí)現(xiàn)更強(qiáng)的關(guān)注分離包裝結(jié)構(gòu)。
當(dāng)您嘗試開發(fā)應(yīng)用程序時(shí),這反過來會(huì)有所幫助。 今天的軟件包有一天可能會(huì)成長(zhǎng)為一個(gè)部署單元,如果您在部署單元之間存在循環(huán)依賴關(guān)系,則會(huì)遇到一些嚴(yán)重的問題。 也許您的團(tuán)隊(duì)成長(zhǎng)為多個(gè)團(tuán)隊(duì)。 有了如上所述的干凈的程序包結(jié)構(gòu),當(dāng)團(tuán)隊(duì)必須坐在一起討論由多個(gè)團(tuán)隊(duì)使用的程序包的更改時(shí),您將有明顯的界限可以拆分,并且還有明顯的標(biāo)準(zhǔn)。
參考:來自Schaderhaft博客的JCG合作伙伴 Jens Schauder 的軟件包重要性 。
翻譯自: https://www.javacodegeeks.com/2013/01/the-importance-of-packages-3.html
包裝類型與包裝類別
總結(jié)
以上是生活随笔為你收集整理的包装类型与包装类别_包装的重要性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从关系数据库到Elasticsearch
- 下一篇: 微服务系列:MicroProfile和A