`
humn_chou
  • 浏览: 22474 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

软件设计中的原则(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\软件设计中的原则(GRASP)

    真的很好。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    面向对象软件架构设计

    第二单元:技术架构视图─面向对象程序设计原则与模式 59 用GRASP模式指导设计 62 领域模型 96 面向对象设计的基本原则 132 第三单元:用UML辅助系统分析与设计 177 UML简介及常见疑难问题辨析 178 借鉴RUP的UML建模...

    对grasp的理解和应用

    武汉大学软件工程uml——finalreport在软件工程专业中,思维对于我们来说是非常重要的一个部分,而学习软工框架,是十分有利于培养我们的...在实战之中,我对理论课学习的知识有了更深入的了解,其中包括了GRASP原则

    面向对象软件架构设计.ppt

    第二单元:技术架构视图─面向对象程序设计原则与模式 59 用GRASP模式指导设计 62 领域模型 96 面向对象设计的基本原则 132 第三单元:用UML辅助系统分析与设计 177 UML简介及常见疑难问题辨析 ...

    《设计模式实训教程》【PPT+类图与代码+样章】

    第2章面向对象设计原则实训 2.1知识讲解 2.1.1面向对象设计原则概述 2.1.2单一职责原则 2.1.3开闭原则 2.1.4里氏代换原则 2.1.5依赖倒转原则 2.1.6接口隔离原则 2.1.7合成复用原则 2.1.8迪米特法则 2.2实...

    UML和模式应用(原书第3版)

    作为成功的导师和顾问,Larman拥有丰富的实践经验,能够帮助读者理解进化式需求和用例、领域对象建模、职责驱动设计、OO设计本质、分层架构、GoF设计模式、GRASP、迭代方法、UP的敏捷途径等知识。第3版实用、易懂,...

    UML和模式应用(架构师必备).part06.rar

    26.8 组合(GoF)和其他设计原则 26.9 外观(Facade,GoF) 26.10 观察者/发布-订阅/委派事件模型(GoF) 26.11 结论 26.12 参考资料 第五部分 细化迭代3—中级主题 第27章 迭代3:中级主题 27.1 NextGen POS...

    面向对象与UML资料

    概要设计原则 17 概要设计方法 17 第四节 详细设计 18 详细设计的任务 18 详细设计的原则 18 详细设计的表示方法 18 第二章 面向对象的分析与设计 18 第一节 面向对象方法概述 18 对象与面向对象 18 面向对象技术...

    UML和模式应用(架构师必备).part01.rar

    26.8 组合(GoF)和其他设计原则 26.9 外观(Facade,GoF) 26.10 观察者/发布-订阅/委派事件模型(GoF) 26.11 结论 26.12 参考资料 第五部分 细化迭代3—中级主题 第27章 迭代3:中级主题 27.1 NextGen POS...

    UML和模式应用(架构师必备).part07.rar

    26.8 组合(GoF)和其他设计原则 26.9 外观(Facade,GoF) 26.10 观察者/发布-订阅/委派事件模型(GoF) 26.11 结论 26.12 参考资料 第五部分 细化迭代3—中级主题 第27章 迭代3:中级主题 27.1 NextGen POS...

    UML和模式应用(架构师必备).part02.rar

    26.8 组合(GoF)和其他设计原则 26.9 外观(Facade,GoF) 26.10 观察者/发布-订阅/委派事件模型(GoF) 26.11 结论 26.12 参考资料 第五部分 细化迭代3—中级主题 第27章 迭代3:中级主题 27.1 NextGen POS...

    UML和模式应用(架构师必备).part03.rar

    26.8 组合(GoF)和其他设计原则 26.9 外观(Facade,GoF) 26.10 观察者/发布-订阅/委派事件模型(GoF) 26.11 结论 26.12 参考资料 第五部分 细化迭代3—中级主题 第27章 迭代3:中级主题 27.1 NextGen POS...

    UML和模式应用(架构师必备).part04.rar

    26.8 组合(GoF)和其他设计原则 26.9 外观(Facade,GoF) 26.10 观察者/发布-订阅/委派事件模型(GoF) 26.11 结论 26.12 参考资料 第五部分 细化迭代3—中级主题 第27章 迭代3:中级主题 27.1 NextGen POS...

    UML和模式应用(架构师必备).part08.rar

    26.8 组合(GoF)和其他设计原则 26.9 外观(Facade,GoF) 26.10 观察者/发布-订阅/委派事件模型(GoF) 26.11 结论 26.12 参考资料 第五部分 细化迭代3—中级主题 第27章 迭代3:中级主题 27.1 NextGen POS...

    UML和模式应用(架构师必备).part05.rar

    26.8 组合(GoF)和其他设计原则 26.9 外观(Facade,GoF) 26.10 观察者/发布-订阅/委派事件模型(GoF) 26.11 结论 26.12 参考资料 第五部分 细化迭代3—中级主题 第27章 迭代3:中级主题 27.1 NextGen POS...

    面向对象分析与设计

    本课程介绍软件设计理念、方法,帮助学员成长为优秀的软件设计师!当学员完成了Java等语言的学习之后,或者从事 软件开发一段时间之后,面对一个需要开发的新软件系统: 该如何入手呢?定义多少个模块?定义多少个类...

Global site tag (gtag.js) - Google Analytics