L
linuxping
Unregistered / Unconfirmed
GUEST, unregistred user!
软件系统的源代码就是他的主要设计文档。用来描绘源代码的其他图示等只是设计的附属,而不是设计本身。我们的软件出了什么错?在设计开始,我们的大脑中都构想出了软件设计出来后的样子。接着,随着设计步伐,事情开始变得糟糕。软件就像一块坏面包开始腐化。随着时间的流逝,腐化蔓延,滋生,丑陋的痛处和暗疮到处都是。使得软件越来越难以维护。即使进行简单的更改也需要花费巨大的精力。牵一发,而动全身。最后,以至于我们自己都觉得要重新设计。然而,即使重新设计,我们依旧堕入了这个怪圈。什么时候我们的软件开始出错--------腐化的气味。1,僵化性 很难对软件进行改动,因为每个改动都迫使我们对软件的其它模块进行改动。 当我们被要求进行一个改动,这个改动看起来微不足道。在动手修改之前,我们对所需的工作量作了一个预测。但是当动手进行修改时,许多改动带来的影响自己都没有预料到。需要改动的模块数远远超出自己的预测。最后,我们不得不悲叹:"它比我想象的要难的多!".2,脆弱性 对软件的改动,会导致和改动的模块在概念上无关的许多地方出错。 我们常常看到这样的模块,它们经常需要修改(但从来没有从错误列表中删除)。我们甚至意识到要对它们进行重新设计,却不愿意面对重新设计的重重困难。最后,我们越是修改它,它就变得越糟!3,牢固性 很难解开模块间的耦合,使之可以成为其它软件中重用的组件。设计中包含了对其它系统有用的部分,但是要把这些部分从系统中分离,所需的努力和风险是巨大的。4,不必要的复杂性 设计中包含有不具有任何好处的基础结构。我们经常会预测需求的变化,并在程序中放置了处理这些“未来的“需求变化的代码。起初,这可能是一件好事。毕竟,为将来的变化做准备,会保持代码的灵活性。然而,为过多的可能性做准备,致使设计中包含了绝对用不到的部分。这使得设计变得复杂,难于理解。5,不必要的重复 设计中包含有重复结构,这些重复本可以使用单一的抽象统一。当几乎相同的代码重复出现时,这就意味着我们忽视了抽象。我们有必要使用抽象来消除重复。因为太多的重复导致系统难于修正。当需要修正重复体时,我们必须要修正每个重复体中的错误,然而,每个重复体之间又有细微的差别,修正的方法又不尽相同!6,晦涩性 代码没有很好地表现软件设计者的意图,从而不易阅读,很难理解。我曾经遇到这样一个尴尬的事情:我被要求去修改一个模块。当我打开这个模块的代码时,我发现我无法理解它的思路。我抱怨:“是谁写了这样晦涩,难于理解的代码。应该让它来维护!”。回答是:“这是你XX个月之前写的”。设计者应该站在阅读者的位置来撰写代码,并对代码进行重构。是什么激发了软件的腐化?