(C++编程规范第5条)一个实体应该只有一个紧凑的职责

来源:互联网 发布:软件工程质量 编辑:程序博客网 时间:2024/05/22 03:24

一、摘要:

一次只解决一个问题:只给一个实体(变量、函数、类、模块、命名控件和库)赋予一个定义良好的职责。随着实体变大,其职责范围自然也会扩大,但是职责不应该发散。

二、讨论:

     人们常说,好的商业理念能够一言以蔽之。同样,每个程序实体也应该只有一个明确的目的。

如果一个实体有几个不同的目的,则给使用带来的难度往往会激增,因为这种实体除了会增加理解难度、复杂性和各部分中的错误外,还会导致其他问题。这种实体不仅更大(常常毫无合理理由),而且更难以使用和维护。此外,这种实体经常会为自身的一些特殊用途提供有问题的接口,因为各个功能领域之间的部分重叠,会影响干净利落地实现每个功能所需的洞察力。

具有多个不同职责的实体通常都是难以设计和实现的。“多个职责”经常意味着“多重性格”——可能的行为和状态的各种组合方式。应该选择目的单一的函数(见第39条),小而且目的单一的类,和边界清晰的紧凑模块。

应该用较小的低层抽象构建更高层次的抽象。要避免将几个低层次抽象集合成一个较大的低层次抽象聚合体。用几个简单的行为来实现一个复杂的行为,比反其道而行之更加容易。

三、示例:

例1     realloc     在标准C语言中,realloc是一个臭名昭著的不良设计。这个函数承担了太多的任务:如果传入的指针参数为NULL就分配内存空间,如果传入的大小参数为0就释放内存空间,如果可行则就地重新分配,如果不行则移到其他地方分配。这个函数不易与扩展,普遍认为:他是一个目光短浅的失败设计。

例2     basic_string     在标准C++语言中,std::basic_string是另一个臭名昭著的不良设计——巨大的类设计。在一个臃肿的类中添加了太多”多多益善“的功能,而这只是为了试图成为容器但却没有做到,在用迭代还是索引上犹豫不决,还毫无道理地重复了许多标准算法,而为扩展所留的裕度又很小(见第44条的示例)。

1 0
原创粉丝点击