面向对象:
个人认为是一种描述和构建系统的方法论。一个系统由互相作用的对象组成,对象状态决定系统的状态,对象的行为决定系统的行为。对象是通过抽象得到的,一个对象是对相关状态和行为的封装,继承是对象之间一种重要的关系,而对象的行为往往是多态的。
抽象与对象:
抽象是面向对象的基础。对象自身的状态与行为,对象之间的关系都是抽象的结果,没有抽象就没有对象。
现实世界的对象通过抽象转换为系统中的对象。
抽象包括: 对象属性抽象、对象行为封装抽象,对象公共行为的提炼,非显示对象的抽象(策略 状态),类与类的结构、关系、行为抽象提炼。
面向过程、基于对象、面向对象区别:
面向过程:程序由模块构成,对模块进行设计、编码、测试最后将模块有机的组合在一起形成完整的程序。
面向过程通常采用自顶向下设计方法进行设计。
自顶向下设计优点是既直观又有条理,但面对软件可维护性差
面向对象:以面向对象设计方法设计,着重于类的设计,抽象各个对象,封装对象的属性及行为,组织对象的关联关系。
基于对象:实现类的封装,即使具备继承的类层次,但没有多态依旧属于基于对象编程。而面向对象封装、继承、多态缺一不可。
为什么多态是区分的唯一标识呢? 个人理解 继承、封装你操作的仅仅是单个对象,基于单个对象使用。而多态会触发多个对象的调用,而不基于单个对象,而是面向对象,面向关系所关联的各个对象。
面向对象作用:
复杂性系统为诞生面向对象设计方法提供了场景,复杂性是面向对象要主要解决的问题
复杂性包括软件固有的复杂性和复杂系统的复杂性
软件固有的复杂性:
1)问题域的复杂性(现实的大量需求及变化)
2)管理开发过程的复杂性(团队协作沟通)
3)软件中随处可见的灵活性
4)描述离散系统的复杂性
复杂系统的五个属性
1)层次结构
2)相对本原
3)分离关注
4)共同模式
5)稳定的中间形式
层次结构的形式 : part of , is a
分解:算法分解 对象分解
如何进行对象的抽取设计:
1)从不同层次对现实世界进行抽象,提取出他们的核心属性及核心行为
2) 确定对象之间的功能边界及依赖关系
3)定义对象的核心属性和方法
4)定义对象的公有和私有部分
5)定义接口及其需要的参数并抽取成上下文
6)定义主要子程序及其实现细节
面向对象原则:
1)单一职责原则
2)开闭原则
3)里氏代换原则
4)依赖倒转原则
5) 接口隔离原则
6)合成复用原则
7) 迪米特原则
面向对象的弊端:
OOP影响性能:内存墙问题,内存成为现在计算器性能的重要瓶颈。OOP编程对缓存不优好导致有时候并不能发挥硬件最佳性能。
1)过度包装
使用OOP时,会把一些复杂的问题分拆抽象成较简单的对立对象,通过对象的调用实现方案。由于对象包含自己分装的数据,一个问题的数据集会被分散在不同的内存区域,互相调用很可能出现数据的cache miss的情况
2)多态
C++多台实现会使用到虚函数表,在调用的时候需要读取虚函数表增加cache miss的可能性。
3)数据布局
虽然OOP并无限制数据的布局方式,但基本大部分OPP会把成员变量连续包裹在一段内存中。在OOP中通过封装一个类的各个功能会被实现为多个成员函数,而每个成员函数实际上可能只会存取少量的成员变量,造成其他成员变量的载入浪费。
面向对象的弊端: