论面向对象编程

  不少人认为,用面向对象语言编写的程序就是面向对象,还有些人认为使用了面向对象三大特性(封闭,继承,多态)就是面向对象编程。其实,这2种观点都是错误的,尤其是第1个。面向对象语言只是个工具,表明可以用这个工具来创造面向对象的程序,至于怎么“写”是个人的思维问题,用面向对象语言也可以写出面向过程的代码,下面展开面向对象论点:

  一、何为对象?

  对象,从广阔宏观上来看,世间万物皆是对象,大到太阳宇宙,小到蚂蚁石沙,是人类用来描述一种事物的统称。对象具有属性和行为两大特性,属性表示对象本身的特征,行为是对象能具备什么样的功能(或说对象能做什么事情)。如某个人是一个对象,这个人具备身高,体重(属性),还具有走路,说话(行为)功能,可以这么说,对象是属性和行为的集合。

  二、对象三大特性:

  1.封装:这里的封装有2种概念:

    (1)、对外封装,把属性和行为包装在一起,成为对象的一部分,或者说组装为对象。

    (2)、对内封装,把内部不必要对外公开的属性和行为封闭,如设为private,外界无权访问。

  对于对象本身来说,把重要信息隐藏,不暴露给客户端,从而更好避开安全性和错误率,只公开客户端应该知道的接口,对客户端来说也没显得复杂。

  2.继承:子类继承父类,继续所有父类非private成员和方法,从而扩展了功能。

  3.多态:子类继承父类,但有一种情况是,每个子类有不同的形态,这时多态能很好满足。

  三、如何设计面向对象?

  在面向对象语言,具有相同特征和行为的抽象事物叫类。要使用面向对象,必须先设计类,然后根据类构造出类的实例(对象)。这时就可以访问对象的属性和行为了。为了更好理解,我举个业务来说明设计对象的过程:

  场景1:设计一个图书馆管理系统,图书馆有两个角色,借阅人和管理员,管理员负责维护书籍和对借阅人进行图书借阅登记和归还;借阅人可以查询书籍和借阅书籍,并可借阅自己的历史借阅记录。

  面向对象三步骤:OOA(面向对象分析)、OOD(面向对象设计)和OOP(面向对象编程),首先第1步是OOA,分析出各个业务对象。

  (1)、OOA阶段:熟读业务需求,列举出所有明显的和隐藏的动名词作为候选对象,再根据这些候选对象进一步分析哪些属于对象,哪些属于对象的属性,哪些属于对象的行为,这个方法叫动名词分离筛选法。

   【1】、由上面需求可得出动名词:图书馆,管理,系统,书籍,书号,书名,借阅人,管理员,帐号,密码,姓名,角色,借阅时间,归还时间,负责,维护,借阅记录,借阅登记 ,图书归还,查询书籍,借阅书籍,登录(隐藏的)

   【2】、筛选动名词:图书馆,管理,系统,这套系统本身就是图书馆管理系统,故这三个词弃之;负责是个装饰词,故弃之。剩下的动名词有:书籍,书号,书名,借阅人,管理员,帐号,密码,姓名,角色,借阅人,借阅时间,归还时间,借阅记录,借阅登记,图书归还,查询书籍,登录

  【3】、将筛选的候选词分门别类,就是进一步分对象,属性和行为:

  该系统是对图书作为管理,故“书籍”归为对象,书号,书名归为对象的属性。

  该系统的操作人有两种角色,分别是借阅人和管理员,故“角色”归为对象,借阅人和管理员继承于角色,也属于对象。帐号和密码属于借阅人和管理员都有的属性,登录是借阅人和管理员都有的行为。此外,借阅人还具备查询自己的借阅记录行为。因系统的业务是管理员才具备借阅登记/归还图书功能。

  该系统有借阅功能,故借阅记录为对象,借阅人、借阅时间、借阅书籍、归还时间应为该对象的属性。

  终上所述,分析出对象有:书籍,角色,管理员,借阅人,借阅记录,画出领域模型如下:

 

  【4】、从领域模型再画出类图:

  

  以上两图对比,可能有些人有疑问,为什么角色没有了,为什么借阅书籍和归还书籍会归到借阅记录里?因为这个是类图,是要将对象再抽象为类,角色本身是一个抽象概念,可以归到用户类里,用“是否管理员”来标识角色;借阅记录在系统里就是个对象,借阅和归还动作对于类来说就是该对象的行为,而领域模型是倾于业务场景而画的图,是针对业务专家人群,现实生活中就是由管理员来操作“借阅”和“归还”两个动作。

   【4】、进行完OOD,就可以照类图进行OOP了,这只是最简单的例子,实际系统远复杂,可能还要进一步设计接口,使整个模块(对象)更加松偶合。

  总结:面向对象是面向过程之后一种对解决复杂业务问题的思想,是把业务抽象成对象,各个对象互相协作,也可以这么说是任务分解,将复杂的任务分担到各个对象中,不至于像面向过程一样用函数包缆所有逻辑。我见过非常多开发员用的是面向对象语言,写出来代码是完全面向过程,把逻辑翻译成机器结构型,如MVC,把逻辑都写在C中,这是非常不好的设计,这样的代码不仅难于维护,也难于扩展,更不用想着复用了。我曾经还见过一个主界面有两三万行代码,结果是谁都不敢动,只增不减。

posted @ 2016-04-21 20:58  司马逍遥  阅读(171)  评论(0)    收藏  举报