软件设计的臭味

来源:互联网 发布:淘宝助理有mac版吗 编辑:程序博客网 时间:2024/03/29 00:43
最近几天在看《敏捷设计实践》这本书,里面总结了在软件设计中常见的设计臭味,结合自己的工作经验来看,身同感受。
1、僵化性
     僵化性是指难以对软件进行改动,即使是简单的改动。如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。必须要改动的模块越多,设计就越僵化。
2、脆弱性
    脆弱性是指,在进行一个改动时,程序的许多地方就可能出现问题。常常是,出现新问题的地方与改动的地方与改动的地方并没有概念上的关联。要修正这些问题就又会引出更多的问题,从而使开发团队就像一只不停追逐自己尾巴的狗一样。
    随着模块脆弱性的增加,改动会引出意想不到的问题的可能行越来越大。这看起来很荒谬,但是这样的模块是非常常见的。这些模块需要不断的修补--它们从来不会被从错误列表中去掉,开发人员知道需要对它们进行重新设计,你越是修正它们,它们就变得越糟糕。
3、牢固性
    牢固性是指,设计中包含了对其它系统有用的部分,但是要把这些部分从系统中分离出来所需要的努力和风险是巨大的。这是一件令人遗憾的事,但却是非常常见的事。
4、粘滞性
    粘滞性有两种表现形式:软件的粘滞性和环境的粘滞性。
    当面临一个改动时,开发人员常常发现会有多种改动方法。其中,一些方法会保持设计;而另外一些会破坏设计(也就是生硬的方法)。当那些可以保持系统设计的方法比那些生硬的方法更难应用时,就表明设计具有较高的粘滞性。做错误的事情是容易的,但是做正确的事情却很难。我们希望在软件设计中,可以容易地进行那些保持设计的变动。
    当开发环境迟钝、低效时,就会产生环境的粘滞性。例如,如果编译所花费的时间很长,那么开发人员就会被引诱去做不会导致大规模重编译的改动,即使那些改动不再保持设计。如果源代码控制系统需要几个小时去Check in仅仅几个文件,那么开发人员就会被引诱去做那些需要尽可能少Check in的改动,而不管改动是否会保持设计。
    无论项目具有哪种粘滞性,都很难保持项目中的软件设计。我们希望创建易于保持设计的系统和项目环境。
5、不必要的复杂性
    如果设计中包含有当前没有用的组成部分,它就包含有不必要的复杂性。当开发人员预测需求的变化,并在软件中放置了那些潜在变化的代码时,常常会出现这种情况。起初,这样看起来像是一件好事。毕竟,为将来的变化做准备会保持代码的纯洁性,并且可以避免以后再进行痛苦的改动。
    糟糕的是,结果常常正好相反。为过多的可能性做准备,致使设计中包含有绝不会用到的结构,从而变得混乱。
6、不必要的重复
    复制和粘贴也许是有用的文本编辑操作,但是它们却是灾难性的代码编辑操作。时常软件系统都是构建于众多重复的代码片段上。
    当同样的代码以稍微不同的形式一再出现时,就表示开发人员忽视了抽象。对于他们来说,发现所有的重复并通过适当的抽象去消除它们的做法可能没有高的优先级别,但是这样做非常有助于使系统更加易于理解和维护。
    当系统中有重复的代码时,对系统进行改动会很困难。在一个重复的代码体中发现的错误必须要在每个重复体中一一修正。
7、晦涩性

     晦涩性是指模块难以理解。


臭味的产生

    设计的臭味性是由于需求的变化导致没有按照预先设定的架构模式进行设计,又没有保持代码的简单,干净,一点点的积累下来,就产生了设计的臭味。如果由于需求的变化而导致我们项目的失败,那就表明我们的设计和实践本身是有缺陷的,我们必须找到一种方法,使我们的设计能够应对这种变化而富有弹性。

    敏捷团队依靠需求变化来获取活力。他们不进行预先(up-front)设计,因此,不需要一个成熟的初始设计。他们更愿意保持系统尽可能的干净,并使用许多单元测试和验收测试作为支援。


原创粉丝点击