面向对象和基于对象
首先先介绍一下面向对象和基于对象的两种概念。
“面向对象”和“基于对象”是两个不同的概念。面向对象要求“封装”,“继承”,“多态”三大特点,缺一不可。“基于对象”只是封装对象,使用对象,但是没有“继承”的特点,而“多态”是建立在“继承”基础上的,没有了“继承”的概念也就无从谈及“多态”。
现在的很多流行技术都是“基于对象的”,比如vb和js就是“基于对象”的语言。它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法具备“继承”和“多态”。他们只能使用现有对象的方法和属性。而像c#和java是面向对象的语言,他们具备“继承”和“多态”,能够实现面向对象设计(ood)和面向对象编程的(oop)。这种设计开发中,对象就是核心,开发时更多的是思考对象与对象的关系,并通过消息来完成。
面向对象和基于对象同样体现在系统开发上。比如,使用一个门基于对象的语言,是很难实现面向对象设计(ood)和面向对象编程的(oop),因为语言本身就不提供“继承”和“多态”特性。除非是使用一些对原有语言封装的框架(如js的ext框架),在原有语言基础上提供的更多面向对象的特性,才能实现面向对象设计、开发。
其次,项目中即便使用的是面向对象的语言,但是没有使用语言所具备的面向对象特性,这种开发仍然是基于对象的开发。比如即便使用面向对象的语言(如java和c#),但是没有使用这些面向对象的特性,同样是无法实现面向对象设计、开发的(ood和oop)。
记得有一道经典的题目,问:“要把大象装冰箱,总共分几步。。。? ”
面向过程的人会回答分三步:一、把冰箱门打开,二、把大象放进去,三、把冰箱门关上。如果让他们编程描述这个过程,他们会怎么做呢?首先他们会要建几个全局变量,比如冰箱门是否开着,大象是否在冰箱里……。然后,他们会做3个函数,即把冰箱门打开,把大象放进去,把冰箱门关上。最后用一个main函数分步调用那三个函数。
如果你说,首先应该先创建大象和冰箱这两个对象。恭喜你,你答对了。你可以先创建象和冰箱这两个对象,在给冰箱一个容器属性和一个判断门是否开着的标志位,以及“把冰箱门打开”、“ 把大象放进去” 和“把冰箱门关上”这3个方法。这样你便把冰箱的属性封装进了冰箱对象里,吧大象属性封装进了大象对象里。程序的耦合性大大降低。但是到此你仅仅做到了基于对象,还到不到面向对象。因为我们不能更加本质的,更加抽象的描述我们的业务,即把大象装冰箱的过程。
真正面向对象的思想,应该更加本质一些,比如我们创建两个接口,一个叫大象,一个叫冰箱。再给冰箱3个方法,即“把冰箱门打开”、“把大象放进去”、“把冰箱门关上”,不过不用在乎如何实现他们。仅此而已。我们设计时仅仅关心对象与对象之间的关系,而不应该参杂涉及到技术的实现部分。
学java一年多了,用她也做了几个项目,但是总感自己还是一个门外汉。公司也是从一年前从.net转为java的,但在使用方面也欠缺经验,很多东西都是从C#那里生搬硬套来的。
公司的一个web项目,用sencha touch做前台,采取前台mvc形式。java开发的后台,采用rest风格,后台方面仅仅是实现了对资源的增删改查,使用JSONObject(类似于map)的数据类型代替javabean,服务器端处理的相对简单。以前使用的是hbase数据库,但是如今要开发workflow,因为hbase不能满足业务上的需求,现在换成了mysql,而后台业务量也逐渐加重。
起初后台仅是实现对数据的增删改查,并不进行复杂的业务处理,但是如今处理的业务量越来越多,越来越复杂,使用json这种数据结构封装根本不能满足开发的要求。那一个个无法统计的key值根本无法维护,更重要的是JSONObject无法实现对方法的封装。如果不留下一个与之对应的文档,那么每一个业务的实现背后都留下了不可维护的隐患。
永远改不完的bug以及没有人能看懂得代码,虽然是用java这门语言,用得却像似js一样。事实上先前的框架并没有问题,因为这套框架是根据hbase数据库和sencha touch的前台结构而设计的,后台也仅是对对数据的增删改查,业务实现多放在前台。因为hbase的字段是不固定的,所以不用javabean而使用json是可以理解的,业务在前台,java处理业务时的面向对象的优势也无法体现,使用现行的后台框架结构是非常正确的事情。而这套框架较适合开发前端的应用。遗憾的是在这个workflow项目中,项目经理仍然使用这样一个项架构,尤其是在放弃hbase的情况下,仍然用JSONObject这种伪javabean封装数据,而不使用真正的javabean的结构,给维护带来了很大的困难。
项目经理是做前台出身的,他的js水平远远好于java水平,在他眼里使用java开发和使用js开发没有什么不同。不理解面向对象的思想,对于设计模式更是不以为意。而没有面向对象思想的java开发真是一件令人痛苦的事情。
这个失败的例子也是说明了面向对象开发和基于对象开发的区别,不是使用java就是面向对象开发,向我们这样的像使用js一样的使用java,绝对不是面向对象的开发。不知道还有多少人像我们这样使用java,但是这样的基于对象的开发方法真心不适用java,左转php,右转.net,因为这样java的优点(有很多很稳定的开源框架,面向对象的业务分析)并没有体现出来,缺点(性能差,技术复杂)却被放大。事实上项目组并不缺乏java高手,但是在这个没有面向对象思想的框架面前,这些java高手都没有用武之地。
这个项目的失败也让我们项目组重新思考面向对象这个老生常谈的主题,也让我们重新审视ssh这些貌似已经过时的java框架的价值。即便是在存在无法处理大数据,多处理器,高并发等问题,但是面向对象的设计开发中的优势还是值得我们继续追捧。