简单来讲,过度设计就是进行了过多的面向将来的设计,进行了非必须的抽象封装,为系统增加了非必须的复杂度。举例,你要做一个功能模块,但你考虑到到这个系统里还有几个没有完成的模块和你要做的东西类似,所以你决定为此额外做一些抽象和封装,以便以后复用。然而到后来你开发那些一样的模块时你才发现,可能是因为抽象不足或抽象错误,你不能不重新修改之前的封装才能完成复用,致使最后本钱事实上还不如不做;或者你发现复用的部分所减少的本钱事实上还不如包装花费的本钱。 这类都是最容易见到的过度设计的例子。 技术员在学会了一些基本的设计能力之后,最容易见到也是最难克服的设计问题总是就是过度设计。上面的错误我相信大部分人都一而再,再而三的的犯过。
与过度设计相对的就是设计不足。虽然是两个相对的定义,但设计不足和过度设计绝大部分时候都是一块出现的。都是最容易见到的设计问题。设计不足不只容易见到于小白,老手也常犯。甚至我还见过有一类老技术员在历程过多次过度设计的打击之后,转向另一个极端,否定抽象封装有哪些用途,走上“反设计”的道路。
过度设计和设计不足的平衡问题没非常不错的解决方法,只有依赖经验的积累和持续的概要考虑。怎么样把握这个度是最能考验技术员的经验和价值的问题之一。
我所尝试过的软件办法中,有一种办法的思维方法对于解决这个问题帮助大,就是TDD(测试驱动开发),这里简单说下为何TDD能解决这个问题什么是软件开发中的过度设计状况A什么是软件开发中的过度设计重构代码,让现有些代码在尽可能维持简单性的同时足够高雅明确。注意此时你只能对现有些达成代码进行重构,不可以增加任何新的功能和test case。整个TDD的过程就是在这两个状况间不断转换的过程。在状况A增加功能,在状况B优化设计。
TDD的这种思维方法走的稍微极端一点。它直接排斥任何对将来的设计,转而以高雅简洁的设计和test case来为将来需要的重构减少本钱。 可以说严格遵循TDD做出来的设计势必在过度设计和设计不足方面都不会有太大的问题。
我紧急推荐TDD。不管你最后是否会同意TDD这种开发方法,它独特的思维方法都势必会给你的设计观念带来非常大影响。文章标题什么是软件开发中的过度设计