设计模式 - design pattern 我之见解 (GRASP SOLID GOF)

文章目录

  • Design Pattern的目的是什么?
  • 代码评价维度
  • 设计原则
    • GRASP,SOLID 和 Design Pattern关系
    • GRASP 9大原则
    • SOLID
      • SRP
      • OCP
      • LSP
      • ISP
      • DIP
    • GOF
      • LKP (Demeter principle)
  • GOF 23 设计模式
  • 进阶 package设计原则
  • 其他设计原则
    • postel's law
    • DKY法则
    • 其他
  • ???
  • 参考

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

你可能感兴趣的:(软件流程,汽车工业)