现代软件工程——OO面向对象概述
面向对象技术
基本特征
**抽象:**抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。
封装:也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性是指允许不同类的对象对同一消息作出响应。
基本原则
单一职责原则:是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
**开放封闭原则:**一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
**里氏替换原则:**子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,
依赖倒置原则:
具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类:
而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。**接口分离原则:**模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来
迪米特法则
组合由于集成原则
优点
易维护:采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
质量高:在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
效率高:在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。缩短开发时间。
易扩展:由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
思想
分解、抽象、模块化、信息隐蔽思想。
优势
**稳定:**较小的需求变化不会导致系统结构的改变
**易于理解:**面向对象模型隔年贴切放映了现实世界。
**更好的适应性:**能更好的适应变化
更高的可靠性
面向对象术语
对象
系统中用来描述客观事物的一个实体。他是构成系统的基本单位,一个对象由一组属性和对这组属性的操作的一组方法组成。
补充说明:
对象之秒速客观事物的、与系统目标相关的特性。
在软件生命周期的不同阶段,对象有不同的表现形式。粗略定义、对象图、代码实现
对象之间通过消息通信。
类
类是具有相同属性和方法的一组对象的集合。它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和方法两个部分。
补充说明:
同类对象具有相同的属性和方法,定义形式相同,但是属性值不同。
类是静态的。
对象是动态的。
封装
把对象的属性和方法结合成独立的系统单位,并尽可能隐蔽对象的内部细节。
补充说明:
接口和实现两部分。接口可见,实现不可见。
保护对象不被用户修改,保护客户端。
继承
特殊类的对象拥有一般类的全部属性与方法。
补充说明
继承保证类之间的一致性。所有子类拥有相同的父类属性和操作,可以添加自己的属性和操作。
贴近现实
增加重用
可以分为单继承和多继承
多态
一个实现提在不同的上下文条件下具有不同意义或用法的能力。
补充说明:
静态联编支持的多态性称为编译时的多态性,也称静态多态性,它是通过函数重载、运算符重载和模板实现的。
动态联编支持的多态性称为运行时的多态性,也称动态多态性,它是通过继承和虚函数实现的。
继承多态-向上转型:父类的引用可以指向子类对象。子类可以调用父类的方法。
继承多态-向下转型:子类的方法可以指向父类。
消息
向对象发出的服务请求。提供服务的对象标识、服务方法标识、输入信息、回答信息。
补充说明
通过消息进行对象间的通信
消息,不适用函数调用的说法,意思在某些情况下相同。










