1. 编程方式
我们目前的编程方式大体可以有以下三种编程方式:
顺序编程
过程式编程
面向对象编程
在讲面向对象编程时先讲一下什么是顺序编程,什么是过程式编程,什么是面向对象编程:
顺序编程: 就是只用一个单线程去执行一段代码,执行过程根据代码依次从上到下按顺序执行各种指令操作
过程式编程:过程式的编程中心是围绕着代码,比如当程序执行到某一个位置的时候回调用一个其他的方法来实现剩余的业务逻辑,然后程序继续往下执行,这就是过程式编程。通俗一点使用函数的方式来编写代码都属于过程式编程,更深层次的,例如某些PHP开发者虽然使用了类的概念来写程序,但是还是区域过程式的方式编程,doris周围的大多数同事就是如此,包括doris在了解面向对象编程之前也同样采用过程式的方式写程序。
面向对象编程:通俗的讲就是就是在写程序时,我们程序员自己设计出N多个对象(工作者)出来分工合作一起完成某项任务,这就是面向对象编程。这里说设计多个对象,那么我们如何去设计?这就是doris接下来的一段时间里与大家一起分享doris对面向对象的一些看法及平时工作中的一些总结了。
2. 为什么要采用面向对象编程
2.1 解决问题更容易
设计计算机程序就是为了解决人类的问题。其策略就是讲大的问题拆分成小的问题来逐一解决,而面向对象大体的讲就是这个原理,将大的复杂的问题进行拆分由小的个体来完成然后再进行组装就可以把这个复杂的问题逐一破解,这就是模块化设计风格。你可能认为模块化看起来并不太难。没错,问题越复杂,模块化就越有意义。所以OOP编程的出发点绝对不是要把复杂的问题更复杂化,反而是是要把复杂的问题简单化。即使是最困难的编程问题也可以采用这种分而治之的策略来解决。
2.2 开发和修改速度更快
在团队合作中特别能体现面向对象编程的优越性,我们可以大的问题拆分成很多个小的问题,模块的目的就是解决比较复杂的问题的某一方面,这样我们就得到了面向对象编程的首要原则之一(即单一职责原则),并将这些小问题进行组装(意思就是代码架构)起来,然后在把这些小的问题分配给其它开发人员,进行开发,这样在开效率上可以大大提高开发效率,并且开发者之间的代码冲突也会降到最低。
类似于OPP,过程式编程也是用了模块和重用。不过,过程式编程没有提供类(利用类,贬称任务可以打包到对象)。类对象(类实例)可以处理自己的数据结构,这是函数无法单独做到的,因此,如果采用过程式编程,完成大型任务往往需要很长时间的序列。另外,采用过程式编程时,团队合作也比较困难,因为不同的团队成员无法像采用OPP那样轻松地处理独立单相互关联的类。
3. 为什么面向对象如此之难
如果问doris为什么面向对象那么难就好比问doris为什么架构师工资那么高且没几个人达得到是同一个问题。因为面向对象编程是需要编程经验的一个提炼的,如果经验越丰富那么面向对象程序的设计就越灵活,这里说的经验是指使用面向对象编程的经验,而不是上文提到的顺序编程和过程式编程那些经验。面向对象编程需要对业务及代码的架构是有一定的要求的。一切程序的设计都离不开业务逻辑。在学习OOP和设计模式时,你需要记住:
设计面向对象软件很困难
设计可重用面向对象软件更困难
当然啦,不能把这些说法作为放弃学习OOP和设计模式的理由,而应当由此看出OPP和设计模式为什么这么有意义。知识会增加技能的价值,得到知识越困难,说明它就越有价值。
4. 如何学习OOP思想及设计模式
不要期望能轻松快速地掌握OOP和设计模式,要在你的编程中逐步渗入,一次结合一点,总有一天你会发现它的价值所在。过一段时间后,你会拥有更多的技能,有更深入的理解。你可能会遇到某个项目,发现可以在其中重用之前另外一个项目的大部分程序结构。
5. 面向对象编程基本原则
我们在使用面向对象编程时一定要记住以下几个基本原则(也就是设计面向对象程序的基本原则),这样才能够更好的理解面向对象的深意。
5.1 单一职责原则
本着低耦合、高内聚原则,一个类做一件事。
对于单一职责原则,其核心思想为:一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而大大损伤其内聚性和耦合度。通常意义下的单一职责,就是指只有一种单一功能,不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。
5.2 开放封闭原则
当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求!更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!通俗的讲就是:对扩展开放、对修改关闭
5.3 里氏替换原则(LSP)
意思就是说我们依赖父类接口,在客户端声明一个父类接口,通过其子类来实现,这个时候就要求子类必须能够替换父类所出现的任何地方,这样做的好处就是,在根据新要求扩展父类接口的新子类的时候而不影响当前客户端的使用!
5.4 依赖倒置原则
传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也
称为高层依赖低层!所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖低层模块,所以称之为依赖倒置原则!通俗一点就是(面向接口编程)
5.5 ISP 接口隔离原则
这个原则的意思是:使用多个专门的接口比使用单个接口要好的多!为了减少接口的定义,将许多类似的方法都放在一个接口中,最后发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!
完!