https://m.toutiao.com/is/MF1LP21/?=編程核心思想 代碼的易復(fù)用、易擴(kuò)展、易維護(hù)是代碼組織的最高目標(biāo)。 1 應(yīng)對復(fù)雜性:抽象(abstract)、分解(decompose)問題的數(shù)據(jù)抽象與功能(function)抽象,抽象出模塊及模塊分解。 從模塊四要素去理解模塊:
一個系統(tǒng)可以劃分為不同的子系統(tǒng),一個模塊可以劃分為更小的模塊。 模塊可以是函數(shù)(功能、方法、接口)、類、由函數(shù)、類組成的模塊、模塊的模塊、子系統(tǒng)、系統(tǒng)。 盡量實現(xiàn)模塊的可復(fù)用性。 計算機(jī)系統(tǒng)就是一個分層抽象的系統(tǒng)。其中的編程語言也有不同的抽象層次,其中的C語言相對Java來說,抽象層次較低。 2 應(yīng)對需求變化(功能增改),易于維護(hù)和擴(kuò)展2.1 功能增加時,不需要修改現(xiàn)有代碼; 2.2 功能修改時,不影響其它代碼; 要實現(xiàn)這兩個目標(biāo),要求模塊的高內(nèi)聚、低耦合,模塊滿足七大設(shè)計原則。 也就是要避免'城門失火,殃及池魚',避免“牽一發(fā)而動全身”。 ① 內(nèi)聚:模塊內(nèi)部元素的相似程度; ② 耦合:本模塊對其它模塊的依賴程度。 3 模塊耦合關(guān)系分解操作形成模塊,模塊結(jié)合會形成模塊依賴關(guān)系,也就是模塊耦合關(guān)系。 編程中的各類關(guān)系所形成的依賴無處不在: 類的6類關(guān)系: 相對于繼承(Inheritance),組合(Composition)具有較低的耦合關(guān)系,聚合(Aggregation)及其它關(guān)系的耦合性最低: 4 設(shè)計原則與設(shè)計模式設(shè)計模式是以設(shè)計原則為基礎(chǔ)。設(shè)計模式重點在于管理變化,提高復(fù)用,如果變化沒有顯現(xiàn),模塊沒有利用價值時,就沒有必要使用設(shè)計模式。Framework相對于Application,具有使用設(shè)計模式的更多場景。 設(shè)計原則以高內(nèi)聚、低耦合為目標(biāo)。 設(shè)計模式在什么地方應(yīng)用:尋找變化點,在變化點應(yīng)用模式。(將變化隔離,封裝(C++封裝為virtual函數(shù)),使得變化發(fā)生時,其它部分不受影響。) Template Method定義一個操作中的算法的骨架(穩(wěn)定),而將一些步驟延遲(變化)到子類中。Template Method使得子類可以不改變(復(fù)用)一個算法的結(jié)構(gòu)(接口)即可重定義(override重寫)該算法的某些特定步驟(如使用一個框架(以虛函數(shù)做為擴(kuò)展點)時只需要重寫某些虛函數(shù)即可)。 設(shè)計模式在什么時間應(yīng)用:一般沒有一步到位的設(shè)計模式,而是重構(gòu)到模式,如常見的重構(gòu)技法:
5 七大設(shè)計原則 — SOLID & LC這七大設(shè)計原則是業(yè)界在面向?qū)ο笤O(shè)計中經(jīng)過總結(jié)精煉得出,在英文表示下各個原則首字母縮寫就是 SOLID。
另外還有兩個設(shè)計原則。
5.1 單一職責(zé)原則(Single Responsibility Principle) 一個類只做一件事(一個類應(yīng)該僅有一個引起它變化的原因,變化的方向隱含著類的責(zé)任。)。 業(yè)務(wù)對象(BO business object)、業(yè)務(wù)邏輯(BL business logic)拆解到單一職責(zé)的模塊。 5.2 開放封閉原則(Open closed principle) 對外擴(kuò)展開放,對內(nèi)修改封閉。 擴(kuò)展某類的功能時應(yīng)該通過添加新的代碼來實現(xiàn)而不是修改其內(nèi)部的代碼。 用抽象構(gòu)建架構(gòu),用實現(xiàn)確保擴(kuò)展。 5.3 里氏替換原則(LSP liskov substitution principle) 子類可以擴(kuò)展父類的功能,但不能改變原有父類的功能。 子類必須能夠替換它們的基類(is-a)。 繼承表達(dá)類型抽象。 實際項目中,每個子類對應(yīng)不同的業(yè)務(wù)含義,使父類作為參數(shù),傳遞不同的子類完成不同的業(yè)務(wù)邏輯。如實現(xiàn)多態(tài)。 5.4 接口隔離(Interface segregation principle) 建立單一接口(擴(kuò)展為類也是一種接口,一切皆接口)。 不應(yīng)該強(qiáng)迫客戶程序依賴它們不用的方法(客戶端不應(yīng)該依賴它不需要的接口)。 該暴露的暴露(訪問屬性設(shè)置為public),該隱藏的隱藏(訪問屬性設(shè)置為private,類內(nèi)部使用)。 接口應(yīng)該小而完備。 一個類對另一個類的依賴應(yīng)該建立在最小的接口上。 避免大接口被許多子類實現(xiàn),造成耦合。降低了耦合,代碼也變得好維護(hù)。 接口的設(shè)計粒度越小,系統(tǒng)越靈活,但是靈活的同時結(jié)構(gòu)復(fù)雜性提高,開發(fā)難度也會變大,維護(hù)性降低。 5.5 依賴倒置原則(Dependence inversion principle) 高層模塊(穩(wěn)定)不應(yīng)該依賴于低層模塊(變化),二者都應(yīng)該依賴于抽象(穩(wěn)定)。 抽象(穩(wěn)定)不應(yīng)該依賴于實現(xiàn)細(xì)節(jié)(變化),實現(xiàn)細(xì)節(jié)應(yīng)該依賴于抽象(穩(wěn)定),實現(xiàn)抽象時便會相互獨立,這樣就降低了模塊的耦合度。 面向接口編程(通過接口作為參數(shù)實現(xiàn)應(yīng)用場景)。 抽象就是接口或者抽象類,細(xì)節(jié)就是實現(xiàn)類(隱藏)。 也就是上面說的“隔離或封裝變化”。 5.6 迪米特原則(Law of demeter LOD)最少知道原則(Least Knowledge Principle 簡寫 LKP),盡量降低類與類之間的耦合; 一個對象應(yīng)該對其他對象有最少的了解。如果對象 A 知道對象 B 的所有細(xì)節(jié),那么對象 A 就可能會去使用到這些細(xì)節(jié)。如果你修改了其中對象 B 中的細(xì)節(jié),就會不經(jīng)意影響到 A。 5.7 組合/聚合復(fù)用原則(Composite/Aggregate Reuse Principle)優(yōu)先使用對象組合,而不是類繼承。 類繼承通常為“白箱復(fù)用”,對象組合通常為“黑箱復(fù)用”。 繼承屬于一種硬編碼。如果沒有遵守里氏替換原則,父類一旦修改,所有子類都需要進(jìn)行改變。 繼承在某種程序上破壞了封裝性,子類父類耦合度高。而對象組合則只要求組合的對象具有良好定義的接口。 以上七大設(shè)計原則的擴(kuò)展: 5.8 封裝變化點使用封裝來創(chuàng)建對象之間的分界層,讓設(shè)計者可以在分界一側(cè)進(jìn)行修改,而不會對另一側(cè)產(chǎn)生不良的影響,從而實現(xiàn)分界層之間的松耦合。 5.9 針對接口編程,而不是針對實現(xiàn)編程不將變量類型聲明為某個特定的具體類,而是聲明為某個接口。 客戶程序無需獲知對象的具體類型,只需要知道對象所具有的接口。 減少系統(tǒng)中各部分的依賴關(guān)系,從而實現(xiàn)“高內(nèi)聚、松耦合”的類型設(shè)計方案。 6 23個設(shè)計模式的分類根據(jù)設(shè)計模式的參考書 《Design Patterns - Elements of Reusable Object-Oriented Software》(《設(shè)計模式 - 可復(fù)用的面向?qū)ο筌浖亍罚┲兴岬降?,總共?23 種設(shè)計模式。這些模式可以分為三大類:創(chuàng)建型模式(Creational Patterns)、結(jié)構(gòu)型模式(Structural Patterns)、行為型模式(Behavioral Patterns)。 另一種細(xì)分的標(biāo)識:① 對象創(chuàng)建;② 對象性能;③ 單一職責(zé);④ 組件協(xié)作;⑤ 接口隔離;⑥ 狀態(tài)變化;⑦ 數(shù)據(jù)結(jié)構(gòu);⑧ 行為變化; ⑨ 領(lǐng)域問題 6.1 創(chuàng)建型模式(Creational Patterns) 這些設(shè)計模式提供了一種在創(chuàng)建對象的同時隱藏創(chuàng)建邏輯的方式,而不是使用 new 運(yùn)算符直接實例化對象。這使得程序在判斷針對某個給定實例需要創(chuàng)建哪些對象時更加靈活。 創(chuàng)建型模式的主要關(guān)注點是“怎樣創(chuàng)建對象?”,它的主要特點是“將對象的創(chuàng)建與使用分離”。這樣可以降低系統(tǒng)的耦合度,使用者不需要關(guān)注對象的創(chuàng)建細(xì)節(jié),對象的創(chuàng)建由相關(guān)的工廠來完成。就像我們?nèi)ド虉鲑徺I商品時,不需要知道商品是怎么生產(chǎn)出來的一樣,因為它們由專門的廠商生產(chǎn)。
6.2 結(jié)構(gòu)型模式(Structural Patterns) 這些設(shè)計模式關(guān)注類和對象的組合。繼承的概念被用來組合接口和定義組合對象獲得新功能的方式。 結(jié)構(gòu)型模式描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)。它分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式,前者采用繼承機(jī)制來組織接口和類,后者釆用組合或聚合來組合對象。 由于組合關(guān)系或聚合關(guān)系比繼承關(guān)系耦合度低,滿足“合成復(fù)用原則”,所以對象結(jié)構(gòu)型模式比類結(jié)構(gòu)型模式具有更大的靈活性。
6.3 行為型模式(Behavioral Patterns) 這些設(shè)計模式特別關(guān)注對象之間的通信。 行為型模式用于描述程序在運(yùn)行時復(fù)雜的流程控制,即描述多個類或?qū)ο笾g怎樣相互協(xié)作共同完成單個對象都無法單獨完成的任務(wù),它涉及算法與對象間職責(zé)的分配。 行為型模式分為類行為模式和對象行為模式,前者采用繼承機(jī)制來在類間分派行為,后者采用組合或聚合在對象間分配行為。由于組合關(guān)系或聚合關(guān)系比繼承關(guān)系耦合度低,滿足“合成復(fù)用原則”,所以對象行為模式比類行為模式具有更大的靈活性。
附編程發(fā)散思維圖: ref https:///article/1566313342510 -End- |
|