面向对象开发
面向对象基本概念
类和对象
-
对象:由数据及其操作所构成的封装体,是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位。一个对象通常可以由对象名、属性和方法 3 个部分组成。
-
类:现实世界中实体的形式化描述(是对象的抽象),类将该实体的属性(数据)和操作(函数)封装在一起。对象是类的实例,类是对象的模板。先有类后有对象。
-
类可以分为三种:实体类、接口类(边界类)和控制类。实体类的对象表示现实世界中真实的实体,如 人、物等。接口类(边界类)的对象为用户提供一种与系统合作交互的方式。分为人和系统两大类,其中人的 接口可以是显示屏、窗口、Web 窗体、对话框、菜单、列表框、其它显示控制、条形码、二维码或者用户与系统交互的其它方法。系统接口涉及到把数据发送到其它系统,或者从其它系统接受数据。控制类的对象用来控制活动流,充当协调者。
学生参加考试,通过笔手写,笔就是边界类。学生交卷的时候,需要一个一个交,这个时候就需要一个控制类。用来控制某个业务流。
面向对象四大特征
-
抽象:通过特定的实例抽取共同特征以后形成概念的过程。它强调主要特征、忽略次要特征。一个对象是现实世界中一个实体的抽象,一个类是一组对象的抽象,抽象是一种单一的描述,它强调给出与应用相关的特性,抛弃不相关的特性。
-
封装:是一种信息隐藏技术,将相关的概念组成一个单元模块,并通过一个名称来引用。面向对象封装是将数据和基于数据的操作封装成一个整体对象,对数据的访问或修改只能通过对象对外提供的接口进行。
-
继承:表示类之间的层次关系(父类和子类),这种关系使得某类对象可以继承另一类对象的特征,又可分为单继承和多继承。
-
多态:不同的对象收到同一个消息时产生完全不同的结果,包括参数多态(不同类型参数多种数据结构)、包含多态(父子类型关系)、过载多态(类似于重载,一个名字不同含义)、强制多态(强制类型转换)四种类型。多态由继承机制支持,将通用消息放在抽象层,具体不同的功能实现放在底层。
其它概念
-
接口:描述对操作规范的说明,只说明操作应该做什么。并没有定义操作如何做。
-
消息:体现对象间的交互,通过它向目标对象发送操作请求。
-
覆盖:子类在原有父类接口的基础上,用适合自己要求的实现去置换父类中的相应实现。即在子类中重定义一个与父类同名同参的方法。
-
函数重载:与覆盖要区分开,函数重载与子类父类无关,且函数名是同名不同参数。
-
绑定是一个把过程调用和响应调用所需执行的代码加以结合的过程。在一般的程序设计语言中,绑定是在编译时进行的,叫做静态绑定。动态绑定则是在运行时进行的,因此,一个给定的过程调用和代码的结合直到调用发生时才进行。
面向对象开发
面向对象分析(做什么?)
-
面向对象分析是为了确定问题域、理解问题。包含五个活动:认定对象、组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息。
-
面向对象需求建模,两种模型(需要记住):

-
建立用例模型就是建立 UML 中的用例图,用例图可以反映系统中的参与者和系统用例的关系。
-
静态分析模式:类图、对象图
-
动态分析模型:活动图、序列图
用例模型用于需求获取,也可以用事件风暴,
分析模型用于需求定义,分析模型也可以成为领域模型。
面向对象设计(怎么做?)
-
面向对象设计: 是设计分析模型和实现相应源代码,设计问题域的解决方案,与技术相关。OOD 同样遵循抽象、信息隐蔽、功能独立、模块化等设计准则。
-
面向对象的分析模型主要由顶层架构图、用例和用例图、领域概念模型构成;
-
设计模型则包含以包图表示的软件体系结构图(体系结构就是架构)、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。

面向对象的测试
和软件工程中的测试没有什么大的区别,同样也分黑盒、白盒测试,单元测试、集成测试。唯一的不同是这里有四个层次。
一般来说,对面向对象软件的测试可分为下列 4 个层次进行。
- 算法层: 测试类中定义的每个方法,基本上相当于传统软件测试中的单元测试。
- 类层:测试封装在同一个类中的所有方法与属性之间的相互作用。在面向对象软件中类是基本模块,因此可以认为这是面向对象测试中所特有的模块测试。
- 模板层:测试一组协同工作的类之间的相互作用,大体上相当于传统软件测试中的集成测试,但是也有面向对象软件的特点(例如:对象之间通过发送消息互相作用)。
- 系统层:把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试。
面向对象设计原则
- 单一职责原则:就某一个类而言,应该仅有一个引起它变化的原因。即,当需要修改某个类的时候原因有且只有一个。
- 开放、封闭原则: 软件实体(类、模块、函数等)应该是可以扩展的,即开放的,但是不可修改的,即封闭的。
- 里氏替换原则:子类型必须能够替换掉它们的基类型。即,在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用。
- 依赖倒置原则:抽象不应该依赖于细节,细节应该依赖于抽象。即,高层模块不应该依赖于底层模块,二者都应该依赖于抽象。
- 接口分离原则:不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在类的层次结构。即依赖于抽象、不要依赖于具体。即:依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。这样做的好处就在于可以最大限度地应对可能的变化。