第9章 面向对象方法学引论_第1页
第9章 面向对象方法学引论_第2页
第9章 面向对象方法学引论_第3页
第9章 面向对象方法学引论_第4页
第9章 面向对象方法学引论_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章面向对象方法学引论回顾结构化开发方法SA客观世界SDSP计算机世界数据字典数据流图E-R图状态变迁图加工规约控制规约数据对描述象数据设计体系结构设计接口设计过程设计本章目标?掌握面向对象的基本概念?了解面向对象的建模技术主要内容面向对象方法学概述面向对象的概念面向对象建模内容线索面向对象方法学概述面向对象方法学产生的背景面向对象方法学的要点面向对象方法学的优点面向对象的软件过程模型面向对象的概念面向对象建模传统的软件工程方法学传统方法部分地缓解了软件危机传统程序设计方法存在的问题生产率提高的幅度远不能满足需要软件重用程度很低软件维护困难软件不能真正满足用户的需要面向对象方法学发展雏形阶段(60’后期):OO语言Simula-67出现(类,对象)完善阶段(80’s):面向对象分析和设计,SmallTalk繁荣阶段(90’s):面向对象方法学普遍应用,C++、Java问题为什么面向对象软件工程方法优于传统软件工程方法呢?两个概念问题空间(问题域)实体及实体间相互间的关系实体具有静态的属性和动态的行为解空间(求解域)计算机中的实体称为解空间的对象解空间的对象取决于所用的程序设计语言面向对象方法学面向对象软件开发方法OMT(ObjectModelingTechnique)包括OOA客观世界OODOOP计算机世界面向对象问题求解过程对象对象客观世界对象运行时程序类程序实现抽象数据类型概念世界抽象模拟实现实例化面向对象方法学的要点OOobjectsclass++++communicationwithmessagesinheritance

⑴Initializesystem;⑵Createanddrawinterface;(3)whileQUITnotselecteddo caseMouseevent: createshapestructure;readmousemovementsfordata;

storenewlycreatedshapeonlistofshaperecords;KeyPressevent:ifkey='q'thenexitloop;elseignore;Exposeevent:

refreshdisplaybydrawingeachshapestructure;⑷Shutdownsystem;喷泉模型阶段内的迭代(或求精)面向对象方法学的优点总存在用错误的数据调用正确的模块,或用正确的数据调用错误的模块的危险。与人类习惯的思维方法一致,解空间与问题空间一致以对象为核心,数据以及数据上的操作封装为一个统一体--对象软件系统由对象组成,以对象间的消息模拟实体间的联系抽象思维,归纳思维,演绎思维开发围绕建立问题领域的对象模型,是一个逐步深化的渐进过程解空间与问题空间不一致以算法为核心,数据和过程分离软件系统由模块组成,模块间通过调用来集成系统自顶向下按部就班较差基于功能分解,需求变化大多针对功能功能变化引起软件结构的整体修改较好功能需求变化仅需要作一些局部性的修改可派生子类以实现功能扩充或修改较差标准函数库不是自含的和独立的模块重用,则相应的数据也必须重用较好通过对象实例或派生类方便修改和扩充,且不影响原有类的使用较易可分解成相互独立的小产品较难分而不解较好稳定性好,易修改,易理解较差稳定性较差,较难修改,较难理解思维方法特性面向对象方法传统方法稳定性开发大型软件可维护性可重用性课外阅读:后面向对象时代面向方面程序设计(Aspect-Orientedprogramming,AOP)方法面向Agent的程序设计(Agent-Orientedprogramming)方法其它后面向对象程序设计泛型程序设计(genericProgramming,GP)面向构件程序设计敏捷方法(AgileMethodologies)内容线索面向对象方法学概述面向对象的概念抽象封装继承多态面向对象建模面向对象的概念对象(Object)类(Class)封装(Encapsulation)继承(Inheritance)多态性(Polymorphism)抽象(Abstraction)1、对象…对象是在系统执行过程中根据需要而动态产生的对象是类的一个实例化对象:是变量和相关方法的软件组合…对象对象是封装了数据结构及可以施加在这些数据结构上的操作(服务或方法)的封装体对象∷=〈ID,MS,DS,MI〉ID:对象标识或名字MS:操作集合DS:对象的数据结构MI:对象受理的消息名集合(即对外接口)对象例子:雇员具有成员变量:姓名、雇佣日期、薪金、部门某些成员变量值是固定的numberOfCompanyHolidays(公司员工节假日固定为9天)某些成员变量对于不同的对象值不同Name,ID,hireDate(雇员姓名可以是张三也可以是李四)具有方法:计算休假时间(calculateAccruedVacationTime)和提交周工作报告(submitWeeklyReport)某些方法对于所有对象来说都是相同的submitWeeklyReport某些方法对于不同对象来说是不同的calculateAccruedVacationTime不同级别的雇员计算休假时间的方法是不同的2、类-Class类的属性通过成员变量来表示。如:每个雇员的属性有姓名(可能是张三)、职工号(20030001)等类的行为通过方法来表示,如雇员什么时候可以享受休假,就要通过计算休假时间这个方法来获得类:一组具有相同数据结构和相同操作的对象的集合区别类和对象在软件中类和对象有时是难以区分的软件对象只是显示对象或抽象概念的电子化模型它们不象现实对象那样触手可及,而比较接近蓝图那样的思想产品有时“对象”这个术语用于指类和实例两者对象和实例实例是某个具体类所描述的一个具体对象。例如:“张三”、“李四”是类“雇员”的实例对象既可以是一个具体的对象,也可以泛指一般的对象;而实例只能是一个具体的对象消息(Message)要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明对象通过相互发送消息(messages)进行相互交互和通信消息通过方法调用来实现通常一个消息由三部分组成接收消息的对象要执行的方法的名称(即消息名)需要由此方法来传递的任何参数(零个或多个变元)方法(Method)对象所能执行的操作,也就是类中所定义的服务例如C++的成员函数Java的方法属性(Attribute)

