.NET 雲原生架構師訓練營(設計原則與模式)--學習筆記


在復雜系統的架構設計中引入設計原則與模式,能夠極大降低復雜系統開發、和維護的成本

目錄

  • 幾個問題
  • 為什么要學習設計模式
  • 優良架構設計的具體指標
  • 理解復雜系統
  • 面向對象思想(指導復雜系統的分析、設計、實現)
  • 設計原則
  • 設計模式

幾個問題

  • 單一職責原則的職責是什么
  • 依賴倒置中的依賴是什么?(依賴注入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) 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM