在復雜系統的架構設計中引入設計原則與模式,能夠極大降低復雜系統開發、和維護的成本
目錄
- 幾個問題
- 為什么要學習設計模式
- 優良架構設計的具體指標
- 理解復雜系統
- 面向對象思想(指導復雜系統的分析、設計、實現)
- 設計原則
- 設計模式
幾個問題
- 單一職責原則的職責是什么
- 依賴倒置中的依賴是什么?(依賴注入DI,和 IOC 控制反轉)
- 組合與聚合的區別是什么
- 貧血模型與充血模型的差異在什么地方
- 閱讀開源項目代碼時,單個方法可以理解,整體看不懂
為什么要學習設計模式
- 有助於更快地讀懂開源項目代碼
- 自己編寫通用組件、框架
設計模式可以幫助我們優化系統的設計,增強系統的健壯性,可擴展性
優良架構設計的具體指標
- 可維護性
- 可讀性
- 可擴展性
- 靈活性
- 簡潔性
- 可復用性
- 可測試性
可維護性
- 在不破壞原有代碼設計、不引入新的 bug 的情況下,能夠快速地修改或者添加代碼
- 代碼分層清晰、模塊化好、高內聚低耦合、遵從基於接口而非實現編程的設計原則
可讀性
- 任何傻瓜都會編寫計算機能理解的代碼
- 好的程序員能夠編寫人能夠理解的代碼
- 代碼只是偶爾拿出來給機器讀一下,大多數時候都是給人讀的
可擴展性
- 代碼預留了一些功能擴展點,可以把新功能代碼,直接插到擴展點上,而不需要因為添加一個功能而大動干戈,改動大量原始代碼
- 對修改關閉,對擴展開放原則
靈活性
- 當我們添加一個新的功能代碼的時候,原有的代碼已經預留好了擴展點,我們不需要修改原有的代碼,只要在擴展點上添加新的代碼即可
- 當我們要實現一個功能的時候,發現原有代碼中,已經抽象出了很多底層可以復用的模塊、類等代碼,我們可以拿來直接使用
- 當我們使用某組接口的時候,如果這組接口可以對應各種使用場景,滿足各種不同的需求
簡潔性
- 代碼簡單,邏輯清晰
- KISS 原則(Keep It Simple, Stupid)
可復用性
- 解耦、高內聚、低耦合、模塊化、組件化
可測試性
- 單元測試友好 Mock
理解復雜系統
- 系統思維
- 什么是復雜系統
- 系統復雜的原因
- 軟件系統的復雜性
- 控制復雜性
- 面向過程與面向算法
系統思維
什么是系統?
- 系統是由一組實體和這些實體之間的關系所構成的集合,其功能要大於這些實體各個功能之各(涌現原則)
- 系統並不是其組成物的簡單加總,而是這些組成物之間互動的產物 -- Russell Ackoff
- 整體大於其各部分之和 -- 亞里士多德
什么是復雜系統
由很多高度相關、高度互聯和高度混雜的元素或實體所組成的系統
系統復雜的原因
- 我們總是有“更多的要求”(更多功能,更好性能,更健壯,更靈活)
- 我們要求系統能夠與其它系統相互協作,相互連接
- 要用大量的信息來指定並描述
軟件系統的復雜性
- 問題域的復雜性
- 管理開發過程的復雜性
- 軟件系統中隨處可能出現的靈活性
- 描述離散系統行為的問題
控制復雜性
- 算法分解
- 面向對象分解
面向對象思想(指導復雜系統的分析、設計、實現)
- 面向過程與面向算法
- 對象
- 類
- 抽象
- 封裝
- 分解
- 分層
面向過程與面向算法
面向對象
它以類或對象作為組織代碼的基本單元,並將封裝、抽象、繼承、多態四個特性,作為代碼設計和實現的基石
面向過程
它以過程(可以理解為方法、函數、操作)作為組織代碼的基本單元,以數據(可以理解為成員變量、屬性)與方法相分離為最主要的特點。面向過程風格是一種流程化的編程風格,通過拼接一組順序執行的方法來操作數據完成一項功能
對象
對象是一個實體,這個實體具有明確定義的邊界(Boundary)和標識(Identity),並且封裝了狀態(State)和行為(Behavior)
- 對象具有明確定義的邊界和標識
- 對象封裝了狀態和行為
類
類是一種抽象,它將相似的實體抽象成相同的概念,這種抽象過程強調相關特征而忽略其他特征
抽象
抽象(Abstraction)的過程就是揭示事物區別於其他事物的本質特征的過程,是一個分析和理解問題的過程,這個過程取決於使用者的目的,它應該包括使用者所感興趣的那些職責問題,而忽略掉其他不相關的部分。從對象到類的過程就是抽象的過程,即將所見到的具體實體抽象成概念,從而可以在計算機世界中進行描述和對其采取各種操作
最少承諾
根據這個原則,對象的接口只提供它的基本行為,此外別無其他
最少驚奇
這個原則是指抽象捕捉了某個對象的全部行為,不多也不少,並且不提供抽象之外的驚奇效果或副作用
封裝
封裝是一個過程,它分隔構成抽象的結構和行為的元素。封裝的作用是分離抽象的概念接口及其實現
- 抽象和封裝是互補的概念:抽象關注的是對象可以觀察到的行為,而封裝關注這種行為的實現
- 抽象“幫助人們思考他們做什么”,而封裝“讓程序可以借助最少的工作進行可靠的修改”
- 封裝在不同的抽象之間提供了明確的邊界,因此導致了清晰的關注點分離
- 要讓抽象能工作,必須將實現封裝起來
- 明智的封裝讓可能改變的設計決策局部化
- 絕大多數情況下,只有當這個抽象的創造者顯示地暴露出實現,而且客戶願意接受由此帶來的額外的復雜性時,才會這樣做
分解
分解(Decomposition)是指將單個大規模復雜系統划分為多個不同的小構件。分解后的構件通過抽象和封裝等技術形成相對獨立的單元,這些單元可以獨立地設計和開發,從而實現化繁為簡、分而治之,以應對系統的復雜系,降低軟件開發成本
分層
分層(Hierarchy)是指面向不同的目標建立不同的抽象級別層次,從而在不同的抽象層次對系統進行分解,進一步簡化對系統的理解
課程鏈接
https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。
歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含鏈接: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改后的作品務必以相同的許可發布。
如有任何疑問,請與我聯系 (MingsonZheng@outlook.com) 。