类中所定义的数据例如C++的数据成员Java的成员变量属性:鳕鱼肝油树皮儿童用药行为:退烧止咳\喷嚏3、封装(encapsulation)…封装的目的是打包-Bundling封装:将对象的变量置于它的方法的保护之下…封装隐藏-Hiding儿童用药泡泡糖很可口信息隐藏-InformationHiding信息隐藏的优点将界面和实现细节分离开来程序员不能访问被隐藏的信息直接的访问会产生意想不到的行为和不希望的代码依赖性因此,封装可以减少程序错误对象可以维护私有的信息和方法,而不依赖于其他对象信息隐藏的例子雇员的薪金是隐藏的其它雇员类不能直接访问和修改薪金但是可以编写方法accessor和mutator来读写薪金对象与类对象是类的实例化实例化一个Date对象my_DateDatemyDate;myDateMemoryStackHeapmyDate=newDate();Java中的信息隐藏Specifierclasssubclasspackageworldprivateprotected*publicpackage同步练习packagepackageA;//Case1publicclassReachMe{

publicstaticintmyStaticInt=5;publicintmyInstanceInt=10;}importpackageA.ReachMe;//Case1classTryAccess{TryAccess(){//constructor

intanInt=ReachMe.myStaticInt;}}IsmyStaticIntvisible?packagepackageA;//Case2/*package*/classReachMe{

publicstaticintmyStaticInt=5;publicintmyInstanceInt=10;}importpackageA.ReachMe;//Case2classTryAccess{TryAccess(){

intanInt=ReachMe.myStaticInt;}}IsmyStaticIntvisible?packagepackageA;//Case3publicclassReachMe{publicstaticintmyStaticInt=5;//protectedconstructor

protectedReachMe(){}}importpackageA.ReachMe;//Case3classTryAccess{TryAccess(){ReachMerm=newReachMe();}}CanIinstantiate?封装的优点模块化一个对象的源代码可以独立于其他对象的源代码进行编写和维护隐藏信息对象有一个公共的接口,其他对象可以使用这个接口与它通信对象可以维护私有的信息和方法,可以在任何时候改变信息和方法,而不影响依赖于它的其它对象回顾OOobjectsclass++++communicationwithmessagesinheritanceAbstractEncapsulationPolymorphismInheritance内容线索面向对象方法学概述面向对象的概念抽象封装继承多态面向对象建模4、继承-Inheritance面向对象程序设计允许类获得另一个类的属性和行为继承将类组成一个层次结构的系统(类等级)

继承:广义地说,继承指能够直接获得已有的性质和特征而不必重复定义它们。在面向对象中,继承是子类自动地共享父类中定义的变量和方法的机制。

雇员Employee

经理工程师ManagerEngineer单继承-SingleInheritance一个类只允许有一个父类

Employee

|

ManagerEngineer |

Director多继承-MultipleInheritance多继承:一个类允许有多个父类子类具有所有父类的属性继承的优点提高软件的可重用性便于软件维护“站在巨人的肩膀上”开发新系统继承实例…classBird{

public:

virtualvoidfly();

//鸟会飞

...

};

classPenguin:publicBird{

//企鹅是鸟

...

};

