設計模式 - design pattern 我之見解 (GRASP SOLID GOF)

Design Pattern的目的是什麼?

增強代碼複用,可維護性,模塊化。

軟件,就像所有技術一樣,具有天然的政治性。代碼必然會反映作者的選擇、偏見和期望。
首先爲人類設計,其次爲機器設計。
只考慮和設計必須的功能,避免過度設計。

GOF的design pattern
提出了
23個design pattern
6個原則

Open close principle
Liskov Substitution principle
Interface Segragation principle
Dependence Inversion principle
Demeter principle (Least knowledge principle)
Composite reuse principle (儘量使用組合,少用集成,降低耦合。) 和LSP相輔相成,都是OCP的具體實現規範。繼承遵守LSP,

軟件,就像所有技術一樣,具有天然的政治性。
代碼必然會反映作者的選擇、偏見和期望。
首先爲人類設計,其次爲機器設計。

代碼評價維度

可維護性
擴展性
模塊化

靈活性 Flexible,魯棒性 Robust,可重用性 Reusable

僵化 Rigidity,脆弱 Fragility,複用性差 Immobility

設計原則

GRASP,SOLID 和 Design Pattern關係

GRASP九大原則、SOLID5大原則、GOF23種設計模式這三類設計原則模式中。GRASP處於最上層,SOLID基於它再進一步細化闡述,GOF再根據這些原則進一步的歸納出更具體的模式。
GRASP (General Responsibility Assignment Software Principles) published by Craig Larman.
SOLID principles were given by Uncle Bob (Robert C. Martin). SOLID is an acronym for five principles that help software developers design maintainable and extendable classes. The acronym was first introduced by Michael Feathers and is based on Uncle Bob’s paper Design Principles and Design Patterns.

Single Responsibility Principle (SOLID)
Open Closed Principle (SOLID)
Liskov Substitution principle (SOLID)
Interface Segregation Principle (SOLID)
Dependency Inversion Principle (SOLID)

High Cohesion (GRASP)
Low Coupling (GRASP)
Polymorphism (GRASP)
Information Expert (GRASP)
Creator (GRASP)
Pure Fabrication (GRASP)
Controller (GRASP)
Indirection (GRASP)
Protected variations (GRASP)

Demeter principle (GOF) 或 Least Knowledge principle
Composite reuse principle (GOF)

GRASP 9大原則

GRASP 是 design pattern的基礎

GRASP: General Responsibility Assignment Software Principle
GRASP的9個原則,以低耦合、高內聚原則爲核心
information 信息專家原則 (若一個類擁有完成這個職責所需要的數據,則把這個職責分配給這個類。)
creator 創造者原則(類對象職責委託給哪個誰,誰應該負責產生某個類的實例)
low coupling 低耦合原則(不具有操作性,是一種評價原則。極端情況,沒有耦合,就會形成一個很差的設計,一個類完成全部工作。若穩定或流傳度廣的,纔可以有高耦合,例如 系統軟件和JDK。)
high cohesion 高內聚原則(功能內聚)
controller 控制器原則 (事件的接受和處理委託給一個對象)
polymorphism 多態原則 (根據類型變化分配職責)
pure fabrication 純虛構(解決高內聚和低耦合的矛盾,基於功能進行劃分)
indirect 中介原則(建立中間對象協調2個對象間的交互,避免高耦合度)
protected variations 受保護變量原則(類似OCP開閉原則,找到變化點,統一的用接口封裝,通過接口擴展來擴展新功能。)

參考
https://www.jianshu.com/p/07111bcd55ed
https://www.jianshu.com/p/dcc8e1ed1bb1

SOLID

Single responsibility principle (類的單一職責原則)
Open-close principle (代碼擴充原則)
Liscov Substitution principle (父類子類設計原則)
Interface segregation principle (接口的設計原則)
Dependency Inversion principle (接口和類的設計原則)

SRP

體現高內聚,低耦合

OCP

Open-close principle
Bertrand Meyer 於1988提出的這一條原則連他自己也沒有想到,竟然影響了軟件設計30年的發展,奠定了現代面向對象程序設計的基本面貌。
對擴展開放,對修改關閉。
變化通過擴展實現,變化不應影響已有代碼。

LSP

Liscov 替換原則:
Barbara Liskov首次寫下這個原則是在1988年。
任何使用父類的地方,都可以無差別的使用子類替換。該原則目的,子類擴展新功能,但儘量不要重寫/重載父類接口。克服了,重寫父類造成的複用性變差的缺點;同時,避免了擴展子類不會對已有系統引入新的錯誤。

ISP

Interface segragation principle:
原則:不應強迫客戶依賴他們不需要的接口。大接口拆分成更小更具體的接口。

DIP

Dependency inversion principle
inversion是相對傳統的結構化方法中的高層模塊依賴低層模塊,進而導致抽象依賴於具體實現細節,而言的。
該原則,要依賴於抽象,不依賴具體;要針對接口編程,不針對實現編程;具體實現依賴於抽象,高層模塊和低層模塊都依賴於抽象。

