不要再用面向对象语言编写面向过程的代码了
面向对象语言三大特性
我们都知道面向对象的三大特性:封装、继承、多态。但是其实这三大特性都不是面向对象语言独有的,C语言可以用Struct结构体实现封装,可以通过在结构体A中包含结构体B来完成类似A继承B的的效果。C语言也可以通过函数指针实现多态,但是用函数指针实现多态比较复杂。但是面向对象语言让这三大特性使用起来很方便。
多态是很强大的特性,通过多态,我们可以实现运行时绑定,即接口或者抽象类引用到程序运行时可以绑定不同的实现类对象,从而可以运行时替换程序逻辑。
面向对象设计的目的和原则
面向对象设计的目的是为了实现强内聚、低耦合的目标。从而使系统
易扩展-易于增加新功能
更强壮-不容易被粗心码农破坏
可移植-能够在多样的环境下运行、复用更容易
更简单-容易理解和维护
面向对象设计的原则
为了实现上面的面向对象的设计目标,很多前辈大佬总结出了很多指导原则,这些原则是独立于编程语言的,Java可以采用,C++同样可以采用,甚至非面向对象编程语言也可以用。
设计原则与设计模式
设计原则是设计模式之上的,更抽象的原则,包括:开闭原则、依赖倒置原则、里氏替换原则、单一职责原则、接口隔离原则。
要想写好代码,业务代码就不能来一个需求实现一个需求,从上到下,用面向过程的思想编写程序,比如有一个需求,任务调度系统任务执行完(假设执行方法叫execute)了之后要把日志保存到hdfs上,然后过一段时间产品经历要求任务执行完了给相关业务方提供的url发送一个成功回调。作为菜鸟,我们可能打开execute方法,在最后加上一个doCallback来回调业务方。那过一段时间产品经理说任务执行完了,再发送一封邮件给一些人,你还打算再打开execute方法继续在末尾追加逻辑么?这样明显的违反了“开闭原则”,即对修改关闭,对扩展开放。
如果考虑用观察者模式,提供一个观察者接口,接口中有一个方法finish,任务执行类里面有一个观察者列表,每个对执行结果感兴趣的逻辑都可以实现观察者接口(比如发邮件的逻辑可以放到EmailObserver类,它实现观察者接口,在finish方法中写发邮件的逻辑)。这样产品经理再要对任务执行结果做些什么,都可以增加观察者来解决,不用修改execute方法,实现了对扩展开放,对修改关闭。
版权声明: 本文为 InfoQ 作者【鸠摩智】的原创文章。
原文链接:【http://xie.infoq.cn/article/977c3398e10f096b9b04eb8c3】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论