您的位置:首页 > 其它

面向对象程序设计思想的魅力

2014-09-13 00:30 197 查看
说说面向对象程序设计
在学习面向程序之前,我先学了C语言,也就是面向过程的程序设计。学完C后的第一个感觉只能编写一些及其简单的题目,什么判断大小,或者利用一些循环语句,用批量判断大小。最起码我那时还不懂C专家的编程思想,所以觉得自己什么都写不出来。(当然要写出一些有点技术含量的代码还需要非常多其他的知识)。那时候C语言的课程设计写一个五子棋,一个把数据关系变相表达出来的一个程序,那时候用了两个星期,结合网上的代码才勉强写出来。在那时候,有关五子棋的每一个步骤都必须考虑的清清楚楚,何时应该刷新棋盘等等,面向过程的程序设计模式让人必须集中精神关注整个程序运行的状态和有关数值的变化,在调试和挖掘错误的时候让人非常痛苦。
到了大二第一学期,我开始学习C++,正确来说,应该是通过C++去学习面向对象程序设计思想。这相对于面向过程的程序设计思想来说,这种新的设计思想更好的描述问题状态,让我们思考解决方案的时候更加舒服,是一种充满魅力的设计思想。非常幸运在大二的时候遇到一位幽默的郑建华老师,他风趣地向我们介绍了面向对象程序设计的方法和特点,最近在学习JAVA,在思考面向对象程序设计的时候经常会想起这位老师的话,在教师节之际也把此文献给这位负责而幽默的老师。
在学习JAVA的时候,有一本非常好的书《JAVA编程思想》,英文《Thinking in Java》。看起来非常厚,尽管只是看了很少的一部分,但也受益匪浅。这篇博文非常多的思想和知识都源自于这本优秀的教材(除了自己胡扯的一部分)。

“纯粹”的面向对象程序设计方法有以下几点
1、所有的东西都是对象,存在其有关数据和方法。
这话说等于没说,刚刚接触程序设计的人觉得这一句话就是一句废话,但是要真正思考这个问题我觉得还需要结合非常多的知识。
2、程序是对象的组合,并且通过发送消息来告知彼此需要做的。
3、每个对象都有自己的有其他对象所构成的存储。4、每个对象都有自己的类型。
5、某一特定类型的所有对象都可以接收同样的消息。(多态的起点)
譬如说一个计算器程序,假如使用一个面向过程的思想来设计,第一步:输入数据;第二步:分析数据;第三步:计算;第四部:输出结果。然后按照这样的思路再一步一步地在一个mian函数里面表示出来。假如使用面向对象的思想来设计,有一个能计算的类(带有mian入口),它有存储数字的空间,它还包含一个运算机,能够输入和输出的方法;运算机又有一个计算的部件(另外一个对象),有能进行四则运算的基本方法等等....这样的程序设计慢慢细化,虽然最底层的方法还是通过描述过程去实现,但是新思想对于整个问题的分割是非常形象,编写程序的时候让我们更舒服。在后期的维护会更加容易,譬如说,要增加一个来平方的功能,在面向对象的设计思想中可以找准某一个模块或者方法,进行相关修改。

前一段时间,一位正学习java的朋友向我问起继承ArrayList类的toString方法的重载,他要实现一个遍历的过程,想尝试直接在toString方法中直接遍历。在很多人看来,就遍历来说,这肯定不是一个好方法,而朋友却死磕这个点,于是我也和他一起死磕,弄了好久才把它实现。后来我想朋友怎么会那样去死磕,除了相信自己的方法可行之外我觉得是他还没了解面向对象编程的封装原则。死磕是可以了解到编程语言中语法的使用,但盲目地死磕只会浪费时间,任何一门语言都有其设计的缺陷,很多时候死磕意义不大,我们要学习的是语言设计者的思想,遵循其中的潜在规则,这会让我们更好地运用这门编程语言。

