软件设计中的原则(GRASP)
关键字: GRASP
这里说的 几个软件模式是属于原则层次一级的,比 GoF 等软件 设计模式高一层。遵循这些原则可以使我们设计出来的软件有更好的可复用性和可维护性,同样 GoF 等软件设计模式也是遵循这一原则的。
下边的条列只是简单的 介绍,以便忘记了偶尔过来游览一下,详细的介绍请参阅:《 Java 模式》、《 UML 和模式应用 – 面向对象分析与设计导论》
- GRASP 模式
GRASP 是 General Responsibility Assignment Software Pattern( 通用指责分配 软件模式 ) 的缩写。
1) 专家模式 (Expert)
解决 方案:将职责分配给具有履行职责所需要的信息的类
通俗 点就是:该干嘛干嘛去,别管别人的闲事或者我的职责就是搞这个,别的事不管。
举个简单的例子,如果有一个类是专门处理字符串相关的类,那么这个类只能有字符串处理相关的方法,而不要将 日期处理的方法加进来。也就是提高软件高内聚一种原则。
2) 创建者 (Creator)
解决 方案:将创建一个类 A 的实例的职责指派给类 B 的实例,如果下列条件满足的话:
a) B 聚合了 A 对象
b) B 包含了 A 对象
c) B 纪录了 A 对象的实例
d) B 要经常使用 A 对象
e) 当 A 的实例被创建时, B 具有要传递 给 A 的初始化数据 ( 也就是说 B 是创建 A 的实例这项任务的信息 专家 )
f) B 是 A 对象的创建者
如果 以上条件中不止一条成立的话,那么最好让 B 聚集或包 含 A
通俗 点就是:我要用你所以我来创建你,请不要让别人创建你
这个模式是支持低耦合度原则的一个体现
3) 高聚合度或高内聚 (High Cohesion)
解决 方案:分配一个职责的时候要保持类的高聚合度
聚合度或内聚度 (cohesion) 是一个类中的各个职责之间相关程度和集中程度的度量。一个具有高度相关职责的类并且这个类所能完成的工作量不是特别巨大,那么他就是 具有高聚合度。
4) 低耦合度或低耦合 (Low Coupling)
解决 方案:在分配一个职责时要使保持低耦合度。
耦合 度 (coupling) 是一个类与其它类关联、知道 其他类的信息或者依赖其他类的强弱程度的度量。一个具有低 ( 弱 ) 耦合度的类不依赖于太多的其 他类。
5) 控制者 (Controller)
解决 方案:将处理系统事件消息的职责分派给代表下列事物的类:
a) 代表整个“系统”的类(虚包控制者)
b) 代表整个企业或组织的类(虚包控制者)
c) 代表真实世界中参与职责(角色控制者)的主动对象类(例,一个人的角 色)
d) 代表一个用况中所有事件的人工处理者类,通常用“ 用例名 > 处理者”的方式命名(用例控制者)
这是 一个控制者角色职责分配的原则,就是哪些控制应该分派给哪个角色。
6) 多态
当相 关的可选择的方法或行为随着类型变化时,将行为的职责 – 使用多态的操作 – 分配给那些行为 变化的类型
也就是说尽量对抽象层编程,用多态的方法来判断具体应该使用那个类,而不是用 if instanceof 来判断该类是什么接来执行什么。
7) 纯虚构
一个 纯虚构意味着虚构某些事物,而不是到了迫不得已我们才这样做。
例, 我们的 Sale 类的数据要存入数据库,但是他必须和 数据库接口相连接,如果将接口连接放入 Sale 类中 势必增加该类的耦合度,所以我们可以虚构一个类来处理与数据库接口连接的问题。这个类就是我们虚构出来的一个事物。
8) 中介者
将职 责分配给一个中间对象以便在其他构件或服务之间仲裁,这样这些构件或服务没有被直接耦合。这个中间对象 (intermediary) 在其他构件或服务间创建一个中介者 (Indirection) 。这个中间对象也就事 7) 中的纯虚构。
9) 不要和陌生人讲话
分配职责给一个客户端的直接对象以使它与一个间接对象进行协作,这样客户端无需知道这个间接对象。
这个模式 – 也被叫做 (Demeter) 准 则。
通俗点就是:只与你直接的朋友们通信
不要跟“陌 生人”说话
每个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
- 2. 其他设计原则
1) “开 – 闭”原则( Open-Closed Principle ,或者 OCP )
一个 软件实体应当对扩展开放,对修改关闭。
意思就是在设计一个模块的时候,应当使这个模块在不被修改的前提下被扩展。换言之,应当可以在不修改代码的 情况下改变这个模块的行为。
2) 里氏代换原则( Liskov Substitution Principle, 或者 LSP )
这个 就是尽量用多态的方法编程,也就是 GRASP 模式中 的多态。
3) 依赖倒转原则( Dependency Inversion Principle, 或者 DIP )
依赖 倒转原则讲的是:要依赖于抽象,不要依赖于具体
就是 说我们尽量在抽象层进行控制编程,要针对接口编程,不要针对实现编程。
4) 接口隔离原则( Interface Segregation Principle, 或者 ISP )
使用多个专门的接口比使用单一的总接口要好。也就是,从一个客户类的角度来讲:一个类对另外一个类的依赖性 应当是建立在最小的接口上的。
5) 组合 / 聚合复用原则( Composition/Aggregation Principle, 或 者 CARP )
又叫合成复用原则。原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过 向这些对象的委派达到复用已有功能的目的。也就是,要尽量使用类的合成复用,尽量不要使用继承
6)变与不变的分离
更扩展一步,就是将不同变化的组件进行隔离.最简单的例子就是javabean中的存取器。它隔离了不变的接口和变化的内部属性。这方面体现最好的个人觉 得就是eclipse,通过变化的插件,eclipse可以用来实现任何功能。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树使用JDBC操作数据库数据库操作91528 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!