面向对象设计
面向对象设计
目标与方法
随着程序代码不断扩张,软件中各部分交互关系日益庞杂,其维护扩展变得异常困难,为应对此危机,面向对象设计方法得到不断发展,其要实现的目标与所用方法如下:
- 实现目标:模块相互独立,即插即用;
- 使用方法:约定抽象接口,减少依赖;
特点
面向对象的设计有三大特点,区别于其他编程范式,分别为:
- 封装:隐藏内部实现,达到使用接口编程而不用了解内部实现的目的;
- 继承:继承父类的属性与数据,达到代码复用的目的;
- 多态:对于同一种接口,不同的类型的对象展现不同的行为,达到接口统一的目的;
基本原则
为实现面向对象设计的目标,开发领域在长期理论与实践中总结出几个基本原则,不同的教材的阐述略有不同,但是表达的基本思想是一致的,最为经典的说法是将面向对象设计的这几个原则称为“SOLID”原则,名称取自这五个原则的英文缩写首字母,同时寓意在这几个原则指导下所开发软件系统的稳固性;
单一职责原则 (SRP - Single Responsibility Principle)
一个类只做一件事,一个类应该仅有一个引起它变化的原因,且其变化隐含着类的责任;
比如,在实际开发中,对大的类进行拆解,减少类中蕴含不同概念的成员变量与成员函数;
开放封闭原则 (OCP - Open Closed Principle)
对扩展开放,对修改关闭;即当程序需要扩展的时候,尽量不要去修改原来的代码,而应复用扩展代码,使其易于维护和升级,同时还能减少编译时间;
因此在开发中,要利用好继承与组合等方法,约定抽象接口,让系统中的组件相互解耦,互不影响;
里氏替换原则 (LSP - Liskov Substitution Principle)
子类必须能够替换父类,即子类对象若看作是抽象父类使用时,其接口行为须与抽象语义所期望的一致,这也是开闭原则具体实现手段之一;
所以在实际开发中,使用继承实现约定的抽象接口,可以对同一抽象语义实现不同的具体方法;
这条原则也提示我们:
- 在开发中不要仅仅为了使用一个类的属性或方法就使用继承,此时应该使用组合代替继承;
- 真正使用继承的地方应该是:一个类的概念是另一个类的概念的更上一层抽象;
接口隔离原则 (ISP - Interface Segregation Principle)
接口应小而完备,程序不要依赖不需要的部分;若不需要的接口太多,则会给用户程序更多困惑,且相应具体实现也会增多;当不需要的接口被修改,那么其依赖者也要被重新编译部署;
所以在开发中,public的抽象接口应该尽量少而精;
依赖倒置原则 (DIP - Dependency Inversion Principle)
针对接口编程,程序应依赖于抽象接口而不依赖于具体实现;
抽象不应依赖于实现细节,而应反过来,让实现细节依赖于抽象,因为抽象接口一般是经过长期设计共同约定,是稳定的,而实现细节一般是多样且多变的;
所以在开发中,需精心设计抽象接口,力求抽象接口稳定,同时让具体实现依赖于(使用继承)抽象接口,当具体实现变动时,抽象接口无需变化;
设计模式
在五大设计原则指导下,经过长期工程实践,开发领域总结出了很多实用的设计“套路”,其中最为经典与广泛使用的就是各教科书中介绍的23种设计模式;
随着软件开发领域的不断发展,各种设计模式还在不停的变化,但是这些设计模式所体现的设计原则是一直稳固不变的;
关于设计模式,篇幅所限,在本文中便不再展开;
总结
我们在面向对象编程实践中,需要不断理解巩固并灵活应用面向对象的基本原则与各种设计模式,不断提升程序的可维护性与可扩展性,在此与大家共勉;
参考
- GoF,设计模式--可复用面向对象软件的基础,机械工业出版社,2000年09月;
- 李建忠,C++设计模式课程;
- 程序喵大人 ,一文让你搞懂设计模式;