包裝的重要性

我記得大約15年前開始學習Java的時候。 我讀了很多有關“包裝”和“命名空間”的東西,但我完全不了解。 可悲的是:雖然包裝的某些方面幾乎為業內每個人所了解,但其他方面卻并非如此。 因此,讓我們看一下哪些軟件包最適合。

命名空間:

通過為您的所有程序包加上您所控制的域的前綴,可以確保您的類名是唯一的。 這對于數量驚人的開源項目的成功至關重要。 每個項目都可以(并且可能在某個階段做一個)定義一個“ Filter”類,而不會干擾該類的所有其他同名類(可憐的開發人員除了從網絡上復制了一些沒有導入語句的代碼外,現在有了以確定實際引用了哪個Filter類)。 這是一個很好的理解,而且我還沒有看到根軟件包的任何相關用法。

組織:

我兒子有一大盒樂高積木。 可能有成千上萬個。 當他尋找簡單的2×4磚塊時,這不是問題。 但是,當他正在搜索僅在集合中存在4次甚至只有一次的特殊磚塊時? 可能需要很長時間才能找到它。 將其與藥劑師柜子比較。 數百種藥物,通常只需幾秒鐘即可找到合適的藥物。 而且他們甚至都沒有使用Google! 它們只是每種藥物所屬的嚴格訂購原則,包括一條規則,即如何確定新藥的正確框。 由于涉及的每個人都知道該原理,因此很容易確定要在其中找到毒品的正確盒子。 當在項目早期建立時,這種排序原則將非常有用。
在定義這樣的原則時,一個標準在大多數時間是不夠的。 但是,如果您使用更多的規則,則使規則正交,以確保它們不會干擾。 這意味著沒有規則說:“所有數據庫訪問代碼都必須放在軟件包x中”,而另一條規則規定“與客戶相關的所有代碼都必須放入軟件包y中”。 否則,您將不知道將CustomerDAO放在哪里。 而是在包樹的不同深度上應用正交規則。 我的默認包結構如下所示:

<organisational-prefix>.<application>.<deployment-unit>.<module>.<layer>.<optional further substructure if needed>

這將導致軟件包名稱,例如com.mycompany.theCoolApp.server.user.persistencecom.mycompany.theCoolApp.client.shoppingCart.presentation

如果您查看這樣的包結構,則很明顯新類屬于什么地方,或者類似的東西已經存在的地方。 如果避免使用諸如utilmisc類的名稱,它們可能會或多或少隱藏所有內容,則效果會更好。 您也可以查看這些軟件包,并立即了解有關體系結構的知識。 一旦您看到一個名為clientwebserverbatchserver的軟件包級別,您就會在腦海中形成一個模型,說明應用程序的結構以及名稱的選擇是否正確。 由于在每個module中都應用了相同的layers規則,因此您也可以在較低的軟件包中找到有關應用程序結構的更多信息。

之間的module傳達應用程序要處理的領域的類型。 很自然,重要的概念會得到自己的包裝,從而使每個檢查代碼的人都可以聲明:這是此應用程序中的重要概念。

我還喜歡添加規則“A包必須包含a - b類,但不得包含c以上”與A,B和C的適當的值。 隨著應用程序的增長,這將迫使創建新的程序包,從而使每個程序包保持可管理的大小。

當然,在較小的應用程序中,結構可能會縮小。 例如,如果只有一個部署單元,則無需為該分類使用單獨的程序包級別。

包的最后一種用法是最被忽略的: 中間建模塊 :Joe Average Developer主要關注類和方法以及單行代碼,同時嘗試在該級別上提出適合應用程序需求的代碼結構。 通常,有些架構師會弄清楚如何部署應用程序,從而確定必要的部署單元(請考慮單獨的jar)。 如果您看一下這些工件的規模,可能會發現一些有趣的東西:

  • 1種方法由大約10行代碼組成。
  • 1類包括大約10種方法。
  • 1罐子大約包含100 – 1000類。

如果沒有人照顧軟件包,則至少會缺少一種結構,經常會缺少兩層結構! 可以并且應該用包裝來填補這個空白。 這不僅意味著包裝應存在且尺寸合理,還意味著它們應遵循通用的設計準則。 特別是“ 單一責任原則”和對依賴項的正確處理:

單一責任原則:

利用上面提出的命名方案,完成了許多兌現SRP的工作。 如果軟件包的內容符合其名稱說明,那么在此方面一切都很好。

依賴性管理:

是更強悍的野獸。 Java當前沒有提供適當的系統來控制軟件包之間的依賴關系,尤其是超級軟件包,即包含多個其他軟件包的軟件包。 有OSGI ,但是我發現使用它很麻煩 ,特別是因為我不需要所有的動態加載內容,但是會遭受類加載器問題的困擾。 也有拼圖,但還不存在。 因此,我更喜歡使用本地測試來定義和驗證所使用的應用程序的程序包結構。 我選擇的工具是JDepend 。 它提供了程序包之間的依賴關系列表,您可以使用它們將它們與定義的規則進行比較。 有人創建了從程序包A到程序包B的依賴關系,該依賴關系不應該存在? 動臂,測試變成紅色。
那么對包依賴項有用的規則是什么? 第一:無周期。 不在包級別上,也不在layer級別上或module級別上,如上所述。 第二:模塊和層具有嚴格的順序,在順序上它們可以相互依賴,其他所有內容均被禁止。

