OOP—面向对象编程
OverView(概述)
两种编程方法的战争!
基本概念
似乎自从面向对象的编程方法出现以来,关于什么才是最好的编程方法的争论似乎就没有停止过。其中区别比较大的就是传统的面向过程编程和面向对象编程这两种。那么他们又有什么区别呢?
面向过程编程:面向过程,顾名思义就是按照完成任务的步骤进行编程。他关心的是实现任务过程是什么样。是什么样的就写成什么样。第一步做什么,第二步做什么,第三步做什么依次类推,直到任务完成。
面向对象编程:面向对象,关系的是任务进行的对象是什么。然后对任务进行抽象。让对象按照他们的行为进行任务的完成。
例子:
现在我们使用五子棋程序进行举例。如图所示:
面向过程就是简单的模拟下五子棋的过程。白的走一步,然后黑的走,如此交替进行,然后每次下棋的时候判断输赢条件。而面向对象的方法就不一样的了。可以在下五子棋的过程中抽象出很多的对象。棋盘是对象,棋子也是对象,玩家也是对象。规程可以是对象也可以是属性(甚至是配置文件)。实例化一局游戏,然后进行游戏。
你可以发现面向对象的方法有很多好处,比如我现在要把这个游戏变成一个围棋游戏。面向对象的程序员可以很优雅的修改规则就可以了。这里规则就是一个对象或者类文件,如果定义的好甚至就是一个配置文件。这样就可以在两种棋类中任意的切换了。
而面向过程的代码,则需要进入到步骤中,把涉及规则的部分全部改掉。也就是说如果要是另外一个程序员接手这个工作,就要读懂全部的代码。而面向对象的程序员仅仅明白规程的部分就可以了。(甚至可以让不是程序员的人按照一定规则写配置文件)于是,面向过程的程序员可能吐槽:“你妹呦,这个程序我啷个改嘛!”
一些编程语言的支持(选读)
那么现在的编程语言都是什么样呢?如何你感兴趣我可以和你讲讲。
首先是c语言是面向过程的。原因很简单这么语言关注的是底层要的是运行的效率。诚然良好的编程习惯可以使代码有很强的可读性和复用性。可是C语言始终在处理需要对象的大型应用上拙荆见肘。于是乎有了C++他支持面向对象编程的方法,可是C++的api过于烦乱和复杂拥有太多的细节。有人可以说自己精通C语言,但是几乎没有敢说自己精通C++。激进派的人有发明了Objective-C。C+面向对象,完美的解决了他们自认为的问题。所以诚然你在写C++的代码时可以写成面向过程的,它也是可以运行的,只不过没有提现这门语言的特点。
PHP就不一样的了,他只从设计出来就仿佛在告诉人们,怎么简单怎么写。他运行程序员,在使用哪种都可以。这点和C++很像,可以php可以说自己是更顶层的,更加面向应用的。
现在来说说我们的主角Java,这个是一个纯面向对象的语言,意思是说他鼓励你使用面向对象的方法编程。并且引导你使用java去思考问题。于是有了叫做Thinking in Java的说法。这很形象。java完美的支持着面向对象,甚至程序的入口必选是个对象。可是语言的生命力是如此的强大,比如AOP面向切面编程等。比如支持函数式编程。
说道AOP,php也支持不过不是主打的功能。函数式是自从JavaScript火了以来的大的趋势,几乎所新的语言都在标榜自己支持着个特性,老牌的语言也在加入这个行列之中。
随便一提的是,有些语言可以通过编程对自身进行扩展,来支持新的特性,比如申请的lisp,但是这种语言学习成本很高,而且没有良好的氛围和圈子,在业界没有成为主流。这也很明显在业界成为主流的一定不是什么特别难的东西。
JAVA 中的面向对象
面向对象编程的三大特点和解释
封装
将对象的行为和属性封装起来,其载体就是类。对使用者而言,它隐藏了实现的具体细节。这就是封装。
比如有一款游戏游戏菜单对象中有一个存档的方法。你在使用的时候完全不需要知道,具体都做了什么。(当然类的提供者必须知道,不然代码就是没有实现的了)可能需要把游戏中所有存在的关键对象扫描一遍存在一个静态的文件中方便你下次游戏时加载进来。这种类隐藏属性和行为实现细节的特性就加做封装。
继承
继承是梳理类和类之间关系,提高类复用效率的方法。继承性主要利用了特定对象之间的共有属性和方法。比如。四边形式一个类,而平行四边形是它的子类。正方形有是平行四边形的子类。(想一下四边形不就是四边形的“爷类”吗~是这样的。不过一般没有这个说法就是了)
多态
刚才提到了父类和子类,有一样的属性和方法,但是要是他们有某个方法的实现不一样怎么办呢?比如走路是动物都有方法,但是人用双脚走路,而袋鼠要用跳的方法走路。这时就体现了类的多态性。类的继承关系中允许对通一个行为有不同的实现,这个就是多态。那么代码中他又是怎么实现的呢?使用的抽象类和接口。抽象类定义了一个不能被直接实例化成对象的类,只有一个继承了它才可以被使用。这个类中是可以带上方法的实现的。可是接口就不一样的,接口只是定义了一个“标准”实现它的类必选去实现这些已经定义好的方法。抽象类只能被继承一个,但是可以实现多个接口。