一个好的设计应当具备哪些要素
原创
©著作权归作者所有:来自51CTO博客作者李云的原创作品,请联系作者获取转载授权,否则将追究法律责任
对于一个好的设计,我们往往会说其应当具备可维护性,这是最为基本的要求。其它的要求,比如性能、资源的占用等都应当在满足可维护性的情况下再去考虑的。但可维护性是一个非常笼统的词,可以说一个词包含了很多的东西,比如,可读性、可扩展性等等,都可以当作是可维护性的内容。我在日常工作中,对于一个好的设计,有一些自己的想法,主要是体现在“四性一痛”。
第一,一个好的设计应当具有“一致性”。一致性就是对于相类似的问题采用同样的方法去处理,而不是对于类似的情况,在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()。完整性好的设计往往给模块的使用者带来某种程度的灵活性和便利性。
第三,模块之间的“正交性”。正交性体现在模块之间不应当存在功能重叠的部分,对于模块之间存在重叠的部分,往往表明我们需要抽象出另一个模块,从而将重叠的部分转移到这一新模块中。
第四,设计的“简单性”。这里的简单不是指我们考虑欠缺,而是指在我们将问题考虑周全后,找出一种简单的设计和实现方法。简单性包括代码逻辑的简单性和代码语句的简单性。简单意味着容易维护、理解,简单本身就是一种美!
最后,我想对于一个好的设计,作者可以问问自己:我在设计这个模块时“痛苦”过了吗?如果没有,那存在两种可能;一是问题很简单或是我们自己的水平很高,所以不需要更多的思考去实现它;另一种可能就是这一设计有可能是一个“头痛治头,脚痛治脚”的设计。好的设计,我们往往需要在很多方面进行权衡,在设计初期是非常痛苦的一件事,但随着设计的完善,我们会发现“这一设计就是我想要的、就应当是这个样子的”,到时自己会觉得这个设计很舒服,真的体现了“苦尽甘来”。
对于上面所提到的一些好的设计的特点,在我们的工作中可能不是一次性设计到位的,但是我们必须将这些特点记在心中,并随着工作的进展最后实现它们。
上一篇:单元测试的重要性
下一篇:一个花费数千人民币的设计缺陷
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
封装一个工具类,拒绝重复代码!
封装一个工具类,拒绝重复代码!
List 字段 工具类 -
如何设计一个通用的 Excel 导入导出功能?
如何设计一个通用的 Excel 导入导出功能?
List 数据 User -
设计复数类java 设计一个复数类
问题描述:设计一个复数类,要求 (1)在复数内部用双精度浮点数定义其实部和虚部 (2)实现3个构造函数;第1个构造函数没有参数;  
设计复数类java 成员变量 构造函数 构造方法