精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

軟件架構編年史:包和命名空間

開發 架構
一個系統的架構是它的高層級的視圖,是系統的大局觀,是粗線條的系統設計。架構的決策就是系統結構上的決策,這些決策影響著全部代碼,決定了系統中其它部分的基礎。

[[397015]]

本文轉載自微信公眾號「逸言」,作者覃宇 。轉載本文請聯系逸言公眾號。  

 一個系統的架構是它的高層級的視圖,是系統的大局觀,是粗線條的系統設計。架構的決策就是系統結構上的決策,這些決策影響著全部代碼,決定了系統中其它部分的基礎。

除了其它用處以外,架構決定了系統的:

  • 組件
  • 組件之間的關系
  • 指導對組件以及及其之間關系進行設計和演進的原則

換句話說,這些設計決策在系統演進的過程中更難改變,它們是支撐特性開發的基礎。

意大利面架構

我參與的有些項目結構完全是隨意的,又不能體現架構也不能反映領域。如果我的問題是“這個值對象應該放在哪里?”,答案就是“隨便放在 src 目錄里就好了”。如果我的問題是“完成這個邏輯的服務在哪里”,答案是“用 IDE 搜索吧”。這意味著完全沒有思考該如何組織代碼。

這里的隱患很大,因為完全沒有使用包來實現模塊化,高級別的代碼關系和流向完全不遵守任何邏輯結構,將導致高耦合低內聚的模塊,實際上可能根本就沒有模塊劃分,本來應該屬于某個模塊的代碼散落在整個代碼庫中。這樣的代碼庫就是所謂的意大利面代碼,或者是意大利面架構!

可維護的代碼庫

擁有可維護的代碼庫意味著我們能以最小的代碼修改獲得最大的概念變化。換句話說,如果我們需要修改一個代碼單元,其它代碼單元的修改應該盡可能地少。

這帶來了明顯的優勢:

  • 因為影響的代碼少,修改會更容易;
  • 因為影響的代碼少,修改會更快;
  • 因為修改的代碼少,出現問題的幾率會降低;

封裝 、低耦合和高內聚是保持代碼隔離的核心原則,使可維護的代碼庫成為可能。

封裝

封裝是隱藏一個類的內部表示和實現的過程。

也就是說,實現被隱藏了,這樣類的內部結構可以隨意的改變,而不會影響使用這個類的其它類的實現。

低耦合

耦合涉及代碼單元之間的關系。如果一個模塊的修改會導致另一個模塊的修改,我們就說這兩個模塊高度耦合。如果一個模塊可以獨立于其它任何模塊,我們就說它是松耦合的。通過提供穩定的接口來有效地對其它模塊隱藏實現,可以達成松耦合的目標。

低耦合的優點

  • 可維護性 - 修改被限制在一個模塊中
  • 可測試性 - 單元測試涉及的模塊盡可能地少
  • 可讀性 - 需要仔細分析的類盡可能地少

高內聚

內聚指的是對模塊內的功能相關性有多強的度量。低內聚指的是模塊擁有一些不同的不相關的職責。高內聚指的是模塊所擁有的功能在許多方面很相似。

高內聚的優點

  • 可讀性 - (緊密) 相關的功能包含在一個模塊中
  • 可維護性 - 只用在一個模塊內調試代碼
  • 可重用 - 類的功能十分聚焦,不會充斥許多無用的函數

對結構的影響

上述這些原則適用于類,然而,它們一樣適用于類的組合。類的組合通常被叫做包,但我們可以分得更細一些,如果分組是出于純粹功能方面的考慮(如ORM)我們會稱之為模塊,如果是出于領域方面的考慮(如AccountManagement)則稱之為組件。這些定義與 Bass、Clements 和 Kazman 在他們的著作 Software Architecture in Practice 里的描述一致。

