乐趣区

关于设计原则:GRASP通用职责分配模式

在软件设计中构思对象的职责、角色和合作,须要用到一些准则和模式,GRASP 九大准则 -> SOLID 六大准则 -> GOF23 种设计模式,GRASP 处于最上层(更一般化的准则,不只利用于面向对象设计),SOLID 准则再进一步细化,GOF 再依据这些准则进一步的演绎出更具体的模式。

软件设计在实质上是为了管制复杂度,升高”软件的熵“软件的复杂性在于除了要解决功能性需要,还要解决非功能性需要:可用性、可维护性、可扩展性、稳定性、高性能、数据一致性、容错性、可复用性、安全性、幂等性、兼容等等。

在常见的分层设计中,每一层都对下层屏蔽了外部的复杂度。同理,在类的设计中,类的复杂度也通过封装不蔓延到其余中央。

GRASP(General Responsibility Assignment Software Pattern),来源于:克雷·拉蒙.《Applying UML and Patterns》.1997,蕴含以下九个准则。

信息专家(Information Expert)

定义:如果一个类领有执行某个职责所必须的信息,那么将这个职责调配给这个类。
长处:升高了类间耦合,使信息(常识)没有蔓延进来。

创建者(Creator)

谁应该负责创立一个类的实例?此模式答复了这个问题。
定义:如果合乎上面的一个或者多个条件,则可将创立类 A 实例的职责调配给类 B。
1.B 蕴含或聚合了 A;
2.B 领有初始化 A 的数据,并把该数据在创立 A 的实例时传递给 A;
3.B 记录 A 的实例;
4.B 频繁应用 A;
长处:升高了类间耦合,因为类 B 和类 A 曾经存在耦合,所以并没有减少额定的耦合。

低耦合

耦合:评估一个零碎中各个元素(类,模块,子系统)之间的依赖水平。以下是一些耦合关系的体现:
1.A 具备一个 B 类型的属性(field);
2.A 调用了 B 的办法;
3.A 的办法蕴含对 B 的援用,比方办法参数为 B,或返回类型为 B;
4.A 是 B 的子类;
5.B 是一个接口,A 实现了 B 接口;
以上这些耦合关系越多代表耦合水平越高。这些关系简略地说就是 A 对 B 的“感知”。
高耦合的毛病 :一个类的批改会对其余类产生影响,容易产生脱漏和问题;零碎难以保护和了解,复用性也很差。
升高耦合的一些办法:尽量减少对其余类的援用;进步办法和属性的拜访权限;尽量应用组合 / 聚合准则来代替继承;多态也是一种升高耦合的办法,调用者只须要晓得父类即可,不须要晓得所有子类型,升高了类型耦合。
类间依赖是一种常见的耦合关系,尽量应用单向依赖,去除或弱化双向依赖,不应用循环依赖。

高内聚

内聚:是对元素职责的相关性和集中度的度量。
定义:即性能严密相干的职责应该放在一个类里,并共同完成无限的性能。与繁多职责和接口隔离准则是统一的。
长处:类的性能高内聚后复杂性就升高了,保护老本也就随之升高;同时进步了复用性。
低内聚的毛病 :类要做许多不相干的工作,或须要实现大量的工作,导致类难以了解,难以复用,难以保护,常常被改变。
如下图,非内聚的类(或模块)蕴含了多个不相干业务的性能,看起来比拟芜杂。对它进行职责拆分后,不同业务的性能放在不同的类(模块),高内聚之后的构造显得非常清晰。

控制器(Controller)

定义:把接管或者解决零碎事件音讯的职责调配给一个类(这个类也能够是:子系统,或设施);
一个控制器应该解决一类事件,控制器要把实现的性能委托给业务层 Service,它只负责协调和管制业务流程。
长处:控制器的外围是提供一个对立入口(比方外观模式),防止客户对系统外部进行耦合,很好的保护了职责边界。

多态

定义:当相干抉择或行为随类型(类)变动而变动时,用多态操作为行为变动的类型调配职责。
长处:多态是面向对象设计的基本操作,它使将来的变动能够通过扩大新的子类解决,合乎开闭准则。

纯虚构(Pure Fabrication)

定义:为了反对良好的内聚和低耦合以及复用性,将一组相干职责调配给一个虚构的类(这个类不是问题域中的概念)。比方数据库操作 DAO,service,handler 等。
长处:解耦,以及反对了高内聚和复用性。

间接(Indirection)

定义:配职责给两头对象(中介)以协调组件或服务之间的操作,使得它们不间接耦合。
长处:实现了类间的隔离和解耦。
有一种风趣的说法:“大多数设计问题都能够通过减少一层来解决,如果不行就再加一层。而性能问题则刚好相同,缩小一层就能解决问题。”

受爱护的变动(Protected Variations)

定义:找出预计有变动或不稳固的元素,为其创立稳固的“接口”而调配职责。
即思考将来变动的扩展性,它是大多数程序设计的根底,是模式的根本动机之一,它使零碎可能适应和隔离变动。与 ETC 准则统一,与面向对象的开闭准则绝对应。

退出移动版