這些規則極大地限制了開發人員的自由度。 但是以我的經驗,它消除了違反“單一責任原則”的情況,該原則經常以循環依賴的形式出現。 例如,如果您有一個“訂單”模塊和一個“客戶”模塊,則感覺這兩個需要彼此了解。 如果您有訂單,則想知道該訂單所屬的客戶。 如果您有客戶,則必須能夠告訴她所下的訂單。 對? 應該是。 但是,您是否需要兩側都有完整的對象和功能? 可能不是。 例如,通過提供一個接口程序包,其中僅包含訂購模塊所需的客戶功能的最核心部分,以及一個單獨的完整的具有參考訂單的客戶模塊, 可以打破這些依賴關系并在您的需求中實現更強的關注分離包裝結構。

當您嘗試開發應用程序時,這反過來會有所幫助。 今天的軟件包有一天可能會成長為一個部署單元,如果您在部署單元之間存在循環依賴關系,則會遇到一些嚴重的問題。 也許您的團隊成長為多個團隊。 有了如上所述的干凈的程序包結構,當團隊必須坐在一起討論由多個團隊使用的程序包的更改時,您將有明顯的界限可以拆分,并且還有明顯的標準。

參考:來自Schauderhaft博客的JCG合作伙伴 Jens Schauder 的軟件包重要性 。

翻譯自: https://www.javacodegeeks.com/2013/01/the-importance-of-packages-3.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370296.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我的python學習筆記全集_我的python學習筆記