我們能夠并且應該讓包做到高內聚和低耦合,因為這樣我們才能做到:

  • 修改一個包而不會影響其它的包,減少出現的問題;
  • 修改一個包而不需要修改其它的包,加快交付的節奏;
  • 讓團隊專注于特定的包,帶來更快、更健壯和設計更優的變化;
  • 團隊開發活動之間的依賴和沖突更少,提升產能。
  • 更仔細地斟酌組件之間的關系,讓我們更好地將應用作為一個整體建模 ,交付質量更高的系統。

概念封裝

我覺得如果我們的項目結構能以某種方式既體現出架構也體現出領域的話,我們的代碼庫的可維護性可以得到極大地提升。實際上現在我敢篤定這也是唯一可行的方式(當我們面對大中型企業應用時)。

代碼庫如果組織得當,特定代碼單元只有一處位置可供它存放。我們可能并不知道到具體的位置,但一定只有一條邏輯路徑可以讓我們順藤摸瓜找到它。

包的定義

將類劃分成包可以讓我們在更高的抽象級別來思考設計。其目標是將你的應用中的類按照某種條件進行分片,然后將這些分片分配到包中。這些包之間的關系表達出了應用高級別的組織方式。—— Robert C. Martin 1996, Granularity pp. 3

將概念上相關的代碼定義成包,我們需要達成的目標。這些包十分重要,因為它們定義了概念上相關且獨立于其它包的代碼單元,還有這些包之間的關系。

這樣做的目的是:

  • 理解代碼單元之間的關系
  • 維護代碼單元之間的邏輯關系
  • 實現高內聚低耦合的代碼包
  • 在不影響/極少影響應用的情況下重構代碼包
  • 在不影響/極少影響應用的情況下替換代碼包的實現

分包的原則

我們要遵循 Robert C. Martin 在 1996 年和 1997 年提出的包劃分原則以及其他的一些原則來達成目標,主要有 CCP (Common Closure Principle,共同封閉原則), the CRP (Common Reuse Principle,共同重用原則) 和 SDP (Stable Dependencies Principle,穩定依賴原則)。

Robert C. Martin 提出的包劃分原則:

包內聚原則

  • REP – 重用發布等價原則:重用的粒度等價于發布的粒度
  • CCP – 共同封閉原則:一起被修改的類應該放在一個包里
  • CRP – 共同重用原則:一起被重用的類應該放在一個包里

包耦合原則

  • ADP – 無環依賴原則:包的依賴圖中不能出現循環
  • SDP – 穩定依賴原則:依賴應該朝著穩定的方向前進
  • SAP – 穩定抽象原則:抽象的級別越高,穩定性就越高

要想合理地運用 SDP,我們應該定義出代碼的概念單元(組件)和組件的分層,這樣我們才能搞清楚那些組件應該了解(依賴)其它組件。

然而,如果這些組件的邊界不夠清晰,我們就會把本該互不相干的代碼代碼單元混在一起,讓它們耦合在一起變成意大利面式代碼,最后將無法維護。

要讓這些邊界能清楚地呈現出來,我們需要把概念上相關的類放在同一個包中,就像我們把概念上相關的方法放在同一個類中一樣。在包這個級別,我們只能用一些名字在領域中有一定含義(例如,UserManagement、Orders、Payments 等)的文件夾來區分它們。在最底層的級別,即包內的葉子節點,我們才會在必要時按照功能作用區分類(例如,Entity、Factory、Repository 等)。

下面這個問題可以幫助我們反思如何設計出低耦合的組件:

“如果我想去掉一個業務概念,是不是刪除掉它的組件根目錄就能把這個業務概念的所有代碼刪除而且應用的剩余部分還不會被破壞?”

如果答案是肯定的,那么我們就有了一個解耦得不錯的組件。

例如,在命令總線架構中,命令和處理器離開對方就無法工作,它們在概念上和功能上都綁定在一起,因此,如果我們需要去掉該邏輯就要將它們一起去掉。如果它們在同一個位置,我們只用刪除一個文件夾就好(我們并非真的要刪除代碼,只是借助這種思維方式來幫我們得到解耦和內聚的代碼)。所以,遵循 CCP 和 CRP 原則,命令應該和它的處理器放在同一個文件夾中。

