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

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

阅读更多
在上一章(原创)一个优秀软件开发人员的必修课:GRASP(2)低耦合中我聊了聊低耦合,今天我想再聊聊与低耦合休戚相关、GRASP的另一个重要的模式:高内聚。

2.高内聚(High Cohesion

高内聚是另一个普遍用来评判软件设计质量的标准。内聚,更为专业的说法叫功能内聚,是对软件系统中元素职责相关性和集中度的度量。如果元素具有高度相关的职责,除了这些职责内的任务,没有其它过多的工作,那么该元素就具有高内聚性,反之则为低内聚性。高内聚要求软件系统中的各个元素具有较高的协作性,因为在我们在完成软件需求中的一个功能,可能需要做各种事情,但是具有高内聚性的一个元素,只完成它职责内的事情,而把那些不在它职责内的事情拿去请求别人来完成。这就好像,如果我是一个项目经理,我的职责是监控和协调我的项目各个阶段的工作。当我的项目进入需求分析阶段,我会请求需求分析员来完成;当我的项目进入开发阶段,我会请求软件开发人员来完成;当我的项目需要测试的时候,我会请求测试人员。。。。。。如果我参与了开发,我就不是一个高内聚的元素,因为开发不是我的职责。

我们的项目为什么要高内聚呢?我觉得可以从可读性、复用性、可维护性和易变更性四个方面来理解。

1.可读性

一个人写文章、讲事情,条理清晰才能易于理解,这同样发生在读写软件代码上。如果一堆代码写得一团乱麻,东一个跳转西一个调用,读它的人会感觉非常头疼。这种事情也许一直在写程序的你我都曾经有过经历。如果一段程序条理非常清晰,每个类通过名称或说明都能清楚明白它的意义,类的每个属性、函数也都是易于理解的它所应当完成的任务和行为,这段程序的可读性必然提高。在软件产业越来越密集,软件产业中开发人员协作越来越紧密、分工越来越细的今天,软件可读性的要求相信也越来越为人们所重视。

2.复用性

在软件开发中,最低等级的复用是代码拷贝,然后是函数的复用、对象的复用、组件的复用。软件开发中最懒的人是最聪明的人,他们总是想到复用。在代码编写的时候突然发现某个功能是曾经实现过的功能,直接把它拷贝过来就ok了。如果这段代码在同一个对象中,那么就提出来写一个函数到处调用就行了。如果不是在同一个对象中呢,就将其抽象成一个对象到处调用吧。如果不在一个项目中呢,那就做成组件给各个项目引用吧。代码复用也使我们的代码在复用的过程中不断精化、不断健壮、提高代码质量。代码的复用的确给我们的开发带来了不少便利,但是一段代码能否在各个需要的地方都能复用呢?这给我们的软件开发质量提出了新的要求:好的代码可以复用,不好的则不行。软件中的一个对象如果能保证能完成自己职能范围内的各项任务,同时又不去理会与自己职能无关的其它任务,那么它就能够保证功能的相对独立性,也就可以脱离自己所处的环境而复用到其它环境中,这是一个具有内聚性的对象。

3.可维护性和易变更性

在前面《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件》中我提到,我们现在的软件是在不断变更的,这种变更不仅来自于我们的客户,更来自于我们的市场。如果我们的软件通过变更能及时适应我们的市场需求,我们就可以在市场竞争中获胜。如何能及时变更以适应我们的市场呢,就是通过调整软件的结构,使我们每次的变更付出的代价最小,耗费的人力最小,这种变更才最快最经济。高内聚的软件,每个系统、模块、类的任务都高度相关,就使每一次的变更涉及的范围缩小到最小。比如评审表发生了变更,只会与评审表对象有关,我们不会去更改其它的对象。如果我们能做到这一点,我们的系统当然是可维护性好、易变更性好的系统。

那么,我们如何做到高内聚呢?就拿前面我提到的评审项目举例。我现在要为“评审表”对象编写一段填写并保存评审表的代码。评审表对象的职责是更新和查询评审表的数据,但是在显示一个要填写的评审表的时候,我需要显示该评审计划的名称、该评审计划有哪些评审对象需要评审。现在我如何编写显示一个要填写的评审表的代码?我在评审表对象的这个相应的函数中编写一段查询评审计划和评审对象的代码吗?假如你这样做了,你的代码就不是高内聚的,因为查询评审计划和评审对象的数据不是它的职责。正确的方法应当去请求“评审计划”对象和“评审对象”对象来完成这些工作,而“评审表”对象只是获取其结果。

另外,如果一个对象要完成一个虽然在自己职责范围内,但过程非常复杂的任务时,也应当将该任务分解成数个功能相对独立的子函数来完成。我曾经看见一个朋友写的数百行的一个函数,让人读起来非常费劲。同时这样的函数中一些相对独立的代码,本可以复用到其它代码中,也变成了不可能。所以我给大家的建议是,不要写太长的函数,超过一百行就可以考虑将一些功能分解出去。

与“低耦合”一样,高内聚也不是一个绝对,而是一个相对的指标,应当适当而不能过度。正如我们在现实生活中,如果在一个十来人的小公司,每个人的分工可能会粗一些,所分配的职责会广一些杂一些,因为其总体的任务少;而如果在一个一两百人的大公司,每个人的分工会细一些,所分配的任务会更加专一些,因为总体任务多,更需要专业化的分工来提高效率。软件开发也是一样,如果“评审计划”对象完成的业务功能少,并且不复杂,它完全可以代理它的子表“评审对象”和“评审者”的管理。但是“评审计划”对象需要完成的“对评审计划表的管理”这个基本职责包含的业务功能繁多或者复杂,它就应当将“对评审对象表的管理”交给“评审对象”对象,将“对评审者表的管理”交给“评审者”对象。同样,高内聚的可维护性好、易变更性好只能是一个相对的指标。如果一个变更的确是大范围的变更,你永远不可能通过内聚就不进行大范围的变更了。同时内聚也是要付出代价的,所以你也不必要去为了一个不太可能的变更去进行过度设计,应当掌握一个度。过度的内聚必将增加系统中元素之间的依赖,提高耦合度。所以“高内聚”与“低耦合”是矛盾的,必须权衡利弊,综合地去处理。在李洋等人翻译的《UML和模式应用》中,将内聚和耦合翻译为软件工程中的阴与阳,是中国人对内聚和耦合的最佳解释。

综上所述,“高内聚”给软件项目带来的优点是:可读性强、易维护和变更、支持低耦合、移植和重用性强。

分享到:
评论
3 楼 fangang 2007-01-31  
不夸张地说,成为一位优秀的开发人员,GRASP是一个捷径
2 楼 fangang 2007-01-31  
认真领会GRASP中的各个模式,特别是认真体会它们精髓,然后再审视一遍你自己写过的代码,你就会发现有许多可以改进的地方。
1 楼 sjx003123 2007-01-31  
学习下,呵呵,我是个开发人员,我感觉自己写的代码太烂了,需要学习的太多了

相关推荐

    对grasp的理解和应用

    总结来说,GRASP原则是软件设计中的重要指导思想,特别是高内聚和低耦合原则,它们有助于构建出易于维护、可扩展的软件系统。通过理解并应用这些原则,开发者可以更好地组织代码,提高团队协作效率,以及应对未来...

    GRASP模式简介

    高聚合度或高内聚模式的核心思想是分配一个职责的时候要保持类的高聚合度。高聚合度或内聚度是一个类中的各个职责之间相关程度和集中程度的度量。一个具有高度相关职责的类并且这个类所能完成的工作量不是特别巨大,...

    GRASP\GRASP_source.rar

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

    OOD原则 GRASP GOF

    这意味着每个类都应有一个明确且单一的职责,避免职责混杂导致代码耦合度过高。 2. **开闭原则(Open-Closed Principle, OCP)**: 类应该是对扩展开放的,对修改关闭的。当需要增加新功能时,可以通过扩展已有类...

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

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

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

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

    java\软件设计中的原则(GRASP)

    3. 高聚合度或高内聚(High Cohesion):在分配职责时,应确保类的高聚合度,即类中的所有方法和属性都紧密相关,只完成一个主要的任务。这有助于保持类的简单性和专注性。 4. 低耦合度或低耦合(Low Coupling):...

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

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

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

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

    管家婆grasp7.1完美版本

    【管家婆GRASP 7.1 完美版本】是一款针对中小型企业设计的全面企业管理软件,旨在帮助企业高效管理财务、进销存、生产等业务环节。这款软件以其稳定性、易用性和功能全面性赢得了广大用户的青睐。在描述中提到的问题...

    UML-GRASP模式简述

    4. 高内聚(High Cohesion)模式:分配一个职责的时候要保持类的高聚合度。 5. 控制者(Controller)模式:将处理系统事件消息的职责分派给代表下列事物的类。 6. 多态(Polymorphism)模式:将行为的职责使用多态的...

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

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

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

    在软件开发过程中,设计原则是指导开发者构建高效、可维护和扩展软件系统的重要准则。这些原则不仅提高了代码质量,还能确保团队之间的沟通清晰,降低维护成本。以下将详细阐述一些核心的软件开发设计原则。 1. **...

    Python库 | grasp_nms-1.0.2.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:grasp_nms-1.0.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

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

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

Global site tag (gtag.js) - Google Analytics