从具体的语言和实现中抽离出来,面向对象思想究竟是什么?
灵魂拷问举例来说,如果有同事问你怎么办理离职手续,你会怎么说呢?
你会这样对他说:先提离职申请,跟同事做完交接之后,找直属领导审批。审批通过之后,去找行政清点办公物品,清点没问题了,行政会给你开一个证明。拿着这个证明去找财务结算工资,算清楚之后拿着财务给的证明去找人力,人力会给开离职证明。还是会这样对他说:先提离职申请,跟对接同事做完之后,找直属领导审批。审批完成之后,依次去找行政、财务和人力,跟他们说“我来办离职手续”。最后拿到离职证明,就办完了。
道理我都懂,可是……为什么你这么熟练啊喂两种说法看起来差不多,其实是有很大不同的。第一种就是典型的面向过程的思路:做事的整个过程和全部细节都“尽在掌握”。第二种则是面向对象的思路:拆分完整的过程、把具体工作委派给不同的岗位和个人。当然,面向对象最终还是要面向过程。无论我们怎样拆分和委托,每个人还是要按一定的过程来完成自己的工作,最终还是要把每个人的工作组织成一个大的过程才能完成整个项目。
从这个角度来看,与其说面向过程和面向对象是技术思想,我更愿意把它看作一种管理思维。
当公司规模不大、业务比较简单时,一个人就可以把市场人力财务行政一把抓的管理思路,就是面向过程的思想。面向过程很接近一般人的思维方式:先出需求后开发,先定义接口后开发代码,先写完代码后测试,我们的生活和工作就是这样一个个的过程。因为思维方式很接近,所以我们很容易理解面向过程的代码、功能和系统。
而当公司做得越来越大、业务越来越复杂时,一个人就很难事无巨细一肩挑了。这时就需要划分职权和部门、做到什么事儿找什么人。这种管理思维,则是面向对象的思想。面向对象则有点像大佬们的思维方式:这个事儿你先找那个部门,再找那个总监签字,最后安排你的人去落实到客户;这个项目由小李负责,小张小王你俩协助下;这次这个项目对公司很重要,你们几个部门一定要通力合作,拿出成绩来。大佬们只关心“谁来做”、“做什么”,不关心具体“怎么做”。这与开发者的思维方式和关注点是不一样的,所以依据面向对象思想写出来的东西常常让人觉得费解。
大佬你好么回到技术的层面上来说,如果一个系统、一项业务的处理逻辑比较简单——总共就一两张表,三四个if——那就面向过程,按照流程一步步实现了就好。如果这个逻辑非常复杂,“亭台六七处,八九十枝花”,那还是好好设计下代码和类的层次结构吧。
所以,其实面向对象会并没有那么费解:它只是用另一种视角来模拟现实世界而已。在现实世界中,我们会把一项职责分配给一个岗位,在面向对象中我们会把一项职责分配给一个类;在现实世界中,每个岗位上都可以有不同的员工来负责实际而具体的工作,在面向对象中,每个类都可以有不同的实例来负责这样的工作;在现实世界中,每个岗位都有自己的Job Description,在面向对象中,每个类都有自己的抽象;在现实世界中,大家都希望自己的工作少受别人的影响,在面向对象中,我们希望每个类都做到高内聚、低耦合……更不用说在学校学的:“鸟”是一个父类,“麻雀”、“喜鹊”是它的子类这样的“仿生学”面向对象了。从这个角度来看,面向对象思想其实很简单。
还记得这个问题吗:“鸵鸟”应不应该继承“鸟”类?如果还是觉得面向对象很费解,我想,除了思维方式不同之外,主要有两个原因。
首先,要建立和理解一套合理的“类”是很困难的,更何况这个分类还一直在变化。前两年沸沸扬扬的冥王星退出行星行列这事儿,本质上就是人们对“行星”这个类有了更深入理解和更准确的定义;类似的,随着生物学的不断进步,动植物的分类也在不断地做着调整。创立、发展了数百上千年的学科尚且如此,何况“新兴”的计算机科学?更何况野蛮生长产生的系统?
其次,有很多东西我们确实不关注“分类”,而只关注如何使用。例如,我们吃鳗鱼饭时会关注它到底是脊索动物门圆口纲七鳃鳗目七鳃鳗科七鳃鳗属的七鳃鳗还是脊索动物门硬骨鱼纲鳗鲡目鳗鲡科鳗鲡属的鳗鲡吗?不会,我们只关注它好不好吃。我们在使用牛顿-莱布尼兹公式时,会关注它到底是牛顿先提出的还是莱布尼兹先提出的吗?不会,我们只关注它能不能解题得分。我们在使用函数时,会关注它到底属于哪个类的哪个实例吗?不会,我们只关注它能不能实现功能。为了把这些东西归入“对象”中,面向对象需要给自己多找很多麻烦,因而也更加难以理解。
面向对象思想如此费解又麻烦,那我们为什么还要使用它呢?
西医和中医都是从蒙昧中走出来的。西医也曾经有过灌肠、放血疗法,有过“前脑叶白质切除术”,有时还真的能取得一定的疗效。但是西医没有满足于有用,而是更深入的探索了“为什么有用”,并建立起了一套现代医学体系,比传统西医要有用得多了。
在林奈老爷子之前,生物学的命名体系非常混乱,各国学者都自说自话地给自己发现、研究的动植物命名,结果出现了大量同物异名、异物同名。研究者之间的学术交流几乎完全陷入鸡同鸭讲,学科发展陷入很大的困境。林奈老爷子提出了门纲目属种的分类方式和双名法的命名方式,建立了一套完整的、规范的体系,有力地促进了生物学的发展进步。
然而林奈老爷子并不姓林,人家大名叫“卡尔·冯·林奈”面向对象思想也有类似的作用。面向对象设计不仅能实现业务上“做什么”的需求,还能促进我们去思考“怎么做”,并在一步步的演进中改进“怎么做”的设计,并更快、更好、更新的满足“做什么”。此外,依据面向对象思想创建起来的业务领域模型,为业务、产品、开发、测试提供了一套完整的、规范的体系,对各方协同、共同促进系统和业务的发展有着不可估量的作用。
网友评论