面向什么?
面向什么,这是很多初学者甚至编程几年的人不曾思考过的问题。面向什么是一个思想,我们面向什么,意味着我们碰到了问题,我们的解决方案是往哪里去思考。
记得之前有个笑话:
- 面向对象编程
- 面向流程编程
- 面向工资编程
笑笑就可以,其实编这个笑话的人真正地理解了面向什么?
面向对象编程,我解决问题就是我需要几个各有什么功能的对象,然后这几个对象之间如何协作最后实现用户的需求。
面向流程编程,先画一个流程图,然后先写一个这个函数,再写一个那个函数,经过无数个函数的处理,实现了用户的需求。
面向工资编程,这个需求老板能给我多少钱,给的钱多我就好好写,给的钱少我就应付应付实现这个功能就行了。
面向什么?就是以什么思想去思考。
思考的起源
当你用面向对象的思想完美的解决了一个问题时,却有人提出,我这样这样(面向流程)不是也可以是实现吗?
被质疑之后,感觉面向对象与面向流程就是两个世界,这两个世界工程师完全无法交流。面向流程的是程序员,面向对象的是管理者。
面向对象
面向对象编程,我们可以参考现实中人或物的关系进行抽象,辅助我们编程。这句话你们真的理解吗?
面向对象不是类!是对象!
面向类?
记得我的第二门编程课程面向对象程序设计
时,考了96
,什么封装、继承、多态背的可六了,然而有什么用呢,背下来了面向对象三大特性就面向对象了吗?
记得考试的最后一道编程题是,写一个教师类,根据教师加班的时间计算教师的工资。
我就不多做评价了,题目中公然说类,说好的面向对象呢?
谁说面向对象一定要类?我们的JavaScript
、我们的函数式接口,哪个需要类了?我们不在乎我们怎么写类,那不过是我们构造对象的一种形式。我们的关注点,在于对象。请各位讲课的博士们,不要再面向类了。起码等你写个十万行代码之后,再去教面向对象。
封装
因为我们不想向外部暴露我们的数据,因为如果我们的数据对外暴露的话,我们的数据如果在某个被他人调用的地方被修改我们是不可知的,所以有个封装。你按我对外提供的接口进行操作,保证你不会对我对象内部的结构进行破坏。
继承
因为对象之间会有重复的代码,所以我们有了继承,就像现实生活中子女继承父母的资源一样,但这种方法只能解决有关联对象间的代码重复问题。如果对象之间无关,解决代码重复,我们需要依赖AOP
。
多态
多态,哪有老师讲解的那么复杂?
多态是同一个行为具有多个不同表现形式或形态的能力。
这是术语,有人能理解吗?真不懂为什么总要写出一些不能让人理解的东西放在课本上。
多态,就是多种形态。
假如,一个动物类,动物有一个run
方法,我们用这个类描述动物的运动,然后有个猫
,处于面向对象的相关联思想,猫继承自动物,然后猫不满意这个方法,重写了一个,猫run
的时候有一个叫的动作,不同对象,同一动作,最终执行的效果不同————多态。
有一个猫,这个猫的run
是有参数的,调用了猫的run
方法,猫开始跑,每小时20
迈,然后我们再调用run
方法,传了一个鱼给猫,猫吃了鱼就更有动力,然后每小时30
迈开始跑。同一个对象,同一个行为,传递的消息不同,最终执行的效果不同————多态。
面向接口
相信大家肯定听说过这样一句话:Java
的设计原则是面向接口。
接口不过是一个规范,面向接口是一种不依赖于实现而依赖于抽象的编程思想,本质还是还是面向对象,只是面向对象而不依赖于具体的类。
假如我们开发了一个在线教育平台,用户调用支付接口,甲方说:我们要引入支付宝的支付功能。
如果我们还单纯地面向对象的话,那我们就是建一个AliPay
的类,然后用到支付的地方传递的是一个有支付宝功能的一个对象。
然后,甲方又说:最近支付宝的支付政策改革了,我们改用微信支付吧?so
?所有实例化的支付宝对象、所有方法中的支付宝参数都需要改。
如果面向接口我们怎么实现呢?我们建立一个Payable
接口,这个接口中有我们的支付相关方法,我们并不需要知道用户到底想要用支付宝支付还是微信支付,因为我们在需要用到支付相关对象的时候使用Autowire
依赖注入接口,然后在方法中需要用到的地方使用该接口声明,我这个方法需要一个有支付能力的对象。
然后我们建立一个实现类AliPay
实现这个接口,所有注入Payable
接口的地方都配置为注入这个是实现类,假如用户改为微信支付,我只需再写一个WechatPay
实现类实现该接口,然后在需要注入的场景中注入WechatPay
。完全不用修改很多代码。
这就是所谓的设计模式中的六大设计原则之一————依赖倒置原则,也称为面向接口(抽象),依赖于接口,不依赖于实现,保证程序的易修改性与可维护性。
优秀的思想,都是前人在大量代码优化的积累中总结出来的经验,值得我们学习。设计模式,同样如此,如果你打开了设计模式的书籍,你会发现这二十三种设计模式要解决的就是一个问题:实现更易维护的软件程序!
翻了无数篇讲解面向对象的博客,却没有一个人提及这个思想的提出者。每一个面向对象的受益者都应该感谢这个将我们的思想接入现实的人。让我们向面向对象之父Alan Kay
致敬。
感谢面向对象。您的思想我们在几十年之后仍在使用,感谢您拯救了这个被流程固化的世界!