任何代碼只能存在于一個邏輯上的位置,即使對項目中的新手和初級開發者來說,這個位置也是十分明了的。這能避免自相矛盾、令人費解、重復的代碼和開發者的挫敗感。如果因為無法在代碼本該在的位置找到它,和/或難以理解哪些代碼和手頭上正在處理的代碼有關,而導致我們需要去搜尋這些代碼...那么我們的項目結構就很糟糕,甚至是更壞的情況,架構很糟糕。

尖叫架構

尖叫架構是 Robert C. Martin 的想法,它基本上表明了這樣一個觀點,架構應該清楚地告訴我們系統是做什么的:即它的主要領域。那么源代碼文件夾里出現的第一級目錄自然就應該和領域概念有關,即最頂層的限界上下文(例如,患者、醫生、預約等)。它們應該和系統使用的工具(例如,Doctrine、MySQL、Symfony、Redis 等)無關,和系統的功能塊(例如,資源庫、制圖、控制器等)無關,和傳達機制無關(HTTP、控制臺等)。

你的架構應該呈現給人的應該是系統,而不是系統使用的框架。如果你構建的是一個醫療保健系統,那么新程序員看到源代碼倉庫后的第一映像應該是:“哦,這是一個醫療保健系統”。—— Robert C. Martin 2011, Screaming Architecture

這實際上是一種更簡單地理解他十五年前發表的包劃分原則的方法,這些原則之前我已經闡述過了。這種分包的風格又叫做“按特性分包”。

延伸閱讀

  • 2008 – Johannes Brodwall – Package by feature
  • 2012 -Johannes Brodwall – How Changing Java Package Names Transformed my System Architecture
  • 2012 – sivaprasadreddy.k – Is package by feature approach good?
  • 2013 – Lahlali Issam – Lessons to Learn from the Hibernate Core Implementation
  • 2013 – Manu Pk – Package your classes by Feature and not by Layers
  • 2015 – Simon Brown – Package by component and architecturally-aligned testing
  • 2015 – César Ferreira – Package by features, not layers
  • 2017* – javapractices.com – Package by feature, not layer

 引用來源

  • 1996 – Robert C. Martin – Granularity
  • 1997 – Robert C. Martin – Stability
  • 2009 – 500internalservererror – What do low coupling and high cohesion mean? What does the principle of encapsulation mean?
  • 2011 – Robert C. Martin – Screaming Architecture

 

[[397016]]

覃宇,Android開發者/ThoughtWorks技術教練//譯者,熱衷于探究軟件開發的方方面面,從端到云,從工具到實踐。喜歡通過翻譯來學習和分享知識,譯作有《Kotlin實戰》、《領域驅動設計精粹》、《Serverless架構:無服務器應用與AWS Lambda》和《云原生安全與DevOps保障》。

 

責任編輯:武曉燕 來源: 逸言
相關推薦

2021-03-26 07:47:18

單體架構程序

2021-06-09 08:09:05

架構軟件整潔

2021-04-12 09:48:50

MVCHTMLCSS

2012-06-11 15:29:14

OpenStack

2015-07-17 13:27:06

2011-07-20 09:19:47

SQL Server

2019-01-23 17:37:58

華為

2012-12-21 15:32:32

Linux Deepi

2014-12-12 14:55:42

移動惡意代碼移動安全

2012-03-30 11:34:52

Linux Deepi

2014-10-29 14:43:05

2014-05-20 17:26:06

2013-10-31 14:31:09

2011-08-08 09:25:55

2025-01-23 09:07:51

2023-09-06 06:46:40

顯卡接口RTX 4060

2015-12-16 10:11:14

2020-08-21 13:54:24

瀏覽器程序員內核

2009-09-22 08:14:23

2014-05-09 11:19:38

iOS移動互聯網
點贊
收藏

51CTO技術棧公眾號

