精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

yellow在线观看网址| 国产真实的和子乱拍在线观看| 日本美女一区| 国产精品拍天天在线| 99在线观看视频| 国产午夜精品久久久久| 91亚洲一区| 亚洲国产精品va在线| 免费看a级黄色片| 亚洲丝袜精品| 久久精品男人的天堂| 91免费版网站入口| 五月天综合激情网| 亚洲男女av一区二区| 亚洲精品少妇网址| 91人妻一区二区三区| 成人免费网站视频| 一区二区三区视频在线看| 欧美福利精品| www久久久久久| 美腿丝袜亚洲一区| 9.1国产丝袜在线观看| 搜索黄色一级片| 久久99高清| 欧美精品一区二区在线播放| 午夜免费看视频| a一区二区三区| 亚洲自拍偷拍网站| 亚洲一区二三| 国产私拍精品| 91影院在线免费观看| 亚洲一区二区三区香蕉| 中文文字幕一区二区三三| 日韩网站在线| 欧美激情一区二区三区在线视频观看 | 欧美日韩国产精品综合| 北条麻妃国产九九九精品小说 | 国产精品无码在线| 成人在线视频区| 欧美日韩精品久久久| 免费观看精品视频| 国产乱码精品一区二三赶尸艳谈| 一区二区三区日韩欧美| 国产高潮呻吟久久久| 日本最新在线视频| 中文字幕精品综合| 神马影院一区二区| 欧美色视频免费| 久久影院午夜片一区| 国产精品一 二 三| 亚洲国产欧美另类| 成人av午夜影院| 国内视频一区二区| 日韩av资源| 久久久久久久久99精品| 欧美日韩另类丝袜其他| 国产特黄在线| 国产精品美女久久福利网站| 亚洲高清视频一区二区| wwwxxx在线观看| 国产精品国产三级国产普通话三级 | 亚洲色图欧美视频| 91亚洲男人天堂| 欧美国产综合视频| www.黄在线观看| 中文字幕制服丝袜一区二区三区 | 国产66精品久久久久999小说| 91 中文字幕| 国产一区二区影院| 翡翠波斯猫1977年美国| 丝袜视频国产在线播放| 国产欧美日韩在线| 亚洲精品偷拍视频| 久久av色综合| 日韩欧美综合在线视频| 午夜久久久精品| 视频一区在线| 日韩精品中文字幕在线观看| 欧美 日韩 成人| 婷婷丁香综合| 国内精品视频久久| 日韩精品一区不卡| 激情综合色综合久久| 国产精品国色综合久久| 可以直接在线观看的av| 中文字幕亚洲一区二区av在线| 91麻豆天美传媒在线| 成人免费观看在线观看| 色就色 综合激情| 国产精品999.| 亚洲人和日本人hd| 久久这里有精品| aaa人片在线| 久久国产精品无码网站| 国产精品.com| jyzzz在线观看视频| 一区二区激情小说| av丝袜天堂网| 日韩精品成人在线观看| 日韩精品视频在线播放| 国产成人免费在线观看视频| 国产综合色产| 国产欧美精品在线| 亚洲 另类 春色 国产| 中文字幕在线观看一区| 狠狠97人人婷婷五月| 中文字幕综合| 亚洲片国产一区一级在线观看| 69av视频在线| 男男视频亚洲欧美| 久久久久久国产精品mv| caoporm免费视频在线| 日本黄色一区二区| 人妻换人妻a片爽麻豆| 日韩激情免费| 4438全国成人免费| 亚洲福利在线观看视频| 国产精品亲子伦对白| 97成人在线观看视频| 亚洲综合影院| 欧美成人精品在线视频| 又色又爽又黄无遮挡的免费视频| 26uuu色噜噜精品一区二区| 黄色录像特级片| 欧美成a人片免费观看久久五月天| 亚洲精品久久久久久久久久久久久| 免费在线观看h片| 日韩高清在线电影| 麻豆视频成人| 九九精品调教| 正在播放亚洲一区| 战狼4完整免费观看在线播放版| 国产精品久久久久久模特| 高清视频在线观看一区| 色呦呦在线视频| 日韩视频国产视频| 国产天堂av在线| 久久超级碰视频| 伊甸园精品99久久久久久| 天堂久久午夜av| 亚洲性69xxxbbb| 日本黄色一级视频| 国产午夜精品一区二区三区视频 | 国产精品99久久久久久董美香| 亚洲欧洲中文天堂| 欧美一区免费看| 久久久精品影视| 日本男人操女人| 精品盗摄女厕tp美女嘘嘘| 日韩美女av在线免费观看| 深夜福利在线观看直播| 动漫精品一区二区| 成人乱码一区二区三区av| 亚洲欧美日韩在线观看a三区 | 色综合狠狠操| 91精品在线播放| av毛片在线免费看| 日韩精品专区在线影院观看| 国产五月天婷婷| 99久久综合国产精品| 国产中文字幕在线免费观看| 特黄特色欧美大片| 国产成人精品a视频一区www| 91在线视频免费看| 91精品国产综合久久精品图片 | 在线视频免费在线观看一区二区| 精品免费一区二区三区蜜桃| 成人爱爱网址| 中文字幕在线亚洲| aaa一区二区| 午夜视频在线观看一区| 女人又爽又黄免费女仆| 另类成人小视频在线| 超碰10000| 精品五月天堂| 国产精品电影网站| 成人av黄色| 日韩av网站导航| 中文字幕有码视频| 一区二区三区四区不卡在线| 亚洲av无码国产精品久久| 男男视频亚洲欧美| 免费在线黄网站| 国产一区二区观看| 亚洲自拍在线观看| 欧美成人黑人| 欧美成人免费一级人片100| 天天干天天舔天天射| 欧美在线观看你懂的| 国产盗摄x88av| 久久久www成人免费无遮挡大片| 午夜不卡福利视频| 亚洲永久字幕| 公共露出暴露狂另类av| 亚洲传媒在线| 91免费在线观看网站| 美女18一级毛片一品久道久久综合| 久青草国产97香蕉在线视频| 午夜性色福利影院| 91精品欧美福利在线观看| 黄网在线观看视频| 亚洲精品视频免费观看| 亚洲综合网在线观看| 粉嫩一区二区三区在线看| 牛夜精品久久久久久久| 日韩午夜在线| 9l视频自拍9l视频自拍| 色综合综合色| 国产一区二区三区无遮挡| 午夜不卡一区| 日韩**中文字幕毛片| 牛牛精品在线| 久久精品国产免费观看| 国产中文字幕在线观看| 亚洲成人激情在线| av网站在线观看免费| 欧美亚洲国产一区二区三区| 男女视频免费看| 亚洲综合网站在线观看| 永久免费看片直接| 久久久久9999亚洲精品| 色天使在线视频| 成人午夜私人影院| 亚洲在线观看网站| 欧美a级一区二区| 人妻内射一区二区在线视频| 国产综合激情| 丁香婷婷综合激情| 欧美粗暴jizz性欧美20| 亚洲一区二区精品在线| 国产精品自拍区| 欧美日韩一区二区视频在线| 男人的天堂久久| 国产伦精品一区二区三区免| 亚洲天堂av资源在线观看| 91久久久久久| 国产亚洲观看| 91精品久久久久久久久久久| 国产成人免费精品| 国产精品久久久久久网站| 日本美女一区| 国产精品久久久久77777| 日韩不卡视频在线观看| 国产精品a久久久久久| 日韩影片中文字幕| 国产精品扒开腿做爽爽爽视频 | 欧美无砖砖区免费| 中文字幕 国产精品| 在线观看国产91| 中文字幕福利视频| 欧美日韩一级二级| 在线观看亚洲一区二区| 欧美精品三级在线观看| 99精品国产99久久久久久97| 日韩亚洲欧美在线| 黄色三级网站在线观看| 亚洲国产精品va在看黑人| 香蕉视频免费看| 亚洲无线码在线一区观看| 国产69久久| 日韩在线视频免费观看| 免费黄色在线看| 欧美第一淫aaasss性| 久久久123| 欧美亚洲激情在线| 九九九伊在线综合永久| 91久久夜色精品国产网站| 久久69av| 久久免费看av| 日韩在线视频精品| 色呦呦网站入口| 亚洲高清资源| 99热成人精品热久久66| 久久国产麻豆精品| 美女日批在线观看| 91网站黄www| 国精产品视频一二二区| 亚洲女同一区二区| 欧美一二三区视频| 欧美三区在线视频| 欧美熟妇交换久久久久久分类| 亚洲精品自在久久| 麻豆tv在线| 97成人精品视频在线观看| 国产精品久久久久久久久免费高清| 91在线观看欧美日韩| 偷窥自拍亚洲色图精选| 亚洲一区美女| 亚洲欧洲一区二区天堂久久| 国内自拍视频网| 丰满放荡岳乱妇91ww| 成人在线手机视频| 亚洲国产综合人成综合网站| 91丨九色丨海角社区| 精品国产1区二区| 都市激情一区| 欧美精品videossex88| 免费污视频在线一区| 懂色一区二区三区av片| 日本午夜一区| 精品国产一二三四区| 韩国毛片一区二区三区| 亚洲av片不卡无码久久| 亚洲久本草在线中文字幕| 波多野结衣一区二区三区四区| 日韩美女主播在线视频一区二区三区 | 天堂va久久久噜噜噜久久va| 伊人久久综合| 91插插插影院| 久久久精品综合| 日韩精品一区二区在线播放| 欧美一区二区三区公司| 999国产在线视频| 欧美亚洲国产日韩2020| 北条麻妃一区二区三区在线观看| 特级西西444www大精品视频| 在线视频日韩| 午夜不卡久久精品无码免费| 亚洲欧美日韩国产手机在线| 中国一级片黄色一级片黄| 亚洲精品久久久久久久久久久 | 国产成人高清激情视频在线观看| 99久久人爽人人添人人澡| 永久久久久久| 日韩 欧美一区二区三区| 日韩精品卡通动漫网站| 天天射综合影视| www精品国产| 欧美精品免费在线| 色综合久久久| 一道精品一区二区三区| 秋霞午夜av一区二区三区| 丰满少妇一区二区| 欧美日韩国产精品一区二区三区四区 | 极品一区美女高清| 成人免费在线视频播放| 国产伦理精品不卡| 国产一区二区三区在线视频观看| 欧美精品一二三区| 欧美一级二级三级区| 成人中文字幕在线观看| 国产精品99视频| 91欧美一区二区三区| 亚洲伦在线观看| av综合在线观看| 久久99久久99精品免观看粉嫩 | 手机看片久久| 欧美日韩综合久久| 日本欧美一区二区在线观看| 亚洲色图欧美色| 欧美丰满少妇xxxxx高潮对白| 嫩草在线视频| 97se亚洲综合| 99热免费精品| 国产肥白大熟妇bbbb视频| 一本色道久久加勒比精品 | 99久久精品国产色欲| 欧美精品中文字幕一区| 超碰97久久| 亚洲自偷自拍熟女另类| 国产亚洲成aⅴ人片在线观看 | 国产97免费视频| 日韩视频免费直播| 国内精彩免费自拍视频在线观看网址| 久久久久无码国产精品一区| 老牛影视一区二区三区| 538精品视频| 91精品国产综合久久精品 | 亚洲国产精品久久一线不卡| 午夜福利理论片在线观看| 国产91在线播放九色快色| 色婷婷一区二区三区| 欧美性受xxxx黒人xyx性爽| 亚洲一级在线观看| 国产在线一二| 91中文精品字幕在线视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美怡春院一区二区三区| 国产精品免费99久久久| 交换做爰国语对白| 精品免费在线视频| 国产高清视频在线观看| 亚洲精品女av网站| 国产毛片一区| 亚洲av无码一区二区三区在线| 亚洲成人久久一区| 成人在线网站| www插插插无码视频网站 | 亚洲国产另类久久久精品极度| 国产伦理精品不卡| www.久久精品视频| 欧美成人免费一级人片100| 亚洲成人一品| 免费观看污网站| 欧美午夜精品一区| 波多野结衣在线观看| 亚洲资源视频| 久久一日本道色综合| 亚洲国产av一区二区| 国产精品青青在线观看爽香蕉|