`
fangang
  • 浏览: 876425 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
311c4c32-b171-3767-b974-d26acf661fb2
谈谈用例模型的那些事儿
浏览量:38614
767c50c5-189c-3525-a93f-5884d146ee78
一次迭代式开发的研究
浏览量:68792
03a3e133-6080-3bc8-a960-9d915ed9eabc
我们应当怎样做需求分析
浏览量:409820
753f3c56-c831-3add-ba41-b3b70d6d913f
重构,是这样干的
浏览量:91338
社区版块
存档分类
最新评论

(原创)一个优秀软件开发人员的必修课:GRASP软件开发模式浅析

阅读更多
 

你是一个优秀软件开发人员吗?你知道GRASP吗?GRASP软件开发模式,全称通用职责分配软件模式(General Responsibility Assignment Software Patterns),是与著名的软件模式GoFGang of Four,即我们常说的那23种软件开发模式)齐名的另一种软件开发模式。但是与GoF不同的是,它并不是提出一些具体的软件组织结构,而是提出,在将现实世界的业务功能抽象成软件开发中具体对象的过程中,我们应当遵循的一些基本原则。遵循这些基本原则,我们才可以开发出高质量的软件出来。对于我们要开发的软件项目,我们可以不使用工厂模式、可以不使用单例模式、我们也可以不使用观察者模式,但是我们不可能不将现实世界的业务功能抽象成软件开发中具体对象。从这个角度说,我们要提高自己的软件开发质量,深入理解GRASP比深入理解GoF更重要。但是我看到现在介绍GoF的文章多,介绍GRASP文章少。正因为如此,我现在把GRASP介绍给大家。

GRASP包含了9个模式,也就是9个基本原则。这在软件设计大师Craig Larman的经典著作《UML和模式应用》中进行了深入地讲解。GRASP叫通用职责分配软件模式,要理解GRASP,我们首先必须理解的一个问题是,我们在对象分析和设计过程中为什么要进行职责分配。
 

一.职责分配和职责驱动设计

在一个软件项目开始的时候,我们通常需要进行需求分析,了解客户需要设计一个什么样的软件,这个软件中应当有什么功能。需求分析了解到的是现实世界中客户需求的业务功能,每个业务功能往往是一个业务流程,即客户在日常工作中不断在完成的业务流程。同时,在用户的问题世界中,必然有一些东西或者说事物,它们之间存在着相互的关联。

拿一个软件评审管理系统作为一个例子吧。评审管理系统的业务需求如下:

1.评审组织者制订评审计划,提交领导审批,然后通过邮件通知评审者。

2.评审者接到通知,分别对评审对象进行评审,填写评审表,并可以对评审对象提出疑问。

3.评审组织者汇总评审者的疑问,召开评审会议讨论这些疑问。在会上,有些疑问变为问题,有些疑问不是问题,有些则依然不能够确认。

4.会后,评审组织者整理疑问,形成评审报告,然后由评审者分别表决该评审是否通过。最后评审组织者汇总表决结果,形成评审结论。

5.评审组织者跟踪问题的解决。

通过以上需求的描述,我们不难发现整个问题世界中的相关事物:评审组织者、评审计划、评审者、评审对象、评审表、疑问、评审报告、评审结论、问题。我们也不难分析出这些事物相互关系,比如评审计划与评审者是一对多,而评审报告与评审结论是一对一。

RUP中,业务需求将形成用例模型及其描述文档中的用例,事物及其关系将形成领域模型中的对象,当然如何制作用例模型和领域模型超出了本文讨论的范围,有兴趣的朋友可以看看相关文章。

领域模型中的对象将成为软件开发中形成具体对象的基础(软件开发中形成什么对象是根据软件开发的具体需求而定的,并不一定要与领域模型的对象一致)。用例模型中的用例,将通过赋予这些对象行为而得以实现。现在的问题就出来了,用例模型中的功能,或者说一系列行为,应当如何分配给这些对象呢。也就是说,为了完成同一个任务,我可以将行为A交给对象X,也可以交给对象Y。虽然交给对象X与交给对象Y,我对行为A的具体实现不一样,但是都可以完成行为A的任务。那么,我到底应当交给对象X还是对象Y呢?有没有一个基本原则呢?有,那就是按照职责分配任务。虽然从理论上说,我可以任意定义对象,可以让对象没有任何意义,或者去完成任意的工作,但是通常我们不会这样去设计。通常我们会将对象与现实世界的对象联系起来,比如设计一个评审计划对象、评审者对象。并且我们在设计对象的时候应当做到“低表示差异”。低表示差异就是我们设计的对象应当与现实世界的对象尽量一致。比如说我们设计一个对象叫“评审者”,是因为我们在现实世界中有评审者。同时,我们为评审者对象赋予的行为也应当尽量与现实世界一致,比如增加评审者、修改评审者、得到评审者信息。那么哪些是这个对象应当赋予的行为呢,这应当由职责来决定。

我们通过对现实世界的分析,或者说对于领域模型的分析,设计出了软件系统中的对象,这时候我们应当为每一个对象分配职责。什么是对象的职责呢,当然是通过对现实世界的分析,定义的这个对象应当完成的任务。比如评审者对象的职责是存取与评审者相关的数据。当然对象的职责不一定是一个,比如评审计划包含了评审对象和评审者的子项,所以它在工作不繁忙的情况下可以代理处理评审对象和评审者的信息存取。但是一个对象的职责不应当过多(也就23个就行了)并且高度相关。比如评审表对象如果分配职责处理评审表的同时,又去处理评审计划的数据,这就叫职责无关。

职责分配现在已经被普遍认为是一个优秀的软件设计应当遵循的原则,它有以下好处:

1.低表示差异使软件结构清晰,易于理解,因为软件开发并不是一个人的事情。在多人共同开发的软件项目中,一目了然的软件结构可以避免开发人员因误解而造成的不必要错误。

2.易于维护和变更。假如评审计划出了问题或需要修改,我们就去找评审计划,如果是评审者的问题我们就去找评审者,而绝对不会与其它对象有关。

这种通过考虑对象、职责、协作的对象设计及构件方式,被称为“职责驱动设计(RDDResponsibility Drive Design)”。职责驱动设计是通过先设计用例模型、用例模型描述、操作契约、系统顺序图、领域模型、词汇表,再一步步制作分析模型、设计模型,写出每个功能的交互图、类图的很复杂的过程,我在这里就不再详述了。但是请大家注意一个非常重要的细节,前面我们说,软件系统中的对象是根据现实世界抽象得到,对象职责的分配是根据对象的定义,分配一些不多并且高度相关的任务。然而我们即使遵照这些原则,也有相当大的设计弹性空间,不同人根据自己的理解,对于同一个功能依然有各自不同的设计。GRASP中文译为“通用职责分配软件模式”,就是对对象分析和设计中职责分配问题提出数个基本原则。同时,这几个基本原则也应当掌握一个度,即并不是所有情况下都适用,也不是一个绝对的指标。比如低耦合,并不是绝对的不耦合,不耦合软件就没法设计了;高内聚也不能无限度地高内聚,否则系统就繁复异常了。

 

二.GRASP模式挨个析

GRASP软件设计模式包括9个模式:创建者、信息专家、低耦合、控制器、高内聚、多态性、纯虚构、间接性、防止变异。

(原创)一个优秀软件开发人员的必修课:GRASP(2)低耦合

(原创)一个优秀软件开发人员的必修课:GRASP(3)高内聚

一个对象撕心裂肺的怒吼:谁来创建我!GRASP(4)创建者模式

(待续)

分享到:
评论
14 楼 xjx_hello 2011-07-12  
13 楼 zhaonjtu 2007-05-15  
期待楼主的更多文章,还是很收益的。
12 楼 fangang 2007-01-28  
andyao 写道
RDD, grasp属于程序员的基本功,看看相关的资料理解原理并在实践中使用才是重要的。

本人一直在致力于研究软件开发过程和在软件开发过程中如何运用GRASP和GoF软件开发模式,有一些实践和体会,正在整理ing
11 楼 andyao 2007-01-27  
RDD, grasp属于程序员的基本功,看看相关的资料理解原理并在实践中使用才是重要的。
10 楼 fangang 2007-01-25  
非常感谢newman给我提的数个问题。GRASP虽好,GoF虽好,最关键是我们怎么用和啥时候用,这两个问题一直是我反复思考的问题。我正在筹划写一篇关于软件开发过程,特别是分析和设计这个阶段,如何运用GRASP和GoF的一点儿认识,期望和大家切磋切磋
9 楼 fangang 2007-01-24  
newman 写道
有点意思。不过从fangang朋友对grasp的介绍,我得到的印象是grasp跟gof作为比较有些不当,可能是我的理解有误。希望能看到fangang朋友对grasp给出一个比较明确的定义,以及适用范围,比如在软件开发生命周期中,grasp在什么阶段用合适?有哪些效用。。。等等,期待中。

grasp(General Responsibility Assignment Software Patterns),它往往适用于对象分析和设计中,即在RUP的制作分析模型和设计模型阶段。grasp有9种模式,是用于解决软件设计中的9种常见的问题,因此其效用各不一样,不能一概而论。
8 楼 fly_ever 2007-01-24  
有一本书阐述了GRASP,《深入浅出设计模式 C#/JAVA版》,06年出版的。
感觉跟GOF相比,GRASP主要是用来指导面向对象的分析和设计。
7 楼 fangang 2007-01-24  
谢谢指教,grasp和gof都是称为软件开发模式,只是描述的内容和角度不同,这相关的问题Craig Larman在《UML和模式应用》的第17章中有详细描述
6 楼 newman 2007-01-24  
有点意思。不过从fangang朋友对grasp的介绍,我得到的印象是grasp跟gof作为比较有些不当,可能是我的理解有误。希望能看到fangang朋友对grasp给出一个比较明确的定义,以及适用范围,比如在软件开发生命周期中,grasp在什么阶段用合适?有哪些效用。。。等等,期待中。
5 楼 fangang 2007-01-22  
amigobot 写道
没有下文了? 期待中。GRASP和GoF是不同类型的模式, 出发点不同。 GRASP是解决类之间如何交互, 如何设计合理, 和具体问题无关。

我同意。GRASP与GoF最大的区别,本人认为GoF往往是解决一些具体的问题,比如类的具体创建方式等等,而GRASP是解决对象分析的一些基本原则,即你如何去设计你的问题空间中的类和它们的行为,是原则性的东西。后面我会一个一个分析GRASP的9个模式,也就是9个基本原则,谢谢支持
4 楼 fangang 2007-01-22  
zuly 写道
知道名字就可以!其他的可以google!

what we need is the name , add others to google!
我写这篇文章的起因是因为我偶然在google或yahoo这样的搜索引擎搜索GRASP发现,除了国外的网站,国内网站多介绍和讨论GoF而很少介绍GRASP,即使这少量的文章也讲解非常粗略。个人认为作为优秀的开发人员,理解GRASP比GoF更重要,故写此文章。此文章后面的内容我会不断添上,谢谢支持
3 楼 zuly 2007-01-20  
知道名字就可以!其他的可以google!

what we need is the name , add others to google!
2 楼 galaxystar 2007-01-20  
感觉是一种综合体!
1 楼 amigobot 2007-01-20  
没有下文了? 期待中。GRASP和GoF是不同类型的模式, 出发点不同。 GRASP是解决类之间如何交互, 如何设计合理, 和具体问题无关。

相关推荐

    UML-GRASP模式简述

    GRASP 模式是 General Responsibility Assignment Software Pattern(通用责任分配软件模式)的缩写,这个模式出自《UML 和模式应用》。在建立概念模型时,GRASP 模式可以指导我们如何分配类的职责,解决类之间如何...

    GRASP模式简介

    GRASP 模式主要包括九大原则:专家模式、创建者模式、高聚合度或高内聚模式、低耦合度或低耦合模式、控制者模式、多态模式、纯虚构模式、中介者模式和不要和陌生人讲话模式。 1. 专家模式(Expert) 专家模式的...

    GRASP原则/模式

    GRASP模式,OO原则和设计模式的基础,原创不易,请珍惜下载

    设计模式实践-软件开发

    此时,GRASP模式可以作为一个基本的设计框架,帮助明确各个对象的责任。例如,可以通过使用`Creator`模式来决定哪个对象负责创建新的时间表项,使用`Controller`模式来处理用户输入,以及使用`Information Expert`...

    软件需求分析英文课件:Chap 7-GRASP.ppt

    软件需求分析英文课件:Chap 7-GRASP.ppt

    OOD原则 GRASP GOF

    如责任链模式、命令模式、解释器模式、迭代器模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式,关注对象之间的交互和责任分配。 3. **创建型模式(Creational Patterns)**: 如...

    软件开发设计原则软件开发设计原则

    - 一个软件实体(类、模块、函数等)应该是对扩展开放,对修改关闭。这意味着当需要新增功能时,应尽量通过扩展已有代码,而不是修改已有的代码来实现。 3. **里氏替换原则(Liskov Substitution Principle, LSP)...

    GRASP\GRASP_source.rar

    GRASP,全称为“贪婪搜索法的粗糙集理论应用”(Greedily Refined Search Algorithm using a Perturbation Heuristic),是一种在计算机科学和人工智能领域中常见的优化算法。它主要用于解决组合优化问题,如旅行商...

    UML和模式应用 中文版 高清版 pdf

    3. GRASP模式:GRASP(通用职责分配软件模式)是一种面向对象设计模式,它帮助开发人员在设计系统时分配职责给对象。这些模式提供了一组设计原则,用以指导开发人员如何构建出具有良好结构的软件系统,使得系统易于...

    原版英文 软件开发方法

    设计模式是软件开发领域中的一种重要概念,它们是经过时间考验、在特定上下文中解决常见问题的可重用解决方案模板。这些模式源自于建筑领域的克里斯托弗·亚历山大的工作,他首先提出在环境中反复出现的问题及其核心...

    使用GRASP的对象设计示例

    在本示例中,我们使用GRASP模式设计了一个简单的销售系统,包括三个主要对象:ProductCatalog、SalesLineItem和Cashier。这些对象之间的关系如下所示: * ProductCatalog对象负责提供产品信息,包括产品描述、价格...

    GRASP10[1].3.0培训教程(公开).pdf

    每一个实例都详细介绍了如何建立几何形状、进行分析和查看结果,最终通过仿真的方式来预测天线的辐射特性。 GRASP10培训教程还涉及了软件中的3D视图设置,这允许用户直观地观察和分析天线的三维几何结构以及电磁场...

    grasp:Grasp 是通用核心教室的开源 LMS

    Grasp 是一个用于公共核心课堂的开源学习管理系统。 Grasp 的主要目标是利用技术无缝融入课堂并改善师生之间的交流。入门先决条件带有 Rails 的 Ruby 2.0+ Ruby 和 PhantomJS 的安装超出了本自述文件的范围。依赖...

    软件需求分析课件:Chap 7-GRASP.ppt

    总之,GRASP作为面向对象设计的一个关键工具,能够帮助开发者在软件需求分析阶段更有效地构建对象模型,明确对象职责,优化系统结构,提升代码质量。通过理解和应用GRASP原则,开发者可以创建出更稳定、可维护和易于...

    论文研究-H-GRASP:一种基于GRASP改进的混合SAT解法器.pdf

    为了改善GRASP的局限性,提出了一种能解决含有伪布尔(PB)和合取范式(CNF)混合约束问题的新的混合算法(H-GRASP)。该新算法采用了切削平面技术来提取PB约束条件之间的推论,并把它结合到普通的蕴涵图中,分析...

    软件需求分析课件:Chap 9-Iteration 2--More GRASP.ppt

    《软件需求分析课件:Chap 9-Iteration 2--More GRASP.ppt》主要探讨了在软件开发过程中的迭代二(Elaboration Iteration 2)阶段,特别是关于对象设计模式、GRASP(一般职责分配原则,General Responsibility ...

    软件需求分析英文课件:Chap 9-Iteration 2--More GRASP.ppt

    软件需求分析英文课件:Chap 9-Iteration 2--More GRASP.ppt

Global site tag (gtag.js) - Google Analytics