面向过程与面向对象

回到家已经超过23点了,想想也做不了什么事情了,那就把路上跟同事讨论的问题,拿出来写一写。又是一个老生常谈的问题,就是到底是面向对象还是面向过程?其实关于这个问题,本不该有什么疑惑的,但是随着最近一个项目的经验,我又产生了一些新的看法。

自从我学习了面向对象,我就好像掌握了一个得心应手的工具,感觉在处理各种问题的时候无往而不利,虽然偶尔也会有些迷惑,但是终归无伤大雅。这样二了一段日子以后,我终于接触到了设计模式,以及有机会见识了一些真正复杂的项目,发现面向对象很多时候,都是一种艰难地抉择。于是,对面向对象开始有了敬畏之心,并一直认真地思考这里面的问题,认认真真去实践面向对象设计,分析别人的写的代码,越发感觉到还有很多路要走。

习惯了用对象思考以后,一旦有实际问题要解决的时候,已经习惯了按照面向对象的思路开始思考,直到最近。在项目中遇到了大段的面向过程的代码,以及贯穿在其背后的设计思想。心中很不以为然,轮到自己操作的时候,还是用上了面向对象的方法,今天我和同事聊起这个问题的时候,我还是换位思考了一下,才明白了面向过程远没有我想象的那样不堪,以及那样容易。

其实面向过程的设计思路,说白了就是自顶向下,逐步求精。但是这么简单八个字,如果放在一个函数里,估计初学写程序的人,也是可以驾驭的,但是如果放到一个数万行代码的项目里,驾驭起来远超想象的困难。我为什么厌恶面向过程的设计方法,我仔细反思了一下,可能根本原因,还是我没法在数万行代码的项目里,很好的驾驭这个方法,已经搞不清楚应该先干什么后干什么了,很容易把事情搞得一团糟,所以才不喜欢这样做。

在稍大的项目中,第一个面临的问题,就是分工合作。而这也是我认为面向过程方法能带来的主要好处所在:第一,项目开发人员水平良莠不齐,有些人懂面向对象有些人不懂,有些理解深刻,有些理解浅薄,有些干脆不会;这种情况下,面向过程的方法最容易推广,也容易掌控,分工下去以后,面向过程其实就是写好一个个函数,最糟糕就是某些函数写得漏洞百出,但是仍旧能够掌控,修复的时候,总也还有办法;第二,利于任务分解,只要想好整体的业务流程,按照功能往上堆叠代码就好了,每个人一块,只要搞清输入输出,就可以开工动手;第三,平行扩容,这个说的是团队扩容,项目发展过程中,需求难免快速变化,如果在紧要时候,难免人手不足,这个时候迅速抽调人力,扑倒项目上,马上就可以着手,只要看清楚function specification,就可以立刻贡献力量,整个团队会因为人手的变多,实现生产力提高;第四,健壮性好,出错的往往只是函数,修复即可,牵一发而动全身的情况少。

要实现我说的这些优点,其实还是非常困难的,需要思路非常清晰的技术领导,正确把握设计流程,关键处把关。所以,我说我驾驭不了,就是这个原因,不知道关键点在哪里,也难以有相当的技术敏感性来预知问题。

劣势是什么呢?第一,代码复用性差,因为设计不可能精细入微,所以代码难免抽象有限,出现大量的重复,比如遍历某个数据结构,因为是通用数据结构,也是和别的函数传递消息用的,免不了每个函数都要去遍历一次,这也是没有办法的事情,要实现不重复,可能设计上的要求要提高一个数量级了;第二,代码混乱,因为分工,乱序能力强,带来的弱势就是,代码会比较混乱,比如顶层和底层并行开发,导致顶层开工的时候,底层还没有就位,不得不先用一些替代方案,等到底层好了对接发现有偏差,不得不打一些补丁代码来修复,最后结局就是混乱;第三,一致性差,因为最小单位是函数,局部变量的要求不高,所以会在代码里看到各式各样的局部变量。

这些劣势都是很容易出现的,因为这是这个方法论本身的缺陷。

面向对象的好处是一开始,就强迫大家用逻辑性比较强,高内聚,低耦合的思路去思考问题,代码的内聚度高,可重用性好,重复少。然后,代码总量会降低。容易写出思路比较清楚的代码。

劣势也是相当明显的。第一就是没法在团队中很好的推广,对每个成员要求比较高;第二,不利于任务分解,因为面向对象设计任务更加繁重,如果要任务分解,势必要确定接口,如果没法很全面地定下接口,那上下游分工就比较困难;第三,扩容难,因为代码对全局观要求比较高,临时加入项目的人,因为没法全面了解所有对象的功能,势必上手比较慢;第四,就是设计上的失误牵扯会比较广,因为都是对象间交互,如果一个对象有问题,牵扯到上下游都要改。第五,代码逻辑内聚度高了,但是业务逻辑代码分散了,比如MVC,同一个业务逻辑相关内容,数据在M里,展现在V里,控制在V里,改一个业务逻辑,最优情况,是改三个文件,事实平均情况下,远高于三个,一般都是4、5个或者8、9个。

我最后想说的就是,一群人做事和一个人做事是很不一样的,你不得不顾及到整个团队的情况,兼顾每人的能力,偏好。人越多,越难兼顾。还有就是在实际项目开发中,很多东西都要受到限制,这非常糟糕,但是没法对抗。不得不考虑各种因素。如果一味地只考虑方法论本身的先进与否,一味地考虑自己的偏好,可能你离一个技术领导的距离还是比较遥远的。做个小兵容易,领导团队困难啊~

就是一点个人领悟,有点语无伦次,以后闲下来,再好好整理,诸君见谅了。