依賴:模塊A調用模塊B,稱爲A依賴B。
耦合:依賴也就是耦合。
低層模塊:實現了基本的或初級的操作。
高層模塊:封裝了複雜邏輯,依賴於低層模塊。

LSP是DIP的基礎;DIP是OOD的核心原則。
DIP中提出的評價軟件的定性描述。
靈活性 Flexible,魯棒性 Robust,可重用性 Reusable
僵化 Rigidity,脆弱 Fragility,複用性差 Immobility

http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

GOF

Least knowledge principle (Demeter principle)(類間關係原則)
Composite reuse principle (儘量使用組合,少用繼承,降低耦合。) 和LSP相輔相成,都是OCP的具體實現規範。繼承遵守LSP,

LKP (Demeter principle)

Demeter原則 (Least knowledge principle):
demeter這個詞來自於荷蘭大學的一個項目名稱。
害羞原則。顧客從自己錢包拿錢給售貨員,不是讓售貨員從顧客的錢包裏自己拿錢。

GOF 23 設計模式

見CSDN上傳資料
在這裏插入圖片描述

進階 package設計原則

The five SOLID  principles are principles of class design.

The next six principles are about packages. In this context a package is a binary deliverable like a .jar file, or a dll as opposed to a namespace like a java package or a C++ namespace.

The first three package principles are about package cohesion, they tell us what to put inside packages:

REP	The Release Reuse Equivalency Principle	The granule of reuse is the granule of release.
CCP	The Common Closure Principle	Classes that change together are packaged together.
CRP	The Common Reuse Principle	Classes that are used together are packaged together.

The last three principles are about the couplings between packages, and talk about metrics that evaluate the package structure of a system.

ADP	The Acyclic Dependencies Principle	The dependency graph of packages must have no cycles.
SDP	The Stable Dependencies Principle	Depend in the direction of stability.
SAP	The Stable Abstractions Principle	Abstractness increases with stability.

其他設計原則

Command-Query Separation (CQS)–命令-查詢分離原則
查詢:當一個方法返回一個值來回應一個問題的時候,它就具有查詢的性質;
命令:當一個方法要改變對象的狀態的時候,它就具有命令的性質;

Separation of Concerns (SoC)–關注點分離
Design by Contract (DbC)–契約式設計

Convention over Configuration(CoC)–慣例優於配置原則 慣例優先原則

隱藏實現細節原則
避免過早優化原則
最小驚訝原則 遵守標準約定註釋說什麼代碼就做什麼

postel’s law

該原理也被稱爲魯棒性原理(Robustness Principle),1980 年,Jonathan Bruce Postel 在他編寫的最早期的 TCP 協議規範中有提到:

Be conservative in what you send, be liberal in what you accept.

對發送的內容保持謹慎,對接收的內容保持自由。(直譯)

至此之後,該原理便被稱爲伯斯塔爾法則(Postel’s Law),廣泛應用於計算機協議以及系統控制理論中。雖然最近幾年計算機界中出現了一些質疑伯斯塔爾法則的聲音,但這並不妨礙其核心思想被應用於 UI/UX 的領域。

該原理表達的最核心思想是:系統/產品應保有一定程度的容錯能力。

DKY法則

只考慮和設計必須的功能,避免過度設計。
DKY法則 DRY KISS YAGNI
DRY: Don’t Repeat Yourself
KISS: Keep It Simple Stupid
YAGNI: You Ain’t Gonna Need It

其他

Hollywood Principle
Favor composition over inheritance
Program to an Interface, not to an Implementation

Hollywood principle
好萊塢原則就是一句話——“don’t call us,we’ll call you.”。意思是,好萊塢的經紀人們不希望你去聯繫他們,而是他們會在需要的時候來聯繫你。也就是說,所有的組件都是被動的,所有的組件初始化和調用都 由容器負責。組件處在一個容器當中,由容器負責管理。
最小驚訝原則 遵守標準約定註釋說什麼代碼就做什麼
隱藏實現細節原則
避免過早優化原則

Separation of Concerns (SoC)–關注點分離
Design by Contract (DbC)–契約式設計
Convention over Configuration(CoC)–慣例優於配置原則 慣例優先原則
Command-Query Separation (CQS)–命令-查詢分離原則
查詢:當一個方法返回一個值來回應一個問題的時候,它就具有查詢的性質;
命令:當一個方法要改變對象的狀態的時候,它就具有命令的性質;

???

控制反轉是一種將 組件依賴關係 的 創建和管理 置於程序外部的技術。
由容器控制程序之間的關係,而不是由代碼直接控制。
由於控制權由代碼轉向了容器,所以稱爲反轉。

Dependency Injection:兩個對象之間的依賴關係在程序運行時由外部容器動態的注入依賴行爲方式稱爲依賴注入 (DI) 。 DI 是 IOC 的一種形式。
依賴注入的三種實現類型:接口注入、 Setter注入和構造器注入。

面向切面 (Aspect Oriented Programming)

參考

https://dzone.com/articles/solid-grasp-and-other-basic-principles-of-object-o

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章