java 面向对象的感悟

这几天反复读编程思想第一章,收获颇多。在以往的工作中顾着码代码,几乎没有去思考过为什么java是一门面向对象的语言,为什么要选择面向对象,面向对象为何而生,什么是面向对象?
大学接触的第一门编程的语言是C语言,熬过了学习基础部分,后面的程序都很好理解,一个c程序就好像在描述一件事情,这件事情包含了起因、经过和结果。平常做一些课后习题,诸如转换数组之类的,逻辑清晰了,敲起代码来便不会有太大的问题。可是当学期末做c语言课程设计时,当时是做一个学生成绩管理系统,我先是对学生成绩做增删查改,当然,静态的,需要用户输入成绩,退出时数据就没了。这样的代码已经很多了,当时记得是1000多行。后来,要加上登录功能,再后来加上权限功能。代码就变得不堪入目,只知道管理很难,因为变量都要在开头声明好,后面使用容易忘记。
一直到等我学到java,才知道c是一种面向过程的语言,它会完整的表现一件事物,根据每个不可再分的细节,写一句代码。也就是说,我需要很详细的通过c告诉计算机要干什么。我拿到一个功能需求时,便从头开始做了。可是java不是,java是一个面向对象的语言,什么是面向对象。我现在的理解是分类!把世界的每个事物归类,描述一件事情时,不再是详细的不可再分的细节组成的,而是由若干个包含一些细节的有机体组成的。重心是放在描述的事物上面,而描述的动作是谁发出的?是人!面向对象其实对面向人的思维和思考方式。这点在马克思主义理论里面关于世界的物质性原理可以简单的归纳为意识对物质有反作用
1.所有东西都是物质:世界的物质性
2.程序是一大堆对象的组合,对象之间通过传递消息知道自己要做什么:大脑和手的消息传递
3.每个对象都有自己的空间:大脑就是用来存放信息的
4.每个对象都是一种类型:左手右手属于手,左半脑右半脑属于脑
5.同一类的所有对象都可以接受相同的消息:左手能干的事右手也能干嘛
上面是说oop的,那么java跟oop是什么关系,我认为java属于oop的一种。oop应该是一个网络状,包含宇宙万物,形式多种多样,没有一个开头,也没有一个结尾,而java是这多种形式中的单根结构!java规定了一个头,这个头就是万类之父–Object类,我在api随便点一个类看看,结构如下:

这里写图片描述

抛开java语言,单从认识oop来推测这种单根结构的特点。我总结了以下3点:
1.方便控制,每一个结点都可以被查到
2.结构稳定,不易变形
3.不够灵活,一定会臃肿!这就像一座金字塔,处处承载必处处衍生
现在结合java分析,第一点方便解控制怎么理解,既然是单根结构,每个结点都可以被追溯到,很容易对全局做控制,最典型的便是GC和异常机制的设计,GC算法实际上也是一种单根结构的可达性算法分析,异常机制可以根据这种结构层层传递。这种结构多带来的另一个好处便是“同质异形”,大家都是程序员,前端可以做界面,后台可以处理逻辑,美工会设计logo…,所以在程序中会经常见到:List l = new ArrayList() 这种,为什么不直接写ArrayList l = new ArrayList(),其实想一下就知道了,前端就只能做前端吗,就不能转后台吗。l 可以是 ArrayList 也可以是 LinkedList 。在这个基础上,为了保护每个结点的安全,引入了权限控制,piblic 、private、protected、package(default),使每个结点各司其职。在这里,从单根结构就可以推算出抽象、继承、多态、封装的特点。
第二点结构稳定,既然是单根结构,只有一个源头,不管后面怎么变,前面的一定是大家都认可的。老大规定了一个初始接口,包含所有模块的内容,每个模块都要有人去完成,可是不管其他人怎么写,结果都是朝着同一个目标前进。
至于第三点,跟第二点是反过来的,金字塔越高,最底下一层的砖块就越多,这是由继承所造成的必然后果,然而在java编程中,有些没必要的继承可以不要,改用组合,组合会改变单根结构金字塔的纵向形状。可能看起来就不是很顺畅的塔了,有可能是一层多,一层少这样,可以有效的减少冗余。但这其实是oop中网络状的特性了。
从oop角度看,怎样去做软件开发,我这里归结为4各自:”自顶而下“。一个软件的需求我拿到手,脑海里逐渐构造出一副单根结构的图,哪些点可以作为根节点,哪些点可以组合成一个新的结点,这些结点足以覆盖整个需求吗?如果以后发展,需求要变动,哪些结点可以被改动?这些都是靠经验和观察力去完善的,而根据我目前的水平,做法是,牺牲一些代码的复用性,若需求变动,尽量不改原来的代码,根据原有代码重新加多一个分支开发。
最后一点,我想引用编程思想里面的原话,写的很美的一段文字:编程更像是一门艺术,不能只是作为技术活来看待。所有付出最终都会得到回报。作为真正的程序员,这并非可有可无的一种素质。全面的思考、周密的准备、良好的构造不仅使程序更易构建与调试,也使其容易理解和维护

猜你喜欢

转载自blog.csdn.net/change_on/article/details/79019532