Posted on 2011-11-20 10:56
C小加 阅读(1217)
评论(0) 编辑 收藏 引用
实体:变量、类、函数、名称空间、模板和库。
只给一个实体赋予一个定义良好的职责。随着实体变大,其职责范围自然也会扩大,但不应该发散。
如果一个实体有几个不同的目的,则给使用带来的难度往往会激增,因为这种实体除了会增加理解难度、复杂性和各部分中的错误外,还会导致其他问题。这种实体不仅更大,而且更难以使用和维护。此外,这种实体经常会为自身的一些特定用途提供有问题的接口,因为各个功能领域之间的部分重叠,会影响干净利落地实现每个功能所需的洞察力。
具有多个不同职责的实体通常都是难于设计和实现的。“多个职责”经常意味着“多重性格”----可能的行为和状态的各种组合方式。应该选择目的单一的函数,小而且目的单一的类,和边界清晰的紧凑模块。
应该用较小的底层抽象构建更高层次的抽象。要避免将几个底层抽象集合成一个较大的低层次抽象聚合体。用几个简单的行为来实现一个复杂的行为,比反其道而行之更加容易。
在标准C语言中,realloc是一个臭名昭著的不良设计。这个函数承担了太多的任务:如果传入的指针参数为NULL就分配内存空间,如果传入的大小参数为0就释放内存空间,如果可行则就地重新分配,如果不行则移到其他地方分配。这个函数不易于扩展,普遍认为它是一个目光短浅的失败设计。
在标准C++语言中,std::basic_string是另一个臭名昭著的不良设计----巨大的类的设计。在一个臃肿的类中添加了太多“多多益善”的功能,而这只是为了试图成为容器但却没有做到,在用迭代还是索引上犹豫不决,还毫无道理地重复了许多标准算法,而为扩展所留的宽裕度又很小。