亚洲女女做受ⅹxx高潮| 精品中文字幕一区二区| 亚洲欧美综合精品久久成人| 国产情侣av自拍| 欧美天天影院| 播五月开心婷婷综合| 日韩免费在线播放| 国产黄色片在线免费观看| 亚洲97av| 日韩欧美资源站| 黄色片久久久久| 18加网站在线| 国产亚洲综合在线| 成人av片网址| 亚洲图片在线播放| 日韩五码在线| 大胆欧美人体视频| 精品成人无码一区二区三区| 亚洲视频三区| 在线看不卡av| 国产人妻777人伦精品hd| 成人午夜影视| 久久这里都是精品| 成人精品一二区| 最近中文字幕在线观看| 91久久午夜| 久久在线视频在线| 亚洲第一香蕉网| 8848成人影院| 91麻豆精品国产91久久久久久久久| 欧美日韩亚洲一| 牛牛精品在线| 一区二区三区免费| 99热都是精品| 国产cdts系列另类在线观看| 国产精品毛片无遮挡高清| 久久精品日产第一区二区三区精品版| a级片免费视频| 麻豆精品一区二区av白丝在线 | 日本综合在线| 国产亚洲欧美日韩日本| 老司机精品福利在线观看| 亚洲第一色视频| 国产一区二区0| 91精品免费视频| 国产精品视频久久久久久| 日韩av在线发布| 日韩美女在线播放| 精品人妻一区二区色欲产成人| 在线观看一区| 69av视频在线播放| 国产一级淫片a| 在线播放一区| 97精品国产97久久久久久免费| 国产无码精品在线观看| 日韩午夜黄色| 欧美亚洲另类视频| 亚洲欧美综合另类| 久久久久国产精品一区二区| 青青久久av北条麻妃海外网| 亚洲婷婷综合网| 日本不卡免费在线视频| 国产精品欧美亚洲777777| 中文字幕 人妻熟女| 奇米精品一区二区三区四区| 国产精品中文久久久久久久| 中文字幕在线播放日韩| 久草中文综合在线| www日韩av| 天堂av资源在线| 久久日韩精品一区二区五区| 日韩精品欧美专区| 3d成人动漫在线| 亚洲精品视频在线观看免费| 全黄性性激高免费视频| 日韩av中字| 欧美裸体bbwbbwbbw| 欧美性猛交xx| 欧美有码在线| 最近更新的2019中文字幕| 国产免费一区二区三区四区| 亚洲视频久久| 日本人成精品视频在线| 97精品人妻一区二区三区在线| 国产精品主播直播| 免费国产在线精品一区二区三区| 国产污视频在线| 一区二区在线观看视频| 免费在线观看的av网站| 久久久国产精品网站| 日韩欧美高清dvd碟片| 风间由美一二三区av片| 久久久综合色| 97精品国产97久久久久久免费| 中文字幕免费视频观看| 国产精品影视网| 欧美精品久久| 午夜羞羞小视频在线观看| 日韩欧美精品网址| 香蕉视频xxxx| 精品久久成人| 午夜精品福利在线观看| 一级久久久久久久| 99re8在线精品视频免费播放| 日韩精品资源| 182在线视频观看| 欧美日韩二区三区| 97超碰在线资源| 很黄很黄激情成人| 国产综合久久久久| 九色网友自拍视频手机在线| 亚洲午夜精品在线| 国产日韩欧美久久| 亚洲欧洲色图| 欧美极品第一页| 91麻豆视频在线观看| 久久久精品国产免大香伊| 激情六月天婷婷| 日韩一级二级 | 伊人久久一区二区三区| 色综合狠狠操| 国产精品99导航| 手机看片一区二区| 亚洲午夜国产一区99re久久| 日韩高清第一页| 神马久久一区二区三区| 午夜免费日韩视频| 亚洲精品中文字幕成人片| 最新不卡av在线| 性欧美极品xxxx欧美一区二区| 日韩精选在线| 久久久久国产精品免费| 国产免费黄色录像| 国产精品久久99| 九九热在线免费| 激情综合网五月| 奇米一区二区三区四区久久| 天堂网2014av| 午夜精品福利久久久| aaa黄色大片| 午夜久久久久| 98国产高清一区| 性欧美videos高清hd4k| 日韩一区二区精品| 538精品在线观看| 国产精品18久久久久| www.-级毛片线天内射视视| 色综合一区二区日本韩国亚洲 | 免费成人美女女在线观看| 秋霞国产午夜精品免费视频| 亚洲成人午夜在线| 国产精品天堂蜜av在线播放 | 久久久成人网| 秋霞在线观看一区二区三区| 亚洲wwww| 色悠悠国产精品| 国产有码在线观看| 亚洲精选免费视频| 欧类av怡春院| 石原莉奈在线亚洲二区| 日本视频一区在线观看| jvid一区二区三区| 久久久久北条麻妃免费看| 国产av无码专区亚洲av| 亚洲一区二区三区美女| 久久久久国产精品无码免费看| 免费在线亚洲| 亚洲永久一区二区三区在线| 免费观看亚洲天堂| 性欧美办公室18xxxxhd| 男操女在线观看| 欧美绝品在线观看成人午夜影视| 538精品在线视频| 成人精品国产一区二区4080| 俄罗斯av网站| 清纯唯美日韩| av资源站久久亚洲| 在线天堂资源www在线污| 色综合影院在线| 精品国产99久久久久久宅男i| 亚洲福利一二三区| 永久免费成人代码| 国产福利一区二区| 国产男女在线观看| 婷婷色综合网| 久中文字幕一区| 青青国产精品| 欧美亚洲另类激情另类| 国产黄色在线网站| 国产丝袜精品视频| 国产高清免费观看| 色天天综合色天天久久| 99精品久久久久| 国产天堂亚洲国产碰碰| 一级黄色免费毛片| 视频一区二区中文字幕| 美女扒开大腿让男人桶| 色婷婷色综合| 精品一区二区国产| 国产一区二区三区免费观看在线| 2019中文字幕免费视频| 精品国产白色丝袜高跟鞋| 精品视频www| www.激情五月| 精品视频在线视频| 国产成人在线观看网站| 亚洲精品国产成人久久av盗摄| 欧洲女同同性吃奶| 成人教育av在线| 欧美美女性视频| 麻豆亚洲精品| 男人插女人视频在线观看| 68国产成人综合久久精品| 美乳视频一区二区| 成人三级av在线| 91免费人成网站在线观看18| 欧美黑人一区| 97色伦亚洲国产| 综合图区亚洲| y97精品国产97久久久久久| 免费在线毛片| 亚洲精品网站在线播放gif| 亚洲欧美黄色片| 3d动漫精品啪啪1区2区免费| 日批视频免费观看| 欧美午夜性色大片在线观看| 91蜜桃视频在线观看| 亚洲一区二区视频| 福利所第一导航| 日韩理论片在线| 一级免费黄色录像| 国产精品美女一区二区三区| 久久午夜福利电影| 久久久综合网站| 久久久久久久无码| a美女胸又www黄视频久久| 国产精品欧美性爱| 国产精品小仙女| 欧美xxxxxbbbbb| 国产米奇在线777精品观看| 思思久久精品视频| 精品亚洲国产成人av制服丝袜| 色噜噜狠狠一区二区| 麻豆成人91精品二区三区| 亚洲欧美另类动漫| 日本午夜一区二区| 日本激情视频在线播放| 蜜桃精品视频在线观看| 手机视频在线观看| 久久超碰97人人做人人爱| 亚洲怡红院在线| 国产在线精品一区在线观看麻豆| 日本中文字幕观看| 国产激情视频一区二区在线观看| √天堂资源在线| 国产一区二区影院| 极品白嫩少妇无套内谢| 成人h动漫精品| 国产三级国产精品| 久久久精品免费网站| 五月婷婷欧美激情| 亚洲欧洲性图库| 妺妺窝人体色www聚色窝仙踪| 一区二区三区欧美久久| 国产手机在线视频| 日本乱人伦一区| 91禁在线观看| 日韩精品一区二区三区swag| 国产77777| 日韩精品中文在线观看| 国产主播福利在线| 日韩中文字幕免费| 女囚岛在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 国产成人77亚洲精品www| 91久久极品少妇xxxxⅹ软件 | 亚洲欧洲精品一区二区| 亚洲精品97| 日韩免费视频播放| 麻豆一区二区三| 日韩无码精品一区二区| 国产色产综合产在线视频| 亚洲精品卡一卡二| 午夜影院在线观看欧美| 最新中文字幕免费| 日韩精品资源二区在线| 欧美一区二区视频| 久久五月天综合| 乡村艳史在线观看| 成人在线观看视频网站| 日韩欧美影院| 日本丰满大乳奶| 麻豆精品网站| 成人做爰69片免费| 国产精品国产三级国产普通话蜜臀 | 国产小视频在线观看免费| 亚洲国产成人精品视频| 久久国产香蕉视频| 亚洲成人精品久久久| 91xxx在线观看| 欧美在线视频一二三| 日本成人精品| 亚欧洲精品在线视频免费观看| 亚洲国产精品综合久久久| 女人另类性混交zo| 成人福利视频在线| 天海翼在线视频| 欧美主播一区二区三区美女| 亚洲精品97久久中文字幕| 日韩视频在线免费观看| 性欧美1819sex性高清| 成人在线资源网址| 午夜影院欧美| 一级黄色香蕉视频| 91在线观看污| www.youjizz.com亚洲| 69精品人人人人| 99中文字幕一区| 国产精品久久91| 神马午夜久久| 国产va亚洲va在线va| 国产老妇另类xxxxx| 99热在线观看精品| 色av成人天堂桃色av| 天天插天天干天天操| 色综合久久悠悠| 国产精品一区二区精品视频观看| 视频一区二区三区在线观看| 国产视频一区免费看| 精品人妻二区中文字幕| 亚洲码国产岛国毛片在线| 91片黄在线观看喷潮| 日日骚久久av| 农村妇女一区二区| 五月婷婷一区| 美女视频黄 久久| 最新日韩免费视频| 欧美性极品少妇| 国产在线一二| 国产精品88a∨| 成人vr资源| 美女网站视频黄色| 国产精品无码永久免费888| 探花国产精品一区二区| 中文字幕久热精品视频在线| 欧美日韩五区| 亚洲国产婷婷香蕉久久久久久99| 日韩精品每日更新| 五月婷婷欧美激情| 7777女厕盗摄久久久| 91黄色在线| 国产免费一区二区三区| 9色国产精品| 国产jk精品白丝av在线观看| 欧美曰成人黄网| 日韩子在线观看| 亚洲一区二区少妇| 在线成人国产| theav精尽人亡av| 91福利精品视频| 色的视频在线免费看| **亚洲第一综合导航网站| 国产综合精品| 欧美一区二区三区成人精品| 日本高清不卡一区| 免费网站免费进入在线| 亚洲自拍偷拍色图| 亚洲国产日韩欧美一区二区三区| yjizz视频| 在线观看视频欧美| 国产传媒在线播放| 国精产品99永久一区一区| 日本大胆欧美人术艺术动态| 国产精品久久久免费看| 精品盗摄一区二区三区| 免费日韩电影| 日韩视频在线免费播放| 成人精品鲁一区一区二区| 无码一区二区三区在线观看| 精品国产美女在线| 高清欧美性猛交xxxx黑人猛| 成人黄色片视频| 亚洲视频图片小说| 色久视频在线播放| 成人激情视频在线| 99香蕉国产精品偷在线观看 | 欧美xxxx×黑人性爽| 91久久国产综合久久| 中文字幕中文字幕在线中高清免费版 | 免费高清不卡av| 久久精品一区二区三| 亚洲国产精品国自产拍av秋霞| 在线观看精品| 国产精品www在线观看| 中文子幕无线码一区tr| 国精产品一品二品国精品69xx| 国产精品一二三在线| 日韩一级在线| 全网免费在线播放视频入口| 亚洲欧美一区二区精品久久久|