0

0

浅谈GRASP软件开发模式

怪我咯

怪我咯

发布时间:2017-03-31 11:52:33

|

2075人浏览过

|

来源于php中文网

原创

你是一个优秀软件开发人员吗?你知道grasp吗?grasp软件开发模式,全称通用职责分配软件模式(general responsibility assignment software patterns),是与著名的软件模式gof(gang 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呢?有没有一个基本原则呢?有,那就是按照职责分配任务。虽然从理论上说,我可以任意定义对象,可以让对象没有任何意义,或者去完成任意的工作,但是通常我们不会这样去设计。通常我们会将对象与现实世界的对象联系起来,比如设计一个评审计划对象、评审者对象。并且我们在设计对象的时候应当做到“低表示差异”。低表示差异就是我们设计的对象应当与现实世界的对象尽量一致。比如说我们设计一个对象叫“评审者”,是因为我们在现实世界中有评审者。同时,我们为评审者对象赋予的行为也应当尽量与现实世界一致,比如增加评审者、修改评审者、得到评审者信息。那么哪些是这个对象应当赋予的行为呢,这应当由职责来决定。
我们通过对现实世界的分析,或者说对于领域模型的分析,设计出了软件系统中的对象,这时候我们应当为每一个对象分配职责。什么是对象的职责呢,当然是通过对现实世界的分析,定义的这个对象应当完成的任务。比如评审者对象的职责是存取与评审者相关的数据。当然对象的职责不一定是一个,比如评审计划包含了评审对象和评审者的子项,所以它在工作不繁忙的情况下可以代理处理评审对象和评审者的信息存取。但是一个对象的职责不应当过多(也就2、3个就行了)并且高度相关。比如评审表对象如果分配职责处理评审表的同时,又去处理评审计划的数据,这就叫职责无关。
职责分配现在已经被普遍认为是一个优秀的软件设计应当遵循的原则,它有以下好处:
1.低表示差异使软件结构清晰,易于理解,因为软件开发并不是一个人的事情。在多人共同开发的软件项目中,一目了然的软件结构可以避免开发人员因误解而造成的不必要错误。
2.易于维护和变更。假如评审计划出了问题或需要修改,我们就去找评审计划,如果是评审者的问题我们就去找评审者,而绝对不会与其它对象有关。
这种通过考虑对象、职责、协作的对象设计及构件方式,被称为“职责驱动设计(RDD,Responsibility Drive Design)”。职责驱动设计是通过先设计用例模型、用例模型描述、操作契约、系统顺序图、领域模型、词汇表,再一步步制作分析模型、设计模型,写出每个功能的交互图、类图的很复杂的过程,我在这里就不再详述了。但是请大家注意一个非常重要的细节,前面我们说,软件系统中的对象是根据现实世界抽象得到,对象职责的分配是根据对象的定义,分配一些不多并且高度相关的任务。然而我们即使遵照这些原则,也有相当大的设计弹性空间,不同人根据自己的理解,对于同一个功能依然有各自不同的设计。GRASP中文译为“通用职责分配软件模式”,就是对对象分析和设计中职责分配问题提出数个基本原则。同时,这几个基本原则也应当掌握一个度,即并不是所有情况下都适用,也不是一个绝对的指标。比如低耦合,并不是绝对的不耦合,不耦合软件就没法设计了;高内聚也不能无限度地高内聚,否则系统就繁复异常了。


二.GRASP模式挨个析

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

ShopWind网店系统
ShopWind网店系统

ShopWind网店系统是国内最专业的网店程序之一,采用ASP语言设计开发,速度快、性能好、安全性高。ShopWind网店购物系统提供性化的后台管理界面,标准的网上商店管理模式和强大的网店软件后台管理功能。ShopWind网店系统提供了灵活强大的模板机制,内置多套免费精美模板,同时可在后台任意更换,让您即刻快速建立不同的网店外观。同时您可以对网模板自定义设计,建立个性化网店形象。ShopWind网

下载

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

391

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

135

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

233

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

8

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

13

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

10

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

124

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

98

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.6万人学习

Rust 教程
Rust 教程

共28课时 | 5万人学习

Vue 教程
Vue 教程

共42课时 | 7.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号