第10章 面向对象设计
- 格式:doc
- 大小:55.00 KB
- 文档页数:4
面向对象设计面向对象设计是一种软件开发方法,它将现实世界中的事物抽象为对象,并通过定义对象的属性和方法来描述其特征和行为。
面向对象设计的核心思想是将系统组织为一系列相互协作的对象,每个对象都有自己的状态和行为,并且可以通过消息传递来与其他对象进行交互。
面向对象设计具有以下优点:1. 模块性:面向对象设计将系统分解为多个独立的对象,每个对象负责一部分功能。
这种模块化的设计使得系统易于维护和扩展。
2. 可重用性:面向对象设计鼓励通过继承和多态来实现代码的重用。
通过定义通用的父类和子类的特殊化实现,可以在不改变现有代码的情况下添加新功能。
3. 灵活性:面向对象设计可以应对需求的变化。
由于每个对象都相对独立,因此可以更容易地修改或替换单个对象,而不会影响到整个系统。
4. 可理解性:面向对象设计使用自顶向下的抽象思维模型,将现实世界的复杂性抽象为简单的对象和类的关系,使得系统的结构更加清晰可理解。
为了更好地应用面向对象设计,我们需要遵循一些基本原则和模式:1. 单一职责原则(SRP):一个类应该只有一个引起它变化的原因。
每个类都应该有一个清晰而独立的责任范围,这样可以提高代码的可维护性。
2. 开放封闭原则(OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
通过利用接口、抽象类和多态,可以在不改变现有代码的情况下添加新功能。
3. 里氏替换原则(LSP):子类对象可以替换父类对象,并且其行为不会改变。
这个原则确保继承关系的正确性,避免了代码的混乱和错误。
4. 接口隔离原则(ISP):客户端不应该依赖于它不需要的接口。
接口应该尽可能小,具体到客户端的需求,避免了不必要的代码依赖。
5. 依赖倒置原则(DIP):高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
抽象类和接口在面向对象设计中起到了关键的作用,通过它们来定义高层模块和低层模块之间的关系。
除了以上原则,还有一些常用的面向对象设计模式,例如单例模式、工厂模式、观察者模式等。
面向对象设计面向对象程序由对象组成,对象包括数据和对数据进行操作的过程(通常称为方法)。
面向对象设计最困难的部分是将系统分解成对象集合。
因为要考虑许多因素:封装、粒度、依赖关系、灵活性、性能、扩展、复用等等,并且这些因素通常还是互相冲突的。
那么科学地对实体进行分解,合理地设计类与类、对象与对象之间的依赖关系的是至关重要的。
1. 面向对象七大设计原则•单一职责原则:设计目单一的类;•开闭原则(OCP):对扩展开放(对提供方),对修改封闭(对使用方)。
用抽象构建框架,用实现扩展细节。
o当软件需要变化时,尽量通过扩展来实现,而不是通过修改原有的方法。
•里氏替换原则:子类可以对父类进行扩展,但不能改变父类原有功能;o子类尽可能不重写父类的非抽象方法,继承实际是让两个类的耦合性增强了。
运用里氏替换原则可以将父类设计为抽象方法或者接口,让子类继承父类或实现接口,并实现父类中的抽象方法,尽量不要重写父类的非抽象方法。
•依赖倒置原则:要依赖于抽象,而不是具体的实现;针对接口编程;o依赖倒置的三种方式:构造器、接口、set方法;•接口隔离原则:使用多个专门的接口比使用单一的总接口要好;(接口的单一职责,尽量使用最小接口)o即接口的定义要尽量实现单一职责,子类不应实现自己不需要的方法。
同时也要注意接口的粒度,接口不能过小,过小会导致接口泛滥,不利于代码维护。
•组合重用原则:要尽量使用组合/聚合,而不是继承来达到重用的目的;•迪米特法则(最少知识法则):一个对象应当对其他对象尽可能少的了解;2. 设计模式(一)设计模式的基本概念设计模式:是对软件设计中普遍存在的(反复出现)的问题,所提出的解决方案。
主要关注软件系统的设计,与具体实现语言无关;•架构模式:软件设计中的高层决策(如C/S架构就属于架构模式);•惯用法:与语言相关,是最底层的模式,关注软件系统的设计与实现,实现时通过特定的编程语言来描述构件与构件之间的关系。
面向对象设计面向对象设计(Object-oriented design,简称OOD)是一种软件设计方法,强调将现实世界中的事物抽象成对象并建立对象间的关系来解决问题。
面向对象设计是面向对象编程(OOP)的基础,它通过封装、继承和多态等机制,提供了一种灵活、可扩展和易于维护的软件设计方法。
面向对象设计的基本原则是封装、继承和多态。
封装将数据和操作封装在一个对象中,通过接口暴露对象的行为,隐藏内部实现细节。
继承通过派生新的类扩展或修改现有类的功能,提高代码的复用性和扩展性。
多态通过定义一组相同的接口,不同的对象可以根据自身的类型实现不同的行为,提高代码的灵活性和扩展性。
在面向对象设计中,首先要分析问题,确定问题空间中的对象及其关系。
然后,根据对象的属性和行为,设计对象的类。
类是对象的抽象,包含了对象的属性和方法。
接着,定义对象间的交互方式和协作关系,包括对象之间的消息传递和方法调用。
最后,实现类的具体代码,通过创建对象、调用对象的方法来解决问题。
面向对象设计有许多优点。
首先,它提供了一种自然的方式来描述问题空间,使得软件设计更加直观和易于理解。
其次,面向对象设计具有高内聚、低耦合的特点,可以减少软件的复杂性,提高代码的可维护性和可扩展性。
此外,面向对象设计也能够提高代码的重用性,通过继承和多态的机制,可以更好地复用已有的代码。
然而,面向对象设计也存在一些挑战。
首先,面向对象设计需要进行全局的系统分析和设计,涉及多个对象和类的交互,需要耗费大量的时间和精力。
其次,面向对象设计需要合理地划分对象和类的职责,避免出现职责不清晰和耦合度过高的情况。
最后,面向对象设计需要谨慎地选择继承和多态的使用方式,以避免出现冗余的代码和复杂的继承关系。
综上所述,面向对象设计是一种强调对象和类的关系和交互的软件设计方法,通过封装、继承和多态等机制,提供了一种灵活、可扩展和易于维护的软件设计方法。
面向对象设计能够提高代码的可维护性、可扩展性和重用性,但也需要进行全局的系统分析和设计,并且需要合理地划分职责和选择继承和多态的使用方式。
第10章面向对象设计
10.1 软件模块之间的依赖性可以从哪些角度和抽象层次进行分析?
在面向对象软件中,常见的软件模块有类、接口、包、构件。
因此,分析软件模块之间的依赖性就可以从类、接口、包和构件的角度和层次进行分析。
10.2 消除包之间循环依赖性的方法是什么?
本质上,两个包之间的依赖性来自于两个包中类之间的依赖性。
类之间的循环依赖性是个特别棘手的问题,好在大多数情况下可以通过重新设计避免循环依赖性。
具体方法是增加新包。
举例说明如下:
在下图中,包A依赖于包B,反过来包B又依赖包A,构成了循环依赖。
具体解决办法是:将包B依赖的包A中的元素从包A中分离出来,组成包C,使得包B不再依赖包A,而是依赖包C。
10.3 请给出构件的一般性定义,然后给出传统的软件工程环境及面向对象的软件工程环境中构件的定义,最后选择你熟悉的编程语言说明怎样定义一个构件。
软件构件是一种组装单元,它具有规范的接口规格说明和显式的语境依赖。
软件构件可以被独立部署,并由第三方任意组装。
OMG UML规范中将构件定义为“系统中某一定型化的、可配置的和可替换的部件,该部件封装了实现并暴露一系列接口”。
在传统的软件工程环境中,一个构件就是程序的一个功能要素,程序由处理逻辑和实现处理逻辑所需的内部数据结构以及能够保证构件被调用和实现数据传递的接口构成。
传统的构件也称为模块,是软件体系结构的一部分。
在面向对象的软件工程环境中,面向对象技术已达到了类级复用,而构件级复用则是比类级复用更高一级的复用,它是对一组类的组合进行封装(当然,在某些情况下,一个构件可能只包含一个单独的类),并代表完成一个或多个功能的特定服务,也为用户提供了多个接口。
一个构件可以是一个编译的类,可以是一组编译的类,也可以是其他独立的部署单元,如一个文本文件、一个图片、一个数据文件、一个脚本等。
选择你熟悉的编程语言说明怎样定义一个构件。
(略)
10.4 典型的面向对象设计模型在逻辑上由哪几部分组成?对每一部分进行设计时所包含的主要内容是什么?
典型的面向对象设计模型在逻辑上将系统划分为4个部分,分别是问题域部分、人机交互部分、任务管理部分及数据管理部分。
1)问题域部分的设计
在面向对象设计过程中,可能要对面向对象分析所得出的问题域模型进行补充或调整。
例如,调整需求、复用已有的类、把问题域类组合在一起、增添泛化类以建立类间的协议、调整继承的支持级别、改进性能等。
2)人机交互部分的设计
人机交互界面的设计质量直接影响到用户对软件的使用。
在设计阶段,必须根据需求把交互细节加入到用户界面设计中,包括人机交互所必需的实际显示和输入。
3)任务管理部分的设计
任务管理主要包括任务的选择和调整。
常见的任务有事件驱动型任务、时钟驱动型任务、优先任务、关键任务和协调任务等。
设计任务管理子系统时,需要确定各类任务,并将任务分配给适当的硬件或软件去执行。
4)数据管理的设计
在采用面向对象方法进行软件开发时,数据的存储还是普遍使用关系数据库。
在面向对象设计中,可以将UML类图看作是数据库的概念模型,一个类可以映射为一个表或多个表,此外,还要考虑类之间的关联关系、继承关系的映射。
10.5 用面向对象方法设计网上购书系统的软件结构,网上购书系统的业务如下:
某书店为方便客户通过Internet购买相关图书,开发一个“网上购书系统”,客户可以通过Web页面注册并登录“网上购书系统”,通过Web页面查看、选择图书,系统根据用户选择的图书单价、数量,系统自动生成订单,并计算总价格。
客户在提交订单之前,必须填写关于寄送地址和发票及付款方式等细节,一旦订单被提交,系统显示确认信息,并附上订单的详细信息。
客户可以在线查询订单的状态。
系统管理人员查看客户的订单,验证客户的信用和付款方式,向仓库请求所购图书,打印发票并发货。
答:本系统从逻辑结构上分为三层,Web页面层,业务逻辑层和数据库层。
Web页面层负责接收用户的请求,业务逻辑层在获知用户请求后,执行相应的业务逻辑,向数据库层发出数据请求,获得所需要的数据后,通知Web页面层将数据呈现给用户。
10.6 对10.5中的网上购书系统设计其问题域的类图。
问题域类包括客户类、系统管理员类、购物车类、订单类、图书类和发票类。
用户分为客户和系统管理员两种,所以是泛化关系。
客户和系统管理员都要对订单进行操作,所以和订单的关系是依赖关系。
购物车中存放的是用户选购的图书,是聚集关系。
具体见下图:
10.7 一所大学下设多个系,每个系包含多个教研室和多个学生班级。
每位教师只能归属于一个教研室。
学生分为本科生和研究生两种。
每位教师可以承担多门课程的教学任务,每个学生可以选修多门课程。
请根据以上问题描述画出类图。
从问题描述中,可得到大学、系、教研室、学生班级、教师、学生、教学任务、课程、本科生和研究生这10个类。
大学与系、系与教研室、学生班级、教研室与教师、学生班级与学生都是聚集关系,也可以看做关联关系。
学生同本科生、研究生之间是泛化关系。
具体见下图:
10.8 如何将含有继承关系的类图映射为关系数据库?针对10.6中设计的类图设计关系数据库。
通常使用以下两种方法来映射继承关系:
1)将基类映射到一张表,每个子类映射到一张表。
在基类对应的表中定义主键,而在子类对应的表中定义外键。
2)将每个子类映射到一张表,没有基类表。
在每个子类的表中包括基类的所有属性。
这种方法适用于子类的个数不多,基类属性比较少的情况。
在10.6题的类图中,共有7个类。
其中,用户同客户和系统管理员类是泛化关系,可映射为两个表——客户信息表和系统管理员信息表;如果客户类和系统管理员类二者的属性基本相同,也可以映射为一个表,只需在表中添加一个新属性来区分客户和系统管理员即可。
购物车、图书、订单和发票可分别映射得到一个表。