系统设计总结(一)
系统设计总结(一)
一、两种不好的设计
1. 对问题域已知时,把简单的问题复杂化。
本来功能可以用简单的方式完成,却以需求无限变化(并且变化不可知)为由,把可以简单解决的方案设计得极为复杂,其实其中90%功能用不上(而剩下的10%功能用简单方式就可以实现),最后导致系统需要不停维护,完工日期变得无限期延长。
2. 对问题域未知时,把复杂的问题简单化。
认为需求太复杂,很难完全设计出来,即使设计出来了,也无法实现,不如把设计简单化、功能简单化。但在系统完成后,真正使用时发现,这种“简化”的设计和实现,根本不能满足系统的需求,最后重新修改系统设计,增强系统功能。
这种情况下,往往不是简单的重构,而是基本推翻了以前的核心业务,导致业务模型、数据库结构、测试、系统文档全部重写。
二、正确的做法
1. 系统在设计前定义出具体的目标,这个目标是经过反复推敲、高度提炼的,今后所有的设计与实现都要围绕这个目标进行,凡是偏离或者与目标无关的功能全部砍除。
2. 设计时必须能够完全实现目标,不允许只实现部分目标,另外的目标不予理睬。
但“完全实现目标”并不意味着在实现前设计出全部功能----这是瀑布开发。
在我看来,一个系统往往可以分割为多个子系统,一个子系统往往可以分割为多个功能模块,而每一个功能模块,就是一个小目标,这个小目标的需求和功能相对独立。
我们实现一个小目标时,还是要尽量地进行完整设计,不要认为敏捷开发或者重构就是只考虑容易搞定的,不容易搞定的以后实现或者留作重构。
我认为当目标明确时(明确的目标来源于用例),设计必须考虑到所有功能。
3. 把稳定的功能(无论它是简单还是复杂)提炼出来,按照共同的约定,把它简单化,但要少用继承,多用组合。
4. 如果问题域复杂而易变,或是复杂且不确定(比如促销方案),那么就抽象出最简单的接口,做成插件形式,把具体的业务逻辑让插件实现,然后以统一的格式返回结果。