常见的面向对象语言:Java、Objective-C、C++、PHP、Smalltalk
1.面向对象(OOP):是软件开发方法,对现实世界理解和抽象的方法
类(Class)是一种抽象数据类型,用于描述具有相似属性(数据)和行为(方法)的对象的模板或蓝图。
对象指的就是类(class)的实例,OPP将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
2.基本特征:
封装性:通过限制只有特定类的对象可以访问这一特定类的成员
继承:子类会继承父类的属性和行为,并且也可包含自己的
多态:指有继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应
3.面向对象的基本原则:
(1)开闭原则(OCP):软件实体应当对扩展开放,对修改关闭
作用:使得软件实体拥有一定的适应性和灵活性的同时具备稳定性和延续性
1.有利于软件测试
2.提高代码的可复用性
3.提高代码的可维护性
(2)里氏替换原则(LSP):继承必须确保超类所拥有的性质在子类中仍然成立
通俗来讲,里氏替换原则就是子类可以扩展父类的功能,但不能改变父类原有的功能
里氏替换原则是实现开闭原则的重要方式之一。
它克服了继承中重写父类造成的可复用性变差的缺点。
是动作正确性的保证,类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
(3)依赖倒置原则:要面向接口编程,不要面向实现编程
作用: | 实现方法: |
可以降低类间的耦合性 | 1.每个类尽量提供接口或抽象类,或者两者都具备 |
可以提高系统的稳定性 | 2.变量的声明类型尽量是接口或者是抽象类 |
可以减少并行开发引起的风险 | 3.任何类都不应该从具体类派生 |
可以提高代码的可读性和可维护性 | 4.使用继承时尽量遵循里氏替换原则 |
(4)单一职责原则:一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分
该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点: | 单一职责的优点: |
1.一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力 | 降低类的复杂度 |
提高类的可读性 | |
2.当客户端需要该对象的某一职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费 | 提高系统的可维护性 |
变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。 |
(5)迪米特法则(最少知识原则):如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。
优点: | 缺点: |
1.降低了类的之间的耦合度,提高了模块的相对独立性 | 过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低 |
2.由于亲和度降低,从而提高了类的可复用率和系统的扩展性 |
实现方法:
1.创建弱耦合的类,耦合越弱越有利于实现可复用
2.在类的结构设计上,尽量降低类成员的访问权限
3.在类的设计上,优先考虑将一个类设置成不变类
4.在对其他类的引用上,将引用其他对象的次数降到最低
5.谨慎使用序列化(Serializable)功能
(6)合成复用原则(CRP):要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。
实现方法:合成复用原则是通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。
继承复用的缺点: | 合成复用原则的优点: |
父类的修改会影响到所有的子类,可能引起意想不到的副作用; | 代码的复用性更高,避免了继承关系的一些问题; |
子类可能会继承一些不需要的属性和方法,导致代码臃肿和难以维护; | 代码的灵活性更强,可以在运行时动态地改变组合关系; |
继承关系无法在运行时动态修改,限制了代码的灵活性。 | 代码的可读性更好,因为组合关系比继承关系更清晰明了。 |
4.面向对象的优点:
①封装性:通过类的封装,隐藏了内部细节,只暴露必要的接口,提高了代码的安全性和可维护性。
②继承性:继承可以重用现有代码,减少了代码的重复性,并且方便了代码的扩展和维护。
③多态性:多态可以使代码具有灵活性和扩展性,通过对接口的实现或重写基类方法,使得不同的对象可以具有不同的行为。
④可读性:面向对象的代码更加符合人类的思维方式,易于理解和维护。
⑤可复用性:面向对象的代码可以方便地复用,通过继承、接口、组合等方式可以实现代码的复用。
5.面向对象的缺点:
①复杂性:面向对象的设计和实现需要较高的技术水平和经验,如果设计不当,会导致代码复杂、混乱、难以维护。
②性能问题:面向对象的代码比面向过程的代码执行速度较慢,因为需要动态分配内存和调用方法等操作。
③学习成本:面向对象的编程概念较多,学习成本较高。