鸟会飞,企鹅是鸟,所以企鹅会飞。…继承实例…classBird{...

//没有声明fly函数};classFlyingBird:publicBird{public:virtualvoidfly();...};鸟会飞,并不是说所有的鸟会飞,通常,只有那些有飞行能力的鸟才会飞,实际上有很多种不会飞的鸟。企鹅是没有飞行能力的鸟,所以企鹅不会飞。classNonFlyingBird:publicBird{

...

//

没有声明fly函数};classPenguin:publicNonFlyingBird{

...

//

没有声明fly函数};…继承实例

classBird{

public:

virtualvoidfly();

//鸟会飞

...

};

voiderror(conststring&msg);

//在别处定义

classPenguin:publicBird{

public:

virtualvoidfly(){error("Penguinscan'tfly!");}

...

};

所有鸟都会飞,企鹅是鸟,企鹅不会飞,让企鹅飞是错误的。继承不是copy&paste内容线索面向对象方法学概述面向对象的概念抽象封装继承多态面向对象建模5、多态性(Polymorphism)

“工作!” 对象根据所接受的消息而做出动作,同样的消息被不同的对象接受时可导致完全不同的行动,该现象称为多态性。Java中的方法覆盖——例一abstractclassHuman{publicabstractStringgreet();}classAmericanextendsHuman{publicStringgreet(){return"Hello";}}classSpaniardextendsHuman{publicStringgreet(){return"BuenosDias";}}classConverse{publicstaticvoidmain(String[]args){Humanh=newAmerican();System.out.println("Americangreeting:"+h.greet());h=newSpaniard();System.out.println("Spanishgreeting:"+h.greet());}}Java中的方法覆盖——例二classEmployee{privateintvacationDays=10;

protectedintgetVacation(){returnvacationDays;}}classManagerextendsEmployee{publicintgetVacation(){returnsuper.getVacation()+5;}}Java中的方法重载一个类中不同的方法具有不同的方法签名(signature)方法签名包括:方法名和参数列表classStaticTest{publicstaticintaMethod(intx,inty){returnx/y;}publicstaticintaMethod(intx,inty,intz){returnx/z;}}classStaticTestDescendantextendsStaticTest{publicstaticintaMethod(intx){returnx*2;}}子类又实现了另一个版本的aMethod()方法父类定义了两个不同的aMethod()方法课外阅读:C++中方法覆盖同一方法,不同的子类有不同的实现ShapefillpatDrawCircleradiusDrawRectangleLength,widthDraw//ShapevirtualvoidDraw(void){setfillstyle(fillpat);}//CirclevirtualvoidDraw(void){Shape:Draw();DrawCircle(x,y,radius);}//RectanglevirtualvoidDraw(void){Shape:Draw();DrawRectangle(x,y,length,width);}voidmain(void){Shape*one,*two;one=newCircle(1,1,0.5,4);two=newRectangle(2,2,0.5,0.5,6);one->Draw();two->Draw();}动态联编(绑定)VB示例课外阅读:C++中的重载…函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字classStudent{booleanprint();voidprint(StringfileName);voidprint(intdetailLevel);voidprint(intdetailLevel,StringfileName);intprint(StringreportTitle,intmaxPages);}课外阅读:…C++中的重载classCPoint{intx,y;public:CPointoperator+(CPointp1);};CPointCPoint::operator

