一个好的设计应当具备哪些要素

  对于一个好的设计,我们往往会说其应当具备可维护性,这是最为基本的要求。其它的要求,比如性能、资源的占用等都应当在满足可维护性的情况下再去考虑的。但可维护性是一个非常笼统的词,可以说一个词包含了很多的东西,比如,可读性、可扩展性等等,都可以当作是可维护性的内容。我在日常工作中,对于一个好的设计,有一些自己的想法,主要是体现在“四性一痛”。

 
    第一,一个好的设计应当具有“一致性”。一致性就是对于相类似的问题采用同样的方法去处理,而不是对于类似的情况,在case1中采用的是设计A,而在case2中采用的是设计B。对于这种设计,其往往很难维护。需要说明的一点是,一致性可以包括设计方法的一致性、函数命名的一致性、注释书写格式的一致性等等。在一致性上一个好的例子是:UNIX/LINUX中对于文件和设备的处理都是采用open()/close()/ioctl()/read()/write()这五个函数来实现的,当我们在UNIX/LINUX上编程时,只要说到打开设备或是文件,我们就知道应当如何做了。再来看看一致性不好的一个例子:比如CLIB中的malloc()/free(),这是一对用于分配和释放内存(Heap)的函数,在函数的命名上应当说其一致性并不好,在我看来malloc()/mfree()就要比它好些,不同之处就是在free()函数名的前面加了一个m。一致性好的软件,不论是维护或是阅读都让人觉得舒服和自然,这一点是非常重要的!
 
    第二,一个好的设计应当具有“完整性”。打一个比方,比如我们的程序需要写一个模块用于管理某种类型的资源,因此,我们写了一个allocate()函数用于对这一资源进行分配。从完整性的角度来看有allocate()就应当有free()或是release()。因此,我们的设计应当包含free()或是release()。完整性好的设计往往给模块的使用者带来某种程度的灵活性和便利性。
 
    第三,模块之间的“正交性”。正交性体现在模块之间不应当存在功能重叠的部分,对于模块之间存在重叠的部分,往往表明我们需要抽象出另一个模块,从而将重叠的部分转移到这一新模块中。
 
    第四,设计的“简单性”。简单性包括代码逻辑的简单性和代码语句的简单性,简单意味着容易维护、理解。简单本身也是一种美。
 
    最后,我想对于一个好的设计,作者可以问问自己:我在设计这个模块时“痛苦”过了吗?如果没有,那存在两种可能;一是问题很简单或是我们自己的水平很高,所以不需要更多的思考去实现它;另一种可能就是这一设计有可能是一个“头痛治头,脚痛治脚”的设计。好的设计,我们往往需要在很多方面进行权衡,在设计初期是非常痛苦的一件事,但随着设计的完善,我们会发现“这一设计就是我想要的、就应当是这个样子的”,到时自己会觉得这个设计很舒服,真的体现了“苦尽甘来”。
 
    对于上面所提到的一些好的设计的特点,在我们的工作中可能不是一次性设计到位的,但是我们必须将这些特点记在心中,并随着工作的进展最后实现它们。

本文出自 “李云” 博客,请务必保留此出处http://yunli.blog.51cto.com/831344/168867

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章