可取的内聚性

5.3.1 可取的内聚性
内聚性的想法是由 Wayne Stevens,Glenford Myers 和 Larry Constantine 等人在 1974 年发表
的一篇论文中提出来的,从那以后,这个想法的某些部分又逐渐得到了完善。以下是一些通常
认为是可以接受的一些内聚类型:
功能内聚性。功能内聚性是最强也是最好的一种内聚,当程序执行一项并且仅仅是一项工
作时,就是这种内聚性,这种内聚性的例子有: sin(), GetCustomerName(), EraseFile(),
第五章 高质量子程序的特点 53
CaldoanPayment()和 GetIconlocation()等等。当然,这个评价只有在子程序的名称与其实际内容
相符时才成立。如果它们同时还作其它工作,那么它们的内聚性就要低得多而且命名也不恰当。
顺序内聚性。顺序内聚性是指在子程序内包含需要按特定顺序进行的、逐步分享数据而又
不形成一个完整功能的操作,假设一个子程序包括五个操作:打开文件、读文件、进行两个计
算、输出结果、关闭文件。如果这些操作是由两个子程序完成的,DoStep1()打开文件、读文件
和计算操作,而 DoStep2()则进行输出结果和关闭文件操作。这两个子程序都具有顺序内聚性。
因为用这种方式把操作分隔开来,并没有产生出独立的功能。
但是,如果用一个叫作 GetFileData()的子程序进行打开文件和读文件的操作,那么这个子
程序将具有功能内聚性。当操作来完成一项功能时,它们就可以形成一个具有功能内聚性的子
程序。实际上,如果能用一个很典型的动宾词组来命名一个子程序,那么它往往是功能内聚性,
而不是顺序内聚性。给一个顺序内聚性的子程序命名是非常困难的,于是便产生了像 Dostep1()
这种模棱两可的名字。这往往意味着你需要重新组织和设计子程序,以使它是功能内聚性的。
通讯内聚性。通讯内聚性是在一个子程序中,两个操作只是使用相同数据,而不存在其它
任何联系时产生的。比如,在 GetNameAndChangePhoneNumber()这个子程序中,如果 Name 和
PhoneNumber 是放在同一个用户记录中的,那么这个子程序就是通讯内聚性。这个子程序从事
的是两项而不是一项工作,因此,它不具备功能内聚性。Name 和 PhoneNamber 都存储在用户
记录中,不必按照某一特定顺序来读取它们,所以,它也不具备顺序内聚性。
这个意义上的内聚性还是可以接受的。在实际中,一个系统可能需要在读取一个名字的同
时变更电话号码。一个含有这类子程序的系统可能有些显得别扭,但仍然很清楚且维护性也不
算差,当然从美学角度来说,它与那些只作一项工作的子程序还有一定差距。
临时内聚性。因为同时执行的原因才被放入同一个子程序里,这时产生临时内聚性。典型
的例子有;Startup(),CompleteNewEmployee(),Shutdown()等等,有些程序员认为临时内聚性是
不可接受的,因为它们有时与拙劣的编程联系在一切,比如,在像 Startup()这类子程序中往往含
有东拼西凑的杂烩般的代码。
要避免这个问题,可以把临时内聚性子程序设计成一系列工作的组织者。前述的 Startup
()子程序进行的操作可能包括:读取一个配置文件、初始化一个临时文件、建立内存管理、显示
初始化屏幕。要想使它最有效地完成这些任务,可以让这个子程序去调用其它的专门功能的子
程序,而不是由它自己直接来完成这些任务。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值