+(CPointp1){CPointp;p.x=x+p1.x;p.y=y+p1.y;

returnp;}运算符重载:是指同一个运算符可以施加于不同类型的操作数上面多态的优点利用多态性,用户能够发送一般形式的消息,而将所有的实现细节都留给接受消息的对象优点多态性机制增加了面向对象软件系统的灵活性,进一步减少了信息冗余显著提高软件的可重用性和可扩展性内容小结面向对象编程概念主要包括1)抽象(Abstraction)2)封装(Encapsulation)3)继承(Inheritance)4)多态(Polymorphism)内容线索面向对象方法学概述面向对象的概念面向对象建模功能模型对象模型动态模型3种模型之间的关系面向对象建模三种模型功能模型:描述系统的功能做什么对象模型:描述系统的数据结构对谁做动态模型:描述系统的控制结构何时做对象模型始终都是最重要、最基本、最核心的内容线索面向对象方法学概述面向对象的概念面向对象建模对象模型动态模型功能模型3种模型之间的关系对象模型对象模型表示静态的、结构化的系统的数据性质它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构通常使用类图表示对象模型类图描述类及类与类之间的静态关系动态模型回顾:系统状态图通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为类的状态图通过描绘对象的状态及引起对象状态转换的事件,来表示对象的行为AbstractEncapsulationPolymorphismInheritance回顾面向对象建模对象建模:描述系统的数据结构,“对谁做”动态建模:描述系统的控制结构,“何时做”功能建模:描述系统的功能,“做什么”内容线索面向对象方法学概述面向对象的概念面向对象建模对象模型动态模型功能模型3种模型之间的关系功能模型功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么数据流图用例图(UseCaseDiagram)用例模型描述的是外部行为者(actor)所理解的系统功能一幅用例图包含的模型元素有系统行为者用例:脚本用例之间的关系售货供货顾客供货人收银员取货款自动售货机系统自动售货机系统用例图1、?2、?3、?4、?系统用例(UseCase)行为者(Actor)通信联系用例建模用例模型由若干用例图组成创建用例模型的工作1、定义系统2、寻找行为者和用例3、描述用例4、定义用例之间的关系5、确认模型示例:订单处理系统问题陈述公司从各种供应商购买产品,然后再推销每季度向客户发布一次产品目录客户以提交商品列表并向公司付费的方式购买商品,公司填写订单并把商品送到客户所在的地址订单处理软件记录从收到订单直到商品被运送到客户的整个过程运输公司提供快捷服务,以最快、最有效的方法来运送客户订购的商品客户可能退货,要求重新订货,但有时要付费示例:订单处理系统假设一种电子接口,如Web可能对某些客户更合适希望使用多家运输公司和多种保险方法1.确定系统边界系统中有什么?

必须创建它们系统外有什么?