(此文是在實際工程中遇到的一些小問題&#xff0c;給予解決和整理。解決方法大多來自網上零散的文章。)1——如下代碼&#xff0c;a[1,2,3]bab也是[1,2,3]了&#xff0c;接著a[0]4a[1]5a[2]6此時a變成[4,5,6]了&#xff0c;再看b&#xff0c;a變了之后沒有對b進行新的引用&…

課時28.假鏈接(掌握)

什么是假鏈接&#xff1f; 就是點擊之后不會跳轉的鏈接我們稱之為假鏈接。 假鏈接存在的意義&#xff1f; 在企業開發前期&#xff0c;其他界面都沒有寫出來&#xff0c;那么&#xff0c;我們就不知道應該跳轉到什么地方&#xff0c;所以就只能使用假鏈接來代替&#xff0c;…

筆記45 | 代碼性能優化建議[轉]

地址 筆記45 | 代碼性能優化建議[轉] 目錄 前言避免創建不必要的對象選擇Static而不是Virtual常量聲明為Static Final避免內部的Getters/Setters使用增強的For循環使用包級訪問而不是內部類的私有訪問避免使用float類型使用庫函數謹慎使用native函數關于性能的誤區前言 通常來說…

導彈攔截

鏈接 分析&#xff1a;經典DP題&#xff0c;最長不下降子序列的變種&#xff0c;同時需要記錄路徑&#xff0c;用pre[]數組記錄當前結點的前一個結點的方法很妙 1 #include "iostream"2 #include "cstdio"3 #include "cstring"4 #include "…

JUnit4參數化和理論示例

我始終依靠TestNG將參數傳遞給測試方法&#xff0c;以便為我的測試或套件提供一些靈活性。 但是&#xff0c;使用JUnit4可以實現相同的靈活性。 要使用它很簡單&#xff1a; package com.marco.test;import java.util.Arrays;import java.util.Collection;import junit.fram…

楊杰matlab神經網絡30例,MATLAB神經網絡30例

實例1 BP神經網絡在非線性函數擬合中的應用11.1 理論基礎11.1.1 BP網絡概述11.1.2 BP神經網絡的MATLAB函數21.2 非線性函數擬合方法6實例2 主元BP神經網絡在股票價格預測中的應用122.1 理論基礎122.1.1 主成分分析的原理122.1.2 主元神經網絡與股票預測142.2 股票價格的預測方法…

HTMLCSS 問題

1.子div使用浮動&#xff0c;父div高度自適應(個人感覺好用) 方法&#xff1a; css: <style> .clear{ clear:both} </style> html&#xff1a;在父div關閉之前添加<div class"clear"></div> 本文轉載于:猿2048?https://www.mk2048.com/…

python matplotlib數據可視化教程_matplotlib的Python數據可視化和探索——入門指南

matplotlib——最受歡迎的Python庫&#xff0c;用于數據可視化和探索我喜歡在Python中使用matplotlib。這是我學會掌握的第一個可視化庫&#xff0c;此后一直存在。matplotlib是最受歡迎的用于數據可視化和探索的Python庫&#xff0c;這是有原因的——它提供的靈活性和敏捷性是…

mysql 查詢所有子節點的相關數據

定義一個函數 CREATE DEFINERrootlocalhost FUNCTION getColumnChildLst(rootId INT) RETURNS varchar(1000) CHARSET utf8 BEGINDECLARE sTemp VARCHAR(1000);DECLARE sTempChd VARCHAR(1000);SET sTemp $;SET sTempChd cast(rootId as CHAR);WHILE sTempChd is not null DOS…

怎么用PHP實現年月日date,PHP date函數用法,php年月日寫法

日期和時間信息在 PHP 內部是以 64 位數字存儲的&#xff0c; 它可以覆蓋當前時間前后 2920 億年的時間&#xff0c;這個范圍之廣&#xff0c;足以滿足現有應用的實際需求。需要注意的是&#xff0c; 這些PHP時間函數都是依賴服務器的區域設置的&#xff0c; 所以在使用它們的時…

python氣象衛星云圖解析_【我教你系列】想要實時的地球圖像作為桌面?

Python 定時獲取衛星圖像做為桌面背景簡介這兩天看新聞的時候&#xff0c;突然發現最近有個臺風產生&#xff0c;并且在不斷的增強中。幸運的是從中央氣象臺預報的路徑來看&#xff0c;不會登陸我國。也正是通過這則新聞&#xff0c;我發現了一個不錯的衛星云圖網站。(ps:這篇文…

CSS權重的比較方法

CSS的權重如下&#xff1a; !important Infinity正無窮 行間樣式 1000 id 100 class|屬性|唯類 10 標簽|偽元素 1 通配符 0 256進制 當出現多個選擇器時 在同一行的選擇器權重相加即可 當兩個混合選擇器權重相同時優先選擇后面的選擇器 如&#xff1a; html <…

python_day8 面向對象常用 補充

__str__ 作用本來 打印 類對象是 打印的內存地址 但是在類中 增加 __str__ 參數 以后 再打印這個 類對象 就是顯示 __str__中的 return __del__作用 當 實例化的對象 在內存中 被釋放的時候執行 item操作通過 set get del 操作 item最終目的是將 類里面的 變量 像 字典一樣操作…

Spring中的@Cacheable開銷

Spring 3.1引入了很棒的緩存抽象層 。 最后&#xff0c;我們可以放棄所有本地化的方面&#xff0c;裝飾器和污染我們與緩存相關的業務邏輯的代碼。 從那時起&#xff0c;我們可以簡單地注釋重量級方法&#xff0c;并讓Spring和AOP機械完成工作&#xff1a; Cacheable("bo…

電工接線模擬仿真軟件_VERICUT數控加工仿真軟件,最強的數控加工模擬軟件,你知道么?...

VERICUT數控加工仿真軟件,最強的數控加工模擬軟件VERICUT軟件及功能簡介1、VERICUT軟件簡介VERICUT是美國CGTech公司開發一款專業的數控加工仿真軟件&#xff0c;是當前全球數控加工程序驗證、機床模擬、工藝程序優化軟件領域的領導者。該軟件自1988年開始推向市場以來&#xf…

php數據庫創建文件失敗怎么回事,安裝zblogPHP提示“創建c_option.php失敗”解決方法...

有zblog用戶反應在安裝zblog的最后一步時提示“創建c_option.php失敗”&#xff0c;如下圖&#xff1a;本文來說明下這個問題的原因和解決辦法。問題產生的原因&#xff1a;c_option.php是zblog的數據庫配置文件&#xff0c;當安裝完成的時候程序會自動創建這個文件。如果你的主…

一次搞清楚Mysql聯合索引,以及聯合索引究竟用了多少

一群DBA朋友聊天&#xff0c;突然拋出一個某公司聯合索引的面試題&#xff0c;當時好多人都蒙了&#xff0c;這次針對這個問題&#xff0c;做了個簡單的實驗&#xff0c;把聯合索引的作用一次搞清楚 問題大概是這樣的&#xff0c;聯合索引&#xff08;a,b,c,d&#xff09;下面這…

CSS Variables

CSS原生變量(CSS自定義屬性) 示例地址&#xff1a;https://github.com/ccyinghua/Css-Variables 一、css原生變量的基礎用法 變量聲明使用兩根連詞線"--"表示變量&#xff0c;"$color"是屬于Sass的語法&#xff0c;"color"是屬于Less的語法&a…

【基礎中的基礎】引用類型和值類型,以及引用傳遞和值傳遞

一直在博客園懟人&#xff0c;非常慚愧。所以鄭重決定&#xff1a; 好好寫一篇干貨&#xff0c;然后再接著懟人。 這是一起幫上陳百萬同學的求助&#xff0c;講了一會之后&#xff0c;我覺得很有些普世價值&#xff0c;干脆就發到園子來。面向小白&#xff0c;高手輕拍。 我們從…

Java 7:使用NIO.2進行文件過濾–第3部分

大家好。 這是使用NIO.2系列進行文件過濾的第3部分。 對于那些尚未閱讀第1 部分或第2部分的人 &#xff0c;這里有個回顧。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以執行與java.io相同的操作&#xff0c;以及許多出色的功能&#xf…