从两个多月前开始真正接触Java这一门面向对象的语言,以及这一个多月以来对Android应用开发的学习,方才敢说自己对面向对象也有所理解了。
不得不说,Java是一门出色的语言,而它的出色之处,很大一部分体现在它对面向对象思想的实现上。一般我们称面向对象有三要素为封装、继承、多态。封装显然更易于理解,封装和多态则体现出面向对象思想中抽象的一部分——先是继承,继承很好地为我们规范了很多类的区分例如同样人继承动物,动物继承生物(当然,Java是不支持多继承的,这里只是简单举例),而多态则更好的诠释了继承,例如动物继承生物,植物也继承生物,但是两者在具有一部分相同属性的同时,也会具有不同的属性、具有不同的功能,这便是多态。Java中接口的实现以及抽象类的方法,也更为完善地呼应了面向对象的思想,也更便于以此思想进行程序设计。
面向对象来编程,最首要的,就是明确需求:
面向对象,很重要的一点就是分析需求,我们要明白接下来要“创造”的事物中,含有多少个不变或者几乎变的“客体”,并好好思考这部分“客体”间有何联系,这样,我们才能更清晰地区别开每个类的区别何在、共同点又何在,具象到编程中就是能清晰地表明类的属性和方法,使我们能更方便的使用。
然后,怎样去实现这样的需求就变得重中之重!
分析完了需求,建模好像变得更容易了,其实不然(在下因此便走了弯路,下文说TT .TT),建模过程依旧需要思索清楚。刚从面向过程思想向面向对象思想的转换过程中,很容易就又回归了旧的思路,造成这个结果的原因,就是还没真正理解面向对象思想的意义。假设开发一个软件,收到了一个需求,立马下手去实现它,可能非常简单的就能做完,但是这样的处理方式极有可能只是基于面向过程思想的开发,因为这样的开发需求显得较为单一,目的性特别强,为了实现一个需求,很容易就以一种较为“简便、直观”的方式去实现它。但是这样的做法,显然违背了面向对象的本意——“在程序中包含各种独立而又互相调用的对象的思想【摘自维基百科】”,这样处理,直接就导致后期的维护、更新变得更为艰难。这样也正是说明,面向对象思想拥有重用性、灵活性和拓展性。
此时不得不说最近我自己在做的一个音乐播放器,因为是菜鸟入门,又因为刚学完了大一一年的c语言,面向过程的思想有些根深蒂固,果然一进来就走了弯路。首先因为刚接触Android应用开发,于是想着功能我一点一点来实现,后来我才意识到这显然非常的不理智,开发一个应用,应该从开发伊始就考虑好这个应用需要实现的大部分功能以便于建模,而正是我前期思想不够熟悉,导致后期代码十分赘余,“写的跟c一样”(当然,这里不是说c不好,只是说写的简直就是面向过程而已,有大神说过,思路明确的人,用C照样也写得出漂亮的面向对象程序),于是我只得重新创建一个项目来做,这次在明确思路之后,也发现了开发过程中很多之前卡住的地方现在都要好解决得多,不得不说面向对象设计的的确确有他的优势所在。以此作为例子说明我现在对面向对象思想的认知,我所开发的音乐播放器,除却简单的播放暂停外,需要的显然有上下曲目、循环模式、同步歌词等功能,显然这些功能都与音乐播放息息相关,因而现今我将他们都归在Service类中来处理(之前我将播放、暂停、上下曲目等功能都放在Activity中,不同按钮的处理时则显得代码的重复度颇高,几个基础功能竟然占了两三百行代码,十分可笑),通过广播、Intent来传递信息,代码果然比之前显得简洁得多,找到对应功能的代码也显得更为容易(PS:今天在测试的过程中,发现拖动进度条时,歌词视图并不会随着进度条的改变而改变,突然意识到,歌词视图的重绘应该与进度条联系在一起而不是播放进度,这样显然能获得更好的用户体验,后期我会来实现,此处带过)。
我自己开发的实例我也不去讲太多,如果后期实现得好,应该会在csdn开源,这里也只是作为一个面向对象的小小示例而已。
总而言之,面向对象给了我们很多的可能,也正被市面上更多的软件开发公司所接受,这充分说明了它存在的必要性和重要性,虽然Java并不是唯一的一门面向对象的语言,但是学习Java的过程的的确确有利于对面向对象思想的理解,最终我们能确定的是,面向对象的实现方式,更多的要仰赖开发者的“高瞻远瞩”,规划的更好,则成品也更好,可重用性、灵活性也都会相应的提高,这便是面向对象思想的根本目的。