.NET 云原生架構(gòu)師訓(xùn)練營(設(shè)計(jì)原則與模式)--學(xué)習(xí)筆記
在復(fù)雜系統(tǒng)的架構(gòu)設(shè)計(jì)中引入設(shè)計(jì)原則與模式,能夠極大降低復(fù)雜系統(tǒng)開發(fā)、和維護(hù)的成本
目錄
幾個(gè)問題
為什么要學(xué)習(xí)設(shè)計(jì)模式
優(yōu)良架構(gòu)設(shè)計(jì)的具體指標(biāo)
理解復(fù)雜系統(tǒng)
面向?qū)ο笏枷耄ㄖ笇?dǎo)復(fù)雜系統(tǒng)的分析、設(shè)計(jì)、實(shí)現(xiàn))
設(shè)計(jì)原則
設(shè)計(jì)模式
幾個(gè)問題
單一職責(zé)原則的職責(zé)是什么
依賴倒置中的依賴是什么?(依賴注入DI,和 IOC 控制反轉(zhuǎn))
組合與聚合的區(qū)別是什么
貧血模型與充血模型的差異在什么地方
閱讀開源項(xiàng)目代碼時(shí),單個(gè)方法可以理解,整體看不懂
為什么要學(xué)習(xí)設(shè)計(jì)模式
有助于更快地讀懂開源項(xiàng)目代碼
自己編寫通用組件、框架
設(shè)計(jì)模式可以幫助我們優(yōu)化系統(tǒng)的設(shè)計(jì),增強(qiáng)系統(tǒng)的健壯性,可擴(kuò)展性
優(yōu)良架構(gòu)設(shè)計(jì)的具體指標(biāo)
可維護(hù)性
可讀性
可擴(kuò)展性
靈活性
簡潔性
可復(fù)用性
可測(cè)試性
可維護(hù)性
在不破壞原有代碼設(shè)計(jì)、不引入新的 bug 的情況下,能夠快速地修改或者添加代碼
代碼分層清晰、模塊化好、高內(nèi)聚低耦合、遵從基于接口而非實(shí)現(xiàn)編程的設(shè)計(jì)原則
可讀性
任何傻瓜都會(huì)編寫計(jì)算機(jī)能理解的代碼
好的程序員能夠編寫人能夠理解的代碼
代碼只是偶爾拿出來給機(jī)器讀一下,大多數(shù)時(shí)候都是給人讀的
可擴(kuò)展性
代碼預(yù)留了一些功能擴(kuò)展點(diǎn),可以把新功能代碼,直接插到擴(kuò)展點(diǎn)上,而不需要因?yàn)樘砑右粋€(gè)功能而大動(dòng)干戈,改動(dòng)大量原始代碼
對(duì)修改關(guān)閉,對(duì)擴(kuò)展開放原則
靈活性
當(dāng)我們添加一個(gè)新的功能代碼的時(shí)候,原有的代碼已經(jīng)預(yù)留好了擴(kuò)展點(diǎn),我們不需要修改原有的代碼,只要在擴(kuò)展點(diǎn)上添加新的代碼即可
當(dāng)我們要實(shí)現(xiàn)一個(gè)功能的時(shí)候,發(fā)現(xiàn)原有代碼中,已經(jīng)抽象出了很多底層可以復(fù)用的模塊、類等代碼,我們可以拿來直接使用
當(dāng)我們使用某組接口的時(shí)候,如果這組接口可以對(duì)應(yīng)各種使用場(chǎng)景,滿足各種不同的需求
簡潔性
代碼簡單,邏輯清晰
KISS 原則(Keep It Simple, Stupid)
可復(fù)用性
解耦、高內(nèi)聚、低耦合、模塊化、組件化
可測(cè)試性
單元測(cè)試友好 Mock
理解復(fù)雜系統(tǒng)
系統(tǒng)思維
什么是復(fù)雜系統(tǒng)
系統(tǒng)復(fù)雜的原因
軟件系統(tǒng)的復(fù)雜性
控制復(fù)雜性
面向過程與面向算法
系統(tǒng)思維
什么是系統(tǒng)?
系統(tǒng)是由一組實(shí)體和這些實(shí)體之間的關(guān)系所構(gòu)成的集合,其功能要大于這些實(shí)體各個(gè)功能之各(涌現(xiàn)原則)
系統(tǒng)并不是其組成物的簡單加總,而是這些組成物之間互動(dòng)的產(chǎn)物 -- Russell Ackoff
整體大于其各部分之和 -- 亞里士多德
什么是復(fù)雜系統(tǒng)
由很多高度相關(guān)、高度互聯(lián)和高度混雜的元素或?qū)嶓w所組成的系統(tǒng)
系統(tǒng)復(fù)雜的原因
我們總是有“更多的要求”(更多功能,更好性能,更健壯,更靈活)
我們要求系統(tǒng)能夠與其它系統(tǒng)相互協(xié)作,相互連接
要用大量的信息來指定并描述
軟件系統(tǒng)的復(fù)雜性
問題域的復(fù)雜性
管理開發(fā)過程的復(fù)雜性
軟件系統(tǒng)中隨處可能出現(xiàn)的靈活性
描述離散系統(tǒng)行為的問題
控制復(fù)雜性
算法分解
面向?qū)ο蠓纸?/p>
面向?qū)ο笏枷耄ㄖ笇?dǎo)復(fù)雜系統(tǒng)的分析、設(shè)計(jì)、實(shí)現(xiàn))
面向過程與面向算法
對(duì)象
類
抽象
封裝
分解
分層
面向過程與面向算法
面向?qū)ο?/h4>
它以類或?qū)ο笞鳛榻M織代碼的基本單元,并將封裝、抽象、繼承、多態(tài)四個(gè)特性,作為代碼設(shè)計(jì)和實(shí)現(xiàn)的基石
面向過程
它以過程(可以理解為方法、函數(shù)、操作)作為組織代碼的基本單元,以數(shù)據(jù)(可以理解為成員變量、屬性)與方法相分離為最主要的特點(diǎn)。面向過程風(fēng)格是一種流程化的編程風(fēng)格,通過拼接一組順序執(zhí)行的方法來操作數(shù)據(jù)完成一項(xiàng)功能
對(duì)象
對(duì)象是一個(gè)實(shí)體,這個(gè)實(shí)體具有明確定義的邊界(Boundary)和標(biāo)識(shí)(Identity),并且封裝了狀態(tài)(State)和行為(Behavior)
對(duì)象具有明確定義的邊界和標(biāo)識(shí)
對(duì)象封裝了狀態(tài)和行為
類
類是一種抽象,它將相似的實(shí)體抽象成相同的概念,這種抽象過程強(qiáng)調(diào)相關(guān)特征而忽略其他特征
抽象
抽象(Abstraction)的過程就是揭示事物區(qū)別于其他事物的本質(zhì)特征的過程,是一個(gè)分析和理解問題的過程,這個(gè)過程取決于使用者的目的,它應(yīng)該包括使用者所感興趣的那些職責(zé)問題,而忽略掉其他不相關(guān)的部分。從對(duì)象到類的過程就是抽象的過程,即將所見到的具體實(shí)體抽象成概念,從而可以在計(jì)算機(jī)世界中進(jìn)行描述和對(duì)其采取各種操作
最少承諾
根據(jù)這個(gè)原則,對(duì)象的接口只提供它的基本行為,此外別無其他
最少驚奇
這個(gè)原則是指抽象捕捉了某個(gè)對(duì)象的全部行為,不多也不少,并且不提供抽象之外的驚奇效果或副作用
封裝
封裝是一個(gè)過程,它分隔構(gòu)成抽象的結(jié)構(gòu)和行為的元素。封裝的作用是分離抽象的概念接口及其實(shí)現(xiàn)
抽象和封裝是互補(bǔ)的概念:抽象關(guān)注的是對(duì)象可以觀察到的行為,而封裝關(guān)注這種行為的實(shí)現(xiàn)
抽象“幫助人們思考他們做什么”,而封裝“讓程序可以借助最少的工作進(jìn)行可靠的修改”
封裝在不同的抽象之間提供了明確的邊界,因此導(dǎo)致了清晰的關(guān)注點(diǎn)分離
要讓抽象能工作,必須將實(shí)現(xiàn)封裝起來
明智的封裝讓可能改變的設(shè)計(jì)決策局部化
絕大多數(shù)情況下,只有當(dāng)這個(gè)抽象的創(chuàng)造者顯示地暴露出實(shí)現(xiàn),而且客戶愿意接受由此帶來的額外的復(fù)雜性時(shí),才會(huì)這樣做
分解
分解(Decomposition)是指將單個(gè)大規(guī)模復(fù)雜系統(tǒng)劃分為多個(gè)不同的小構(gòu)件。分解后的構(gòu)件通過抽象和封裝等技術(shù)形成相對(duì)獨(dú)立的單元,這些單元可以獨(dú)立地設(shè)計(jì)和開發(fā),從而實(shí)現(xiàn)化繁為簡、分而治之,以應(yīng)對(duì)系統(tǒng)的復(fù)雜系,降低軟件開發(fā)成本
分層
分層(Hierarchy)是指面向不同的目標(biāo)建立不同的抽象級(jí)別層次,從而在不同的抽象層次對(duì)系統(tǒng)進(jìn)行分解,進(jìn)一步簡化對(duì)系統(tǒng)的理解
課程鏈接
.NET云原生架構(gòu)師訓(xùn)練營講什么,怎么講,講多久
