第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)的基础,它通过封装、继承和多态等机制,提供了一种灵活、可扩展和易于维护的软件设计方法。
面向对象设计的基本原则是封装、继承和多态。
封装将数据和操作封装在一个对象中,通过接口暴露对象的行为,隐藏内部实现细节。
继承通过派生新的类扩展或修改现有类的功能,提高代码的复用性和扩展性。
多态通过定义一组相同的接口,不同的对象可以根据自身的类型实现不同的行为,提高代码的灵活性和扩展性。
在面向对象设计中,首先要分析问题,确定问题空间中的对象及其关系。
然后,根据对象的属性和行为,设计对象的类。
类是对象的抽象,包含了对象的属性和方法。
接着,定义对象间的交互方式和协作关系,包括对象之间的消息传递和方法调用。
最后,实现类的具体代码,通过创建对象、调用对象的方法来解决问题。
面向对象设计有许多优点。
首先,它提供了一种自然的方式来描述问题空间,使得软件设计更加直观和易于理解。
其次,面向对象设计具有高内聚、低耦合的特点,可以减少软件的复杂性,提高代码的可维护性和可扩展性。
此外,面向对象设计也能够提高代码的重用性,通过继承和多态的机制,可以更好地复用已有的代码。
然而,面向对象设计也存在一些挑战。
首先,面向对象设计需要进行全局的系统分析和设计,涉及多个对象和类的交互,需要耗费大量的时间和精力。
其次,面向对象设计需要合理地划分对象和类的职责,避免出现职责不清晰和耦合度过高的情况。
最后,面向对象设计需要谨慎地选择继承和多态的使用方式,以避免出现冗余的代码和复杂的继承关系。
综上所述,面向对象设计是一种强调对象和类的关系和交互的软件设计方法,通过封装、继承和多态等机制,提供了一种灵活、可扩展和易于维护的软件设计方法。
面向对象设计能够提高代码的可维护性、可扩展性和重用性,但也需要进行全局的系统分析和设计,并且需要合理地划分职责和选择继承和多态的使用方式。
面向对象的设计概述OOA和OOD之间有紧密的衔接关系,从OOA到OOD是一个慢慢扩充模型的进程。
分析处置以问题为中心,能够不考虑任何与特定运算机有关的问题,而OOD 那么把咱们带进了面向运算机的“实地”开发活动中去。
通常,OOD分为两个时期,即高层设计和低层设计。
高层设计成立应用的体系结构。
低层设计集中于类的详细设计。
(1) 高层设计高层设计时期开发软件的体系结构,构造软件的总体模型。
在那个时期,标识在运算机环境中进行问题解决工作所需要的概念,并增加了一批需要的类。
这些类包括那些可使应用软件与系统的外部世界交互的类。
现在期的输出是适合应用软件要求的类、类间的关系、应用的子系统视图规格说明。
通常,利用面向对象设计取得的系统框架如图所示。
①高层设计模型一个典型的高层设计模型即客户-效劳器模型,它构造起应用软件的整体模型,那个模型导出的体系结构既可在进程性系统中利用,又可在面向对象的系统中利用。
客户-效劳器模型的方式是让系统的一个部份(效劳器子系统)提供一组效劳给系统的另一个部份(客户子系统)。
请求效劳的对象都归于客户子系统,而同意请求提供效劳的部份确实是效劳器。
图 OOD设计导出的体系结构②高层设计的规那么▪最小化各构件间的通信:在子系统的各个高层构件之间的通信量应当达到最小。
一个用户界面应当能够自行处置交互、错误更正和硬件操纵,而不需打搅主应用。
▪隐藏复杂性:子系统应当把那些成组的类打包,形成高度的内聚。
▪逻辑功能分组:尽管输入和输出设备可能彼其间不通信,但逻辑上把它们归组到一个处置输入/输出的子系统中。
如此比较容易识别并定位问题论域中的事件。
类与通过概念封装的子系统十分类似。
事实上,每一个子系统都能够被当做一个类来实现,那个类聚集它的构件,提供了一组操作。
类和子系统的结构是正交的,一个单个类的实例可能是不止一个子系统的一部份。
高层设计时期增加了一批必要的类,要紧包括了那些可使应用软件与系统的外部世界交互的类。
第10章例题分析与解答作者:不详来源:2006年9月4日发表评论进入社区一、填空题1.面向对象方法认为系统是由应用域的___对象___组成。
2.对象具有状态,描述对象的状态用它的_属性值_____。
3.对象的抽象是_类_____。
4.类之间有两种结构关系,它们是分类关系和__组装____关系。
5.面向对象程序设计语言与其他程序设计语言的最主要差别是它具有_继承性_____。
6.动态模型描述了系统的__动态行为____。
二、选择题1.火车是一种陆上交通工具,火车和陆上交通工具之间的关系是( D)关系。
A.组装B.整体成员C.has aD.一般具体2.面向对象分析阶段建立的三个模型中,核心的模型是( C )模型。
A.功能B.动态C.对象D.分析3.对象模型的描述工具是( C)。
A.状态图B.数据流图C.对象图D.结构图4.在有多重继承的类层次结构中,它的类层次结构是(B )层次结构。
A.树型B.网状型C.环型D.星型5.描述类中对象的行为,反映了状态与事件关系的是( B )。
A.对象图B.状态图C.流程图D.结构图6.在确定属性时,所有( C)是候选的属性。
A.动词B.名词C.修饰性名词词组D.词组三、应用题1.建立窗口系统的对象模型。
问题陈述如下:窗口分为对话窗、图形窗、滚动窗三种;对话窗中有若干对话项,由唯一的项名字来确定,对话项分为按钮、选择项、正文项三种,选择项中有若干对话项入口;图形窗中有若干形状元素,形状元素分为一维形状和二维形状,一维形状又分为直线、圆弧、折线;二维形状分为圆、椭圆、矩形、多边形,其中多边形和折线由若干有序顶点组成,正文窗是滚动窗的一种,而图形滚动窗既是一种图形窗又是一种滚动窗。
2.在学校教学管理系统中,学生查询成绩就是系统中的一次交互,请用状态图来描述这种查询的交互行为。
答案:一、填空题1.对象2.属性值3.类4.组装5.继承性6.动态行为二、选择题1.D2.C3.C4.B5.B6.C三、应用题1.2.第10章自测题及参考答案作者:不详来源:2006年9月1日发表评论进入社区一、名词解释1.对象2.类3.属性4.操作5.消息6.消息传递7.方法8.关系9.关联10.一般具体关系 11.整体部分关系12.继承13.单重继承 14.多重继承15.多态性 16.角色17.受限关联 18.封装19.对象模型20.动态模型21.功能模型 22.事件23.状态24.事件追踪25.状态图26.动作27.活动28.处理29.数据流30.动作对象31.数据存储对象 32.重用性二、填空题1.对象具有封装性,实现了__数据与操作____的结合。
软件工程——10.面向对象的设计软件工程——10、面向对象的设计在软件工程领域,面向对象的设计(ObjectOriented Design,简称OOD)是一种重要的方法,它为我们构建复杂、可维护和可扩展的软件系统提供了有力的支持。
面向对象的设计核心在于将现实世界中的事物和概念抽象为对象,并通过对象之间的交互来实现系统的功能。
这一方法使得软件系统更贴近现实,更容易理解和维护。
首先,让我们来谈谈对象的概念。
在面向对象的世界里,对象是具有特定属性和行为的实体。
比如说,一辆汽车可以被视为一个对象,它具有颜色、型号、速度等属性,同时还具有启动、加速、刹车等行为。
通过将复杂的系统分解为一个个相互独立又相互协作的对象,我们能够更好地管理系统的复杂性。
类是对象的模板,它定义了对象的属性和行为。
多个具有相似特征和行为的对象可以归为一个类。
例如,所有的汽车都可以属于“汽车”这个类。
类的存在使得我们可以方便地创建和管理对象,同时也促进了代码的复用。
在面向对象的设计中,封装是一个重要的原则。
它将对象的属性和行为封装在一起,外部只能通过定义好的接口来访问对象的内部状态。
这样做不仅提高了代码的安全性,还降低了模块之间的耦合度。
比如说,我们不需要知道汽车内部发动机的具体工作原理,只需要通过踩油门和刹车踏板等操作来控制汽车的行驶。
继承是另一个关键概念。
通过继承,子类可以继承父类的属性和方法,并在此基础上进行扩展和修改。
这大大减少了代码的重复,提高了开发效率。
例如,跑车是汽车的一个子类,它继承了汽车的基本属性和行为,同时又具有自己独特的加速性能和外观特点。
多态性则使得同一个方法在不同的对象上可以有不同的实现。
这增加了代码的灵活性和可扩展性。
比如,不同类型的汽车在刹车时的具体表现可能会有所不同,但它们都实现了“刹车”这个方法。
在进行面向对象的设计时,我们需要清晰地定义对象之间的关系。
常见的关系有关联、聚合和组合。
关联表示对象之间的简单联系,比如学生和课程之间的关联。
《面向对象程序设计》第10章在线测试剩余时间:59:51答题须知:1、本卷满分20分。
2、答完题后,请一定要单击下面的“交卷”按钮交卷,否则无法记录本试卷的成绩。
3、在交卷之前,不要刷新本网页,否则你的答题结果将会被清空。
第一题、单项选择题(每题1分,5道题共5分)1、throw后面的表达式不可以是()A、常量B、变量C、对象D、数组2、关于异常的说法,正确的是()A、异常就是错误B、有了异常处理机制,出现错误也没有关系C、异常在C++中以消息的形式传递D、程序中出现的错误都可以用catch块来捕捉处理3、关于catch(。
)的说法错误的是()A、catch(。
)可以捕捉所有类型的异常B、catch(。
)必须放在所有catch块的后面C、catch(。
)可以避免出现没有被捕捉的异常D、catch(。
)不能单独使用4、C++中异常处理的默认模式是()A、终止模式B、恢复模式C、挂起模式D、暂停模式5、关于重新抛出错误的说法是()A、重新抛出是指抛出原来的异常B、用throw语句再次抛出原来的异常C、只能在catch块中抛出D、重新抛出时不能改变异常信号的值第二题、多项选择题(每题2分,5道题共10分)1、关于异常处理的说法正确的是()A、将异常的检测与处理分离B、异常就是错误C、异常由函数调用引起D、在上层调用函数中使用try检测函数调用是否引发异常2、try子句的作用是()A、代码的保护段B、如果预料某段程序代码可能发生异常,就将该段代码放在try子句之后C、try子句产生异常D、try子句中的throw表达式产生异常3、catch子句的说法正确的是()A、catch子句后的复合语句是异常处理程序B、catch子句捕获throw表达式抛出的异常C、catch子句的异常类型说明只能是类型,不能是数值D、catch子句的异常类型不能是自定义类4、异常处理的执行过程是()A、程序执行try语句块内的保护段,如果发现异常则退出B、如果在try语句内的程序段抛出异常,程序控制转入try块后的catch块C、throw抛出的异常对象如果与catch子句异常类型的值一致,则执行对应的异常处理程序D、如果没有匹配的catch子句,自动调用terminate终止程序5、关于catch(…)语句的说法正确的是()A、catch(…)语句可以捕获任何异常B、catch(…)语句可以放在catch子句的任何位置C、catch(…)语句必须放在catch子句的最后D、catch(…)语句捕获空的异常第三题、判断题(每题1分,5道题共5分)1、异常(Exception)是程序运行过程中,由于环境变化、用户操作失误以及其它方面的原因而产生的运行时不正常的情况.正确错误2、抛出异常的模块只是报告某个地方存在错误,这个报告可以帮助异常处理器解决这个错误。
第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个类。
其中,用户同客户和系统管理员类是泛化关系,可映射为两个表——客户信息表和系统管理员信息表;如果客户类和系统管理员类二者的属性基本相同,也可以映射为一个表,只需在表中添加一个新属性来区分客户和系统管理员即可。
购物车、图书、订单和发票可分别映射得到一个表。