一、面向对象 vs 面向过程
实际上,面向对象的技术是在面向过程的基础上,为程序设计提供了更多的手段和方法。两种技术不是非此既彼的对立关系,不能说面向对象的技术替代了面向过程,如果用面向对象的技术就要把一个软件任务划分成两个层次,第一个层次是做什么,第二层次是怎么做。那么面向对象技术是解决第一个层次的问题,面向过程则是解决第二个层次的问题,只有在两个层次上的任务都完成之后,才能说完成了整个程序设计任务。也就是说这两种程序设计方法只是从不同的层次来完成程序设计的任务。面向对象的技术是在面向过程的基础之上,又提供了抽象、封装、继承、多态技术手段,从而能够设计出更好更复杂的软件。可以说面向对象技术中存在着面向过程,或者说面向对象技术就是抽象、封装、继承、多态加上顺序、条件、循环三种控制结构的使用。
1.1 面向过程:3
面向过程有“三”种控制结构:顺序、条件、循环。1.2 面向对象:4+3
面向对象可以认为又提供“四”种技术:抽象、封装、继承、多态;用面向对象技术设计类后,一个类中就会有若干方法,每个方法完成一个特定的功能在考虑类的行为功能实现时,显然是面向过程的思维方式,只是这些方法不再独立,而是与数据一起形成了一个有机的整体。面向过程技术存在于也就是类方法实现之中。
面向对象的设计包含了面向过程,面向对象比面向过程站到了一个更高的层次上,主要进行总体结构模型设计(构建类),对数据和方法进行封装,面向过程主要是写函数或过程也就是确定类中的方法的实现,这也是类中的方法必须要做的步骤。所以说用面向对象的技术设计软件时包含了面向过程。
【类的关系】
泛化(继承)
实现
依赖use
关联and
聚合has
组合contain
1.3 面向对象与面向过程的同一性
众所周知,无论是面向对象还是面向过程在描述问题时总是围绕着两个方面:方法和数据。面向对象是方法和数据合并或封装,面向过程是方法和数据分开或隔离。由于面向对象实现了数据和方法的封装,它的好处就是使得类中方法的输入数据多了一个来源,也就是输入数据有了两个来源,一个是类中的属性变量,另一个是方法的形式参
数。也就是说当类中的属性能够满足类中的方法输入数据的需要,就可以无参数。虽然无参数,但具备有参数的功能,原因是类中的属性是可以随时变化的。这归功于面向对象的封装技术。当然,也可使用方法本身的数据----形式参数,这就形成了同一方法的两种不同的实现,面向对象技术中的多态性,使这两种方法能够共存于一个类中,增加了类的可适应性和简洁性。
如果用面向过程的技术,则只能设计出一个独立的过程或函数,因为面向过程的程序和数据是分开的,每个过程也都是独立的,所以过程或函数在设计时没有别的数据来源只有依赖于参数,无法从别处获取数据。
同理,类中方法处理的数据结果也变成了有两个去处,一个是类中的属性变量,一个是方法的返回值。
这就是数据和方法封装在一起的好处,它使得输入输出有了更多的选择,这也是设计方法时解决算法之后要解决的重要问题。
1.4 面对对象六大原则
1.4.1 开闭原则(Open Close Principle)
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要做好抽象,并使用接口和抽象类。
1.4.2 里氏代换原则(Liskov Substitution Principle)
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。