不需要创建,但必须考虑与它们的接口确定行为者(Actor):角色/参与者确定用例(Use-case)简述行为者和用例确定行为者…行为者总在系统外,不是系统的一部分可能的行为者谁使用系统谁维护系统谁启动或关闭系统谁从系统获取信息谁为系统提供信息是否有事情自动在预计时间发生…确定行为者客户客户代表(公司)运输公司供应商客户客户代表订单处理执行者供应商运输公司确定用例…可能的用例行为者希望系统提供什么功能行为者要创建、读取、更新或删除(CRUD)什么信息系统给行为者通知什么信息系统需要从行为者那得到什么信息所有的用例描述从行为者看到的系统全部功能…确定用例…行为者想要系统提供的功能客户客户代表运输公司供应商订购货物检查订单状态获取产品目录取消订单退货记录投诉运送货物发送货物同客户…确定用例…订单处理用例图客户代表订购货物获取订单状态获取目录取消订单退货运送货物发送货物订单处理客户运输公司供应商记录投诉…确定用例…是否需要直接与供应商接口库存系统获取产品信息更新商品数量接受退订项记账系统更新帐目职员计算邮费打印信件标签…确定用例…订购货物获取订单状态获取目录取消订单退货运送货物更新商品数量订单处理客户运输公司客户代表库存系统记账系统职员获取产品信息接受退订货更新帐目计算邮费打印信件标签记录投诉…确定用例处理时间每季度向客户发布一次产品目录是否有事情自动在预计时间发生季度末发送目录客户发送目录季度末发送目录客户简述行为者行为者描述客户:从公司订购商品的人客户代表:公司处理客户请求的雇员职员:公司负责包装订货的雇员运输公司:联邦快递等库存系统:管理公司库存的软件记账系统:记录公司帐目的软件简述用例订单处理用例描述订购货物:客户建立一个商品订单,并为那些商品付费运送包裹:运输公司将商品运送到客户手中……2.用例描述事件流事件流是UseCase完成需求的行为的事件的描述事件流是指示系统要完成什么,而不是如何完成事件流的表示用文档表示,也可以作为附加文档添加在Rose中事件流包括基本路径可选路径描述完成用例功能需要的步骤基本路径基本路径:当一切运转正常时,使用用例的步骤(快乐场景)订购货物基本路径1,当客户选择订购货物时用例开始2,客户输入自己的姓名和地址3,客户输入产品代码a)系统显示产品描述和价格b)系统在客户订单中添加该产品的价格循环结束4,客户输入信用卡支付信息5,客户选择提交6,系统检验输入的信息,把该订单作为未完成的订单保存,同时向记账系统提供支付信息7,支付确认后,订单也被标记为已确认,返回客户一个订单ID,用例结束可选路径可选路径:不同于基本路径而允许不同的事件序列的路径。客户可以从用例的若干事情中挑选一件来做。订购货物可选路径寻找可选路径该点上是否有别的活动?该点上有无可能出错?有无随时可能发生的行为?在选择提交(第5步)前的任何时候,客户可选择“取消”。这次订购没被保存,用例结束。在第6步,如果有任何不正确的信息,系统提示客户修改这些信息。在第7步,如果支付没被确认,系统将提示客户去修正支付信息或取消。如果客户选择修正信息,就回到基本路径的第4步,否则用例结束。事件流联合方法方法1直接将可选路径插入到基本路径,并重新编号方法2在基本路径段落中添加可选项方法3单独使用可选路径部分联合基本路径和可选路径采用的是第几种联合方法?用例描述模板前置条件:一个合法的客户已登录到系统事件流:基本路径1,当客户选择订购货物时,用例开始2,客户输入自己的姓名和地址……可选路径在选择提交(第5步)前的任何时候,客户可选择“取消”。这次订购没被保存,用例结束。在第6步,如果有任何不正确的信息,系统提示客户修改这些信息……后置条件:如果订单没有被取消,它将被保存在系统里,并做上标记订购货物用例描述如果采用其他两种方法如何描述?通信关联谁开始用例—行为者、系统或两者都有客户订购货物客户记录投诉客户支持经理更新帐目记账系统3.细节层次…应考虑的问题谁需要阅读和审批该文档?谁使用该文档?我们需要这个文档做什么?用例细化到何种程度恰当?…细节层次…1,当客户选择订购货物时用例开始2,客户输入自己的姓名和地址3,如果客户键入邮编,系统提供城市和区4,客户键入想要订购的产品代码5,对每一个键入的产品代码a)系统显示产品描述和价格b)系统把产品价格加入总价中循环结束6,客户输入信用卡支付信息7,客户选择提交8,系统检验信息,把该订单作为未完成的订单保存,同时向记账系统提供支付信息9,支付确认后,订单也被标记为已确认,返回客户一个订单ID,用例结束订购货物用例行为者角度…细节层次订购货物用例开发者角度……3,如果客户键入邮编,系统使用“邮编在线”从邮局得到城市名和区名,系统把城市名和区名加到订单中4,客户键入想要订购的产品代码5,对每一个键入的产品代码a)系统使用产品代码查询库存系统,得到产品描述和价格。系统显示描述和价格,并把描述和价格加入订单b)系统把产品价格加入总价中……8,系统确信所有需要的信息都已输入,它必须包括一个完整的发货地址、信用卡信息和至少一种产品,把该订单作为未完成的订单保存,同时向记账系统提供支付信息9,记账系统计算税和送货数量,并返回成功接受支付的信息及订单总量。订单也被标记为已确认,返回客户一个订单ID,用例结束如果客户键入邮编,系统提供城市和区系统显示产品描述和价格系统检验信息,把该订单作为未完成的订单保存,同时向记账系统提供支付信息支付确认后,订单也被标记为已确认,返回客户一个订单ID,用例结束RationalRose中用例描述4.确定用例之间的关系包含(Include)扩展(Extend)继承(Inheritance)包含…多个用例可以重用的行为段。包含关系是无条件的:如果用例实例到达基本用例中定义了包含关系的位置,就总会执行包含。搜索订单用例1,当客户键入订单ID\客户ID或客户姓名时用例开始2,客户点击Find3,如果客户键入订单IDa)系统显示订单,用例结束4,如果客户键入客户名或客户IDa)系统返回当前客户的所有订单表b)客户在这个列表中选择一个订单c)系统显示这个订单,用例结束…包含1,当客户键入取消一个订单,用例开始2,包含搜索订单3,如果这个订单状态被确认......取消订单用例客户取消订单搜索订单《包含》用于有条件地扩展已有用例的行为,这是一种在不改变原始用例的情况下增加用例行为的方法。扩展…1,系统得到产品的销售折扣信息时,用例开始2,系统在订单上显示折扣3,系统计算折扣数4,系统从订购总价格中减去折扣,用例结束每季度销售价格老顾客打折1,系统得到顾客折扣信息时,用例开始2,系统在订单上显示折扣3,系统计算折扣数4,系统从订购总价格中减去折扣,用例结束…扩展订购货物扩展点销售项:第5步前特殊顾客:所有产品输入后每季度销售价格老顾客打折《扩展》(特殊顾客)[在特殊顾客列表中的顾客]《扩展》(销售项)[每季度销售列表中的产品]继承继承可以用于行为者和用例。继承是一种“种属”关系,其中一个元素是另一个的一种。订购货物获取订单状态获取目录客户客户代表销售报表电话订购货物网上订购货物5.确认订单处理用例模型订购货物获取订单状态获取目录取消订单退货更新商品数量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论