封装是面向对象编程的三大特点之一。形式很简单,就是把对象的数据和方法封装起来,形成一个整体,通过public对外开放可运用的属性和方法。我一直在想,为什么要封装?这个答案是一下子说不清楚的,编了一段时间的java后(纯粹的面向对象语言),就发觉,封装真的是一个好东西!
封装的好处建立在优质类上。我所理解的优质类是功能分明独立,接口灵活,过程安全。这一种类就应该好好地封装起来,仅供运用,尽量少地去修改其内部功能。java的API就是java设计者已经做好的优秀的类,可以灵活地实现我们非常多的需求,而且功能相对独立。我们需要充分信任封装的类,那样我们就可以更高效地去设计程序顶层上的算法。就像我们用人一样,充分相信他的能力,不过问他的工作情况,这样的团队会更加高效,而作为领队的你可以集中精神去处理高级的业务。同时作为一个领队,不应该过分干预队员的工作,就像我和我的朋友去重载toString一样,虽然事情最后办好了,但是乱得像一锅粥一样。作为一个类的制作者之一,写程序的时候一定要严谨,清楚程序的功能,运用优质的算法,一步一步地设计,这样的类可靠性才强。这样我们在使用起来才能清楚了解到封装的魅力。

封装得完美,会延伸出另外一个问题。打个比喻,我的团队里的人都精通自己的领域,有时候我希望他们能再多懂一些新知识来满足项目的需要,那样我就不需要为一个新项目再多雇一个程序员了。我说的就是继承,java的关键字也extends,意思是扩展,我们习惯称作继承。意思也差不多,继承父类的功能并加以扩展。继承的原则就是更加细节化,具体化,譬如:生物,动物,猫科动物,猫,波斯猫。。。上述就是一种典型的继承关系,一步一步地扩展,子类的适用面会变小,但针对性更强,解决具体问题的能力也会更强。这也是继承的原则,清楚继承的来源,我们很快就会理解关于java里面一些关于继承的规定,譬如说继承中父类方法和子类方法的调用等等。java中不能多继承,改用接口去实现多继承的功能,接口是继承和多态的活用,我觉得是java和c++的区别之一,非常好用,有机会再详细聊聊。

封装完美,继承使功能扩展,扩展完美,又会引出一个新问题。还是打一个比喻,我的团队越做越大,好多的员工(假设继承的类也算是新员工,毕竟是一个新类),中午我要叫他们吃饭,我肯定是大叫一声“全体人员去吃饭”,然后我的员工都去吃饭了。我们程序化这个过程,我向所有的对象发出了同一条消息(所有的对象来自不同的类,但来自同一个高级父类——人)。换句话说,我用的人引用去给所有的对象发出吃饭的命令,然后大家就去吃饭了。再从员工的角度分析,淑女程序媛听到我的命令,她优雅地吃起饭来;饥饿的程序猿听到我的命令,狂吃起来。各个不同的员工都有自己吃饭的方式,再抽象这个过程,就是不同的对象接收到一个相同的调用信息,做出不同的反应。这不就是多态的定义了吗?多态的功能很有用,封装和继承会让类变得精美而繁多,多态也会去其糟粕,删繁就简,保留其中精华的同时还简化了中间的关系。

封装,继承,多态是面向对象程序设计的三个特点,不难发现三个特点是相互支持的,我们可以按照上文的顺序推导出这三个特点,也可以从其他顺序进行思考,同样可以完美地得出这三个特点。每每想到这里,都会感叹设计出这种程序设计思想的大师是多么的有智慧。围绕着这三大特点,我们在学习java其他的功能和语法的时候都会容易得多,很容易就可以对这些功能进行解释,很快就可以接受并且掌握。在具体编程的时候,围绕这几个特点作为原则,也会少走很多歪路,编出有条理的程序来。

写程序是一件非常有趣的事,面向对象更加有趣,因为它直接描述,形象地解决问题。挖掘其中编程的思想,同样能发现非常多有趣的思维。

这篇博文是最近思考面向对象思想的时候总结出来的,本人知道得甚少,难免会有错漏。分享成果是希望可以共同进步,各位大神见到错漏的地方请指出,同时希望帮到初学面向对象编程的师弟师妹们,有任何疑问都可以留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: