7.1 面向对象基础
7.1.1 面向对象基本概念
7.1.1.1 类
类是在对象之上的抽象,对象是类的具体化,类定义了一组大体相似的对象结构,定义了数据和行为。包括:
- 实体类:表示现实世界中真实的实体;
- 接口类(边界类):为用户提供一种与系统交互的方式;
- 控制类:用来控制活动流,充当协调者。
7.1.1.2 对象
对象是基本的运行时的实体,它既包括数据(属性,状态),也包括作用于数据的操作(行为);一个对象通常由对象名、属性和方法组成;
对象具有清晰的边界、良好定义的行为和可扩展性。
7.1.1.3 消息
对象之间进行通信的一种构造称为消息;
7.1.1.4 方法重载
三种重载的情况:
- 方法名称相同,方法的参数个数不同;
- 方法名称相同,方法的参数类型不同;
- 方法名称相同,方法的参数类型顺序不同;
7.1.1.5 封装
一个对象把它的属性以及行为封装成一个整体;从程序设计者来看,对象是一个程序模块;从使用者来看,对象为他们提供了所希望的行为;
7.1.1.6 继承
继承是父类和子类之间共享数据和方法的机制。
一个父类可以有多个子类,这些子类都是父类的特例,父类描述了这些子类的公共属性和方法。一个子类可以继承它的父类(或祖先类)中的非私有属性和方法,这些属性和方法在子类中不必定义,子类还可以定义自己的属性和方法;
方法覆盖、方法重写:子类重写父类中已存在的方法;
两个以上的类作为一个类的父类时,称为继承,使用它可能造成子类中存在二义性成员。
7.1.1.7 多态
不同的对象收到同一个消息时产生完全不同的反应。
- 参数多态(不同类型参数多种结构类型) :使用最多,最纯的多态
- 包含多态(父子类型关系):子类型化,一个类型是另一个类型的子类型
- 过载多态(类似于重载,一个名字不同含义):同一个名字在不同的上下文中所代表的含义不同
- 强制多态(强制类型转换)
多态是由继承机制来支持;
动态绑定:指对象类型在运行时才能确定;
静态绑定:指对象类型在编译时才能确定;
7.1.2 面向对象
7.1.2.1 面向对象设计原则
- 单一责任原则:就一个类而言,应该仅有一个引起他变化的原因;
- 开发-封闭原则:软件实体应该是可扩展的,即开放的;但是不可修改的,即封闭的;
- 里氏替换原则:子类必须能够替换他们的基类型;在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用;
- 依赖倒置原则:抽象不应该依赖于细节,细节应该依赖于抽象;高层模块不应该依赖低层模块,二者应该依赖于抽象;
- 接口分离原则:不应该强迫客户依赖于他们不用的方法;依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对细节的依赖;
- 共同封闭原则:包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则对该包中所有的类产生影响,而不对其他包中的类产生任何影响;
- 共同重用原则:一个包中的所有类应该是共同重用的;如果重用了包中的一个类,那么就要重用包中所有的类。
7.1.2.2 面向对象分析
理解问题,软件要做什么
包含五个活动:认定对象、组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息;
- 认定对象:按自然存在的实体确定对象;
- 组织对象:分析对象间关系,将相关对象抽象成类;
- 对象间的相互作用:描述各对象在应用系统中的关系;
- 基于对象操作:操作,如创建增加删除等;
- 定义对象的内部信息:属性。
7.1.2.3 面向对象设计
解决方案
将面向对象分析所创建的分析模型转化为设计模型;
与OOA对应的五个活动:识别类及对象、定义属性、定义服务、识别关系、识别包
7.1.2.4 面向对象程序设计
利用面向对象程序语言来实现设计方案;
7.1.2.5 面向对象测试
四个层次:算法层、类层、模版层、系统层
- 算法层(测试类中定义的每个方法,类似单元测试)
- 类层(测试同一个类中所有方法与属性的相互作用,特有的模块测试)
- 模板层(测试一组协同工作的类之间的相互作用,类似集成测试)
- 系统层(类似系统测试)
7.1.3 其他
- 在领域类模式中包括属性、操作、关联;
- 采用面向对象方法进行软件开发,在分析阶段,架构师主要关注系统的行为;