成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

?軟件系統的復雜性、耦合度和內聚性

系統
我們編寫的軟件由服務、進程、文件、類、過程等組成 — 這些模塊隱藏了我們無法抗拒的一堆位和片段。讓我們思考一下。

我們遇到的任何軟件系統很可能都過于復雜,一次無法完全理解 — 人類的思維無法理解大量實體及其關系。我們傾向于通過建立抽象來簡化現實:一旦我們將許多閃亮的金屬、玻璃和橡膠定義為“汽車”,我們就可以談論“高速公路”、“停車場”和“乘客” — 我們生活在我們創造的抽象世界中。同樣,我們編寫的軟件由服務、進程、文件、類、過程等組成 — 這些模塊隱藏了我們無法抗拒的一堆位和片段。讓我們思考一下。

概念與復雜性

任何系統都包括 概念 — 以其他概念為基礎定義的概念。例如,如果你正在實現一個電話簿,你會處理 名 和 姓、號碼、排序 和 搜索,這些概念是任何與電話簿相關的開發任務中必須牢記的 — 只因為電話簿的需求是用這些概念及其關系描述的。

在代碼中,高級概念被體現為服務、模塊或目錄,而較低級的概念則對應于類、API 方法或源文件。

概念很重要,因為它們的數量(或相應類和方法的數量)定義了系統的 復雜性 — 開發人員面對的認知負荷。如果程序員詳細了解他們正在處理的組件的行為,他們往往會變得極其高效,并且通常能夠為看似復雜的任務找到簡單的解決方案。否則,開發速度會很慢,并且需要進行大量測試,因為人們不確定他們的更改會如何影響系統的行為。

圖1:復雜性與實體數量相關

模塊、封裝和有界上下文

讓我們回到我們的例子。當你實現電話簿時,你會發現排序和搜索比你最初想象的要復雜得多。一旦你準備進入國際市場,你就會陷入深深的困境。一些電話服務提供商發送7位數字,其他人使用10位數字,還有些人使用13位數字(第一個字符為“+”或“0”)。德語有“?”,它與“ss”相同,而日語同時使用兩種字母表。一旦你開始閱讀標準,實現所有奇怪的行為并回應用戶投訴,你會感到你的電話簿實現淹沒在充滿特殊情況的外語字母表的無關邏輯中。你需要 封裝。

引入 模塊。模塊封裝了幾個概念,有效地將它們隱藏在外部用戶之外,并暴露了其內容的簡化視圖。引入模塊將復雜的系統分成了幾個通常更簡單的部分。

圖2:將系統劃分為模塊,突出顯示有界上下文

該圖有幾個值得注意的地方:

  • 模塊為其 公共API 創建了新的概念。
  • API 入口點增加了 擁有者模塊 和其客戶的復雜性。
  • 系統中的概念總數已增加(從18個到22個),但系統中最高復雜度已下降(從18到15)。

在這里,我們看到引入模塊如何將分而治之的方法應用于減少在系統的任何部分上工作時的認知負荷,以較小的總工作量為代價。

在我們的電話簿示例中,與地區相關的字符串比較和聯系人姓名的字母排序的特殊性(包括大小寫敏感性)應該更好地保留在一個簡單的字符串比較接口之后,以解除電話簿引擎程序員對支持外語的復雜性的負擔。

模塊代表 有界上下文 [DDD] — 系統知識的領域,這些領域操作不同的術語集。對于電話簿來說,整理 和 大小寫敏感性 對于電話簿引擎并不重要 — 它們只在語言支持的上下文中定義。另一方面,通過號碼匹配聯系人 在語言支持模塊中并未定義 — 該術語僅存在于電話簿引擎中。程序員所面臨的是當前有界上下文的復雜性。

除了將問題分解為較簡單的子問題外,模塊還帶來了一些額外的好處:

  • 代碼重用。一個良好編寫的模塊可以在多個項目中使用。
  • 勞動分工。一旦系統被拆分為模塊,并且每個模塊都被分配給一個程序員,開發就會被高效地并行化。
  • 高級概念。有些情況允許將原始問題的幾個概念合并為更高級的聚合,進一步降低復雜性:

圖3:合并了綠色模塊的兩個API概念

例如,電話簿的原始定義包含 名 和 姓。一旦我們將語言支持分離到一個專用模塊中,我們可能會發現各種地區在表示聯系人時有所不同:一些(美國)使用“名 + 姓”,而其他一些(日本)則需要“姓 + 名”。如果我們想要擺脫這個細節,我們應該使用一個新的 全名 概念,它以特定于區域的方式連接名和姓。這樣的改變實際上簡化了電話簿的某些表示邏輯和代碼,因為它用一個概念替換了兩個概念。

耦合度和內聚性

為了有效使用模塊,我們需要學習一些新的概念:

  • 耦合度 是模塊之間連接數量(密度)的度量,相對于模塊的大小。
  • 內聚性 是模塊內連接數量(密度)的度量,相對于模塊的大小。

經驗法則是要追求 低耦合和高內聚,這意味著每個模塊應該封裝一組相關(密切交互)的概念。這就是我們在圖2和圖3中將系統劃分為的方式。現在讓我們看看如果我們違反規則會發生什么:

圖4:上部模塊耦合度高

拆分一個內聚模塊(一組相互交互的概念),會產生兩個強耦合的模塊。這正是我們想要的,只是每個新模塊幾乎與原始模塊一樣復雜。也就是說,我們現在面臨兩個艱巨的任務,而不是一個。此外,系統的性能可能很差,因為模塊之間的通信很少是最佳的,而我們卻有太多這樣的通信。

圖5:下部模塊內聚性低

如果我們將幾個概念集聚在同一個模塊中會發生什么?對于小模塊來說,不會發生什么太糟糕的事 — 模塊的復雜性高于其各個部分,但低于它們的總和。實際上,多個無關的函數通常被收集到一個‘utils’或‘tools’文件或目錄中,以減輕 操作復雜性。

開發與操作復雜性

我們上面討論的是 結構性 或 開發復雜性 —— 有界上下文內部的概念和規則的數量。然而,我們還需要理解系統作為一個整體的操作和組件,從而導致 操作 或 集成復雜性:

  • 這個新需求是否適合現有模塊,還是需要一個專用模塊?
  • 我們使用了哪些存在已知安全漏洞的庫?
  • 有沒有辦法減少我們的云服務成本?
  • 1% 的請求超時了。你能調查一下嗎?
  • 我的團隊需要實現這個和那個。我們有適合重用的東西嗎?
  • 那個全局變量到底是干什么的?
  • 我們真的需要將這段代碼投入生產嗎?
  • 我需要稍微改變一下那個共享組件的行為。有什么意見嗎?

當部署了數百或數千個模塊時,沒有人知道答案。這類似于需要在 Linux 下執行某些操作的情況:已預安裝了數百個工具,數千個其他工具則作為軟件包可用,但唯一的前進方式是首先在搜索引擎中搜索您的需求,然后嘗試搜索結果中的兩三種方法,看哪種適合您的設置。不幸的是,谷歌并不索引您公司的代碼。

模塊的組合

一個模塊不僅可以封裝單個概念,還可以封裝其他模塊。這并不奇怪,因為 OOP 類是一種模塊 — 它具有公共方法和私有成員。將一個模塊隱藏在另一個模塊中會將其從全局范圍中刪除,減少了系統的操作復雜性 — 現在不再是系統的架構師,而是外部模塊的維護者必須記住內部模塊。一方面,在組織和代碼中建立了可管理的層次結構。另一方面,代碼重用和許多優化幾乎不可能實現,因為內部模塊在整個組織中幾乎不為人知:

圖6:模塊的組合阻止了重用

如果我們的內部模塊的功能被我們的客戶需要,我們有兩個不好的選擇:

轉發和重復

圖7:轉發內部模塊的API

我們可以將我們封裝的模塊的API添加到我們的公共API中,并將其調用轉發到內部模塊。然而,這會增加我們模塊的復雜性,并降低我們模塊的內聚性 — 現在我們模塊的每個客戶都暴露于我們封裝的模塊的方法的細節中,即使他們并不打算使用它。

圖8:重復內部模塊

另一個不好的選擇是讓需要我們封裝的模塊的客戶復制它并擁有副本作為自己的子模塊。這使我們擺脫了任何共同的責任,讓我們可以任意修改和誤用我們的內部,并違反了常識的一對 規則。

這兩種方法,即將所有模塊保留在全局范圍內和通過組合封裝實用模塊,都在歷史上找到了它們的位置[FSA]。面向服務的架構 基于重用的想法,但卻成了其 企業服務總線 的復雜性的犧牲品,該總線必須考慮系統中的所有交互(API 方法)。作為反應,微服務 方法把潮流轉向了相反的方向:其支持者不允許在服務之間共享任何資源或代碼,以確保它們的解耦。

責任編輯:趙寧寧 來源: 小技術君
相關推薦

2015-01-14 09:57:29

阿里云異構系統分布式消息

2023-10-06 12:08:53

Java代碼

2017-06-23 08:45:02

存儲技術復雜性

2021-02-22 10:27:30

網絡軟件多云網絡復雜性

2013-11-01 13:38:41

程序員編程語言

2012-09-19 13:18:37

復雜設計UI設計

2012-12-26 10:53:26

2019-05-13 15:47:29

Kubernetes云計算云復雜性

2009-01-20 15:23:33

存儲安全密鑰數據保護

2014-08-21 08:54:03

2024-06-07 00:08:00

分布式系統開發

2012-08-08 11:04:39

網管軟件惠普云管理

2019-08-21 13:24:25

KubernetesHadoop容器

2020-06-15 09:58:23

云計算云安全數據

2022-10-21 14:49:41

AI系統

2019-07-29 12:35:15

云計算復雜性云計算平臺

2019-11-23 23:30:55

Python數據結構時間復雜性

2020-03-24 09:52:34

大數據IT技術

2019-03-18 09:00:04

Linux密碼cracklib

2022-03-09 10:51:19

云安全網絡安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女黄色在线观看 | 人人干视频在线 | 一区二区在线免费观看视频 | 成人免费网视频 | 狠狠操操| 免费av电影网站 | 午夜免费 | 一区二区三区高清 | 亚洲国产免费 | 全免费a级毛片免费看视频免费下 | 国产精品99久久久久久人 | 欧美日韩一区二区在线 | 国产精品永久免费视频 | 婷婷国产一区 | 一本色道久久综合亚洲精品高清 | 国产精品呻吟久久av凹凸 | 欧美精品日韩精品 | 日韩精品一区二区三区在线播放 | 天天操天天干天天爽 | 五月婷六月丁香 | 亚洲国产精品精华素 | 欧美视频在线看 | 精精精精xxxx免费视频 | 毛片免费视频 | 黄色91在线 | 国产精品久久久久久久久久久新郎 | 欧美国产视频一区二区 | aaa国产大片 | 欧美日韩视频一区二区 | 一级在线免费观看 | 日日草夜夜草 | 久久免费看 | 久久精品国产一区老色匹 | 国产精品欧美一区二区三区 | 欧美综合一区 | 国产一级电影在线 | 7777奇米影视| 精品视频一区二区 | 特a毛片| 97精品超碰一区二区三区 | 91社区视频|