“软件设计的重点在于抽象”,不记得这句话是哪位说的了,我想改正一下:“保证软件灵活性设计的重点是抽象”,由此可知,抽象的作用是“保证软件的灵活性设计”。越来越多的语言、平台构建在OO思想之上,这充分说明了OO的正确性。OO,一种思想,一种谈到软件设计时必须涉及的思想,越来越多的人开始追捧它,当然,我也是其中之一。有了它,软件设计可以提升到一个“美”的境界;有了它,软件的可读性、可维护性、灵活性、可扩展性等等一大堆的“性”得到了很大的提高。为什么会这样?因为面向对象思想把软件跟现实更紧密地联系了起来,便得一些现实物理世界中的思想可以很容易的运用到软件中去。这几年,“设计模式”、“架构”等等一系列的名词越来越受到人们的关注。所有这些东西,其实就是为了实现一个抽象层次的编程,以保证软件的灵活性。
那什么是抽象?引用一位网友的话:“抽象就是有选择的忽略”,中国有句真理,叫“太极生两仪,两仪生四象,四象生八卦,八卦生万物”。从太极到万物,这种金字塔式的结构在复杂的软件工程中也是存在的,越接近金字塔的顶端,越要有选择的忽略掉更多的东西,从而具有更高的抽象程度。举个例子,两个功能A、B都是实现对数据的增删改,A是针对“客户”的,B是针对“产品”的,我们可以做一个增删改服务或者容器之类的东西来支持所有的增删改功能,A、B功能代码只用对使用这些服务然后再实现一些各自特殊的东西就可以了。这样做就把“增删改逻辑”给抽象了出来。再比如说O/R映射工具,它其实就是把数据操作抽象了出来。“抽象”的反义词应该是“具体”,我们可以把抽象理解为活的,具体理解为死的。各个具体的事物之间肯定会有重复,比如男人和女人都会走路,都会吃饭;比如你没有使用O/R映射工具的数据层的各个类都要实现一些相同的逻辑。软件设计中有一个原则:“Don't Repeat”,就是不要重复。理想状态下,一个系统的任何代码、逻缉、概念在这个系统中都是唯一的,这样的系统肯定是非常灵活,因为“抽象”对应“活”。唯一性很容易保证,但是逻缉、概念的唯一性就很难保证,应该说是根本保证不了,概念这东西抽象到最上层什么都没有了。什么事情都有个度,只能说是软件的灵活性会随抽象程度的提高而提高。
这么说,是不是就意味着抽象程度越高越好?不是!刚才说了,任何事物抽象到最上层就是叫“事物”,还从哪来软件?一些书目中或明或暗地提到软件设计肯定有个最好的抽象程度,而且我们应该去努力达到这个抽象程度。不错,说得很对。但是,项目与项目之间是不同的,不存在适用于所有项目的最好抽象程度。
我的一个同事给我说过一句话:“软件项目的成功标志是什么?有三点:客户满意,公司满意,员工满意”。客户怎么满意?软件按照预算工期、成本完成,并为为他们创造价值;公司怎么满意?软件按照预算工期、成本完成,并为公司创造利益;员工怎么满意?软件按照预算工期、成本完成,开发过程顺利,自已的利益得到保证。得到的结论就是软件项目顺利的按照预算工期、成本完成,就算是成功了。运用抽象的最终目的肯定是促使项目成功,并不是让你搞“科研”。一个项目的所有因素决定了这个项目最好的抽象程度,项目经理、架构师需要反复思考,软件设计时究竟抽象到什么程度最好?这肯定要根据现有的资源(开发人员、工具等)来确定,如果过于抽象,你水平到位,可以理解,那么下面的开发人员呢?你必须要考虑培训成本、沟通成本,过于抽象,会延长工期,甚至让项目遥遥无期。
说了这么多,并没有给出一套权衡的方法,在下实在水平有限,其实在自已带领的项目中也并没有把这些东西把握得很好,希望认真思考过这个问题的人能留下你的只言片语。