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

下载本文档

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

文档简介

第七章面向对象方法学导论思考题软件开发中为什么要使用面向对象方法?面向对象分析方法与结构化分析方法有哪些相似之处?有何区别?面向对象方法是对过去的一个完全突破,还是“换汤不换药”?本章的内容提纲:简要介绍面向对象方法学着重讲述面向对象的基本概念介绍用面向对象方法学开发软件的过程中,建立的三种模型-对象模型、动态模型、概念模型7.1传统方法学的缺点存在的问题出现问题的原因存在的问题软件生产率低下,不能满足软件发展的需求软件可重用程度低软件仍然很难维护用户需求的不断变化导致软件很难满足用户需求出现问题的原因

1.僵化的瀑布模型瀑布模型意味着在生命周期各阶段间存在着严格的顺序性和依赖性。生命周期方法学特别强调预先定义需求的重要性。这种预先定义需求的方法也不适应用户需求的不断变化。这是因为:用户需求可能是模糊的;项目参与者之间存在通信鸿沟(领域专家不懂计算机技术,系统分析员不熟悉领域知识,他们之间很难通信,而文档只是一种静态的通信工具,不能反映动态的变化要求);用户需求是变化发展的(开发周期长,开发初期的需求在开发结束时已有很大的改变,甚至是互相矛盾);

2.结构化技术有其自身固定的缺点不稳定的:围绕实现处理功能的“过程”来构造系统用户的需求变化大部分是针对功能的用户需求的变化往往造成系统结构的较大变化难修改和扩充:清楚地定义了目标系统的边界用结构分析、设计技术开发出的系统结构依赖于对系统边界的定义很难把这样的系统扩展到新的边界

可重用性较差:不同的开发人员开发相同的系统时,可能经分解而得出不同的软件结构把数据和操作作为分离的实体用这种技术开发出的软件,其稳定性、可修改性和可重用性都比较差。7.2软件工程的新途径快速原型法面向对象的方法学快速原型法

区分两类不同的软件系统

对软件需求可以预先确定的软件系统(控制系统、操作系统等),可采用传统的生命周期方法进行开发;对系统的需求模糊或随时间变化的系统(如MIS,决策支持系统等)可采用快速原型法或面向对象的方法进行开发。

原型法的基本思想是:首先建立一个能反映用户主要需求的原型系统,让用户在计算机上试用该原型系统,通过实践了解用户的未来系统的概貌,以便用户判断系统提供的功能是否能满足用户的需求。用户通过实际试用原型系统,可以归纳出对系统的修改意见,开发人员可根据这些意见快速修改原型系统,然后用户再次试用修改后的原型系统,通过再提意见和再修改的多次循环,最终建立起符合用户需要的新系统。这是用原型法开发软件的优点之一。快速原型法思想实现原型法有两种途径:抛弃原型法建立这种原型系统的目的是评价目标系统的某个(或某些)特性,以便更准确地确定需求,或者更严格地验证设计方案。原型使用后就被抛弃掉,开发人员可根据已经确定的用户需求重新构造目标系统。这种途径本质上仍属于瀑布模型,建立原型只不过是为了确定用户需求的一个步骤。演化原型法演化原型法是高度迭代的动态方法。在每次迭代过程中,都要再次分析和确定需求,再次进行设计,再次实现系统,以及再次进行测试和评价,直到用户感到完全满意为止。。因此,早期所犯的错误其后果并不严重。此外,系统的初始版本很早就交付用户试用。面向对象方法学

面向对象方法学的出发点和基本原则是:尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。面向对象方法具有以下4个要点:要点1.认为客观世界是由各种对象组成的,任何事务都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。面向对象方法用对象分解取代了传统方法的功能分解。要点2.把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法。要点3.按照子类与父类的关系,把若干个对象类组成一个层次结构,即类等级。要点4.对象彼此之间仅能够传递消息互相联系。用下列等式识别面向对象方法:面向对象=对象(Object)十分类(Classification)十继承(inheritance)十通过消息的通信(Communicationwithmessages)可以说,采用这四个概念开发的软件系统是面向对象的。面向对象的软件过程不论采样什么方法学开发软件,都必须完成的工作:确定“做什么”、确定“怎样做”、“实现”和“完善”。7.3面向对象方法的主要优点优点1.与人类习惯的思维方法一致.结构化方法把数据和代码分离,以算法为核心。面向对象的软件技术以对象为核心,开发出的系统由对象组成。优点2.稳定性好结构化软件开发过程基于功能分析和功能分解。当需求改变时,软件的系统结构需要改变。面向对象方法基于构造问题领域的对象模型,以对象为中心构造系统。用对象模拟问题领域的实体,以对象间的联系刻画实体间的联系。需求改变时,不会引起软件结构的整体变化。优点3.可重用性好面向对象方法学中的继承机制使得子类不仅可以重用父类的数据和方法,也可以在父类代码的基础上方便的修改和扩充。优点4.较易开发大型软件产品每个对象有自己的数据、操作、功能、用途大型系统分界为一系列对象降低开发的技术难度容易管理开发工作优点5.可维护性好使得面向对象方法开发的软件的可维护性好的原因:面向对象的软件稳定性较好;面向对象的软件比较容易修改;面向对象的软件比较容易理解;易于测试和调试。两种新途径的结合

两种软件开发的途径相互促进、相互补充。面向对象方法所带来的稳定性、可重用性和可维护性等优点,对于用快速原型法成功地开发软件来说,是至关重要的。不论采用何种技术方法开发软件,都必须完成的工作要素包括:确定“做什么”,确定“怎样做”,“实现”和“完善”。7.4面向对象基本概念对象类实例消息继承多态性对象是指一组属性以及这组属性上的专用操作的封装体。在应用领域中有意义的、与所要解决的问题有关系的任何事务都可以作为对象,它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的东西。对象属性可以是一些数据,也可以是另一个对象。例如,书是一个对象,它的属性可以有书名、作者、出版社、出版年份、定价等属性,其中书名、出版年份、定价是数据,作者和出版社可以是对象,他们还可以有自己的属性每个对象都有它自己的属性值,表示该对象的状态。对象中的属性只能通过该对象所提供的操作来存取或修改。操作也称为方法或服务,它规定了对象的行为,表示对象所能提供的服务。封装是一种信息隐蔽技术,用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的。封装的目的是使对象的使用者和生产者分离,使对象的定义和实现分开。一个对象通常可由对象名、属性和操作三部分组成。classCCaculate:publicCWnd{ public: intsgn(doublex); voidfwjzl(doubleo0,doubleo1,double&dO); voidqlbjf(doubleL0,doubleao,doubleo0,doubleL1,doublea1,doubleo1,double&dN,double&dE,double&dH,double&dS,double&k,double&ka,double&ko,double&dL,double&da,double&dO,double&R,double&r); voidsjsjjs();

CSjsjjsPointListm_pointList; CSjsjjsStructure*m_pRead; CSjsjjsStructure*m_sjsjjs; doublem_SAZC;//方位角° doublem_SINC;//井斜角° doublem_SJCS;//垂深m doublem_SJJS;//井深mprotected: DECLARE_MESSAGE_MAP()public: afx_msgvoidOnDestroy();};CCaculateC1;CCaculateC2;CCaculateC3;C1.m_SAZC=90;C2.m_SAZC=18;。。。属性值操作对象属性对象的定义定义1.对象是具有相同状态的一组操作的集合。定义2.对象是对问题域中某个东西的抽象,这种抽象反映了相同保存有关这个东西的信息或与它交互的能力。对象是对属性值和操作的封装。定义3.对象::=<ID,MS,DS,MI>,其中ID是对象的名字,MS是对象中的操作集合,DS是对象的数据结构,MI是对象受理的消息名集合。对象的特点以数据为中心;对象是主动的;实现了数据封装;本质上具有数据封装性;模块独立性好。类类是一组具有相同属性和相同操作的对象的集合。一个类中的每个对象都是这个类的一个实例(instance)。voidComupteDataDlg::OnBnClickedSjsjjs(){ //TODO:Addyourcontrolnotificationhandlercodehere

CCaculatecaculate;。。。。。。。。m_Ck=atof(strCk);//atof把字符串转换成浮点数 m_cpj=atof(strcpj);

caculate.m_Ck=m_Ck;

caculate.m_cpj=m_cpj; CSjsjjsReadListIteriterRead=m_readList.begin(); if(m_readList.size()>0) {

CSjsjjsStructure*Temp=newCSjsjjsStructure(0,0,0,0,0,0,0,0,0,0,0,0,0); CSjsjjsStructure*Next;。。。。。。。。。。。。。。}}一个实例一个实例对象的一个属性当使用“对象”术语时,既可以指一个具体的对象,也可以泛指一般的对象。当使用“实例”术语时,必然是指一个具体的对象。消息

消息传递是对象间通信的手段,一个对象通过向另一对象发送消息来请求其服务。一个消息通常包括接收对象名、调用的操作名和适当的参数(如有必要)。消息只告诉接收对象需要完成什么操作,但并不指示接收者怎样完成操作。消息完全由接收者解释,接收者独立决定采用什么方法来完成所需的操作。例如:MyCirle.Show(GREEN);接收消息的对象消息名参数方法是对象所能够执行的操作,也就是类中定义的服务。#include"Caculate.h“。。。。。。。。。intCCaculate::sgn(doublex){if(x>0)return(1);//返回出口1:如果键盘输入正数,则返回1if(x<0)return(-1);//返回出口2:如果键盘输入负数,则返回-1return(0);//返回出口3:如果键盘输入0,则返回0}。。。。。。。。。。。。。。。。在类中给出成员函数的定义。属性是类中定义的数据。类的每个实例都有自己特有的属性值。封装对象具有封装性的条件:有一个清晰的边界。所有私有数据和实现操作的代码都被封装在边界内,从外面不能直接访问。有确定的接口。这些接口就是对象可以接受的消息,只能通过向对象发送消息来使用它。受保护的内部实现。私有的数据和代码不能够在定义该对象的类之外进行访问。//图层管理器 classCJwtLayerManager {

public: CJwtLayerManager(CView*pView=NULL); ~CJwtLayerManager(); voidAddObject(CJwtObject*pJwtObject);//添加对象 voidAddLayer(CJwtLayer*pLayer);//添加图层 voidDeleteLayer(CStringlayerName);//删除图层 voidMoveLayerToFront(CJwtLayer*pLayer); //移到最前 voidMoveLayerToBack(CJwtLayer*pLayer); //移到最后 voidMoveLayerForward(CStringname); //前移 voidMoveLayerBackward(CStringname); //后移 voidSwitchLayers(CJwtLayer*pLayerA,CJwtLayer*pLayerB);//交换图层 CJwtLayer*GetLayer(CStringname);//获得给定名称的图层 intGetLayersCount(); //获得层的数量 CJwtLayerListm_jwtLayerList;//图层列表 intm_LayerOrder;//图层顺序

private: CJwtLayer*m_pCurLayer;//当前图层 CView*m_pView;//视图指针

public: voidClear(void);//清理内存 };继承

继承是类间的一种基本关系,是在某个类的层次关联中不同的类共享属性和操作的一种机制。图1给出了一个类、对象、继承的例子。图1类、对象、继承classCDrawBasic:publicCObject { DECLARE_SERIAL(CDrawBasic) public: CDrawBasic(void); ~CDrawBasic(void); CDrawBasic(CPointpoint); virtualvoidSerialize(CArchive&ar);//序列化 virtualvoidDraw(CDC*pDC,floatm_fDrawScale,CView*pView=NULL);//进行自身绘制 virtualvoidDrawTracker(CDC*pDC,floatm_fDrawScale);//进行角点绘制 virtualBOOLHitTest(CPoint&point);//判断给定点是否在内部 voidMoveTo(CRectrect);//移动 public: CRectm_Pos;//所在位置 BOOLm_bSelected;//是否选中 BOOLm_bConnected;//是否连井 BOOLm_bProjectionConnected;//是否投影连井 CPointpoint;//图形中心点 intnIndex;//序号 CStringm_WellID;//井号 doublem_verDepth;//垂深 floatwell_purpose_size;//目的层尺寸 UINTm_nLineWidth;//画笔宽度 COLORREFm_cPenColor;//画笔颜色 intm_nPenStyle;//画笔的类型 };函数重载classCDrawCircle:publicCDrawBasic//目的层 { public: CDrawCircle(); CDrawCircle(CPointpoint); ~CDrawCircle(); voidDraw(CDC*pDC,floatm_fDrawScale,CView*pView=NULL); voidDrawTracker(CDC*pDC,floatm_fDrawScale);//进行角点绘制 BOOLHitTest(CPoint&point);//判断给定点是否在内部 CStringa; voidDrawJingBie(CDC*pDC,intn,CPointpoint_jingbie); };

classCDrawRect:publicCDrawBasic//井口 { public: CDrawRect(); CDrawRect(CPointpoint); ~CDrawRect(); voidDraw(CDC*pDC,floatm_fDrawScale,CView*pView=NULL);

};

classCDrawTriangle:publicCDrawBasic//井底 { public: CDrawTriangle(); CDrawTriangle(CPointpoint); ~CDrawTriangle(); voidDraw(CDC*pDC,floatm_fDrawScale,CView*pView=NULL); };多态性

多态性是指同一个操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。相同操作的消息发送给不同的对象时,每个对象将根据自己所属类中定义的这个操作去执行,从而产生不同的结果。类等级的不同层次中可以共享一个相同的名字,然而不同层次中的每个类却各自按自己的需要来实现这个行为。在C++中,多态性通过虚函数来实现的。#include<iostream.h>classPoint{public:Point(doublei,doublej){x=i;y=j;}virtualdoubleArea()const{return0.0;}private:doublex,y;};classRectangle:publicPoint{public:Rectangle(doublei,doublej,doublek,doublel);virtualdoubleArea()const{returnw*h;}private:doublew,h;};Rectangle::Rectangle(doublei,doublej,doublek,doublel):Point(i,j){w=k;h=l;}voidfun(Point&s) {cout<<s.Area

()<<endl;}voidmain(){Rectanglerec(3.0,5.2,15.0,25.0);fun(rec);}Fun()函数的引用对象参数s被动态联编。调用时实参是Rectangle类的对象rec,所以被束定到Rectangle类的Area()重载函数重载:指在同一作用域的若干个参数特征不同的函数可以使用相同的函数名字。运算符重载:指同一个运算符可以施加于不同类型的操作数上面。#include<iostream.h>classcomplex{public:complex(){real=imag=0;}complex(doubler){real=0;imag=r;}complex(doubler,doublei){real=r;imag=i; }complexoperator+(constcomplex&c);complexoperator-(constcomplex&c);complexoperator*(constcomplex&c);complexoperator/(constcomplex&c);friendvoidprint(constcomplex&c);private:doublereal,imag;};inlinecomplexcomplex::operator+(constcomplex&c){returncomplex(real+c.real,imag+c.imag);}。。。。。。voidmain(){complexc1(2.0,3.0),c2(4.0,-2.0),c3;c3=c1+c2;cout<<"\nc1+c2=";print(c3);……c3=c1/c2;cout<<"\nc1/c2=";print(c3);……}7.5面向对象建模对象建模技术(objectmodelingtechnique,OMT)是由J.Rumbaugh等人提出的。OMT定义了三种模型,它们是对象模型、动态模型和功能模型,OMT用这三种模型来描述系统。OMT方法有四个步骤:分析、系统设计、对象设计和实现。OMT方法的每一步都使用这三种模型,通过每一步对三种模型不断地精化和扩充。对象模型动态模型功能模型基本模型:三个模型分别从不同角度分析系统分析模型对象模型:描述静态结构,定义做事情的实体功能模型:描述处理(数据变换),指明系统应“做什么”动态模型:描述交互过程,规定什么时候做

7.6对象模型

对象模型描述系统中对象的静态结构、对象之间的关系、对象的属性、对象的操作。对象模型表示静态的、结构上的、系统的“数据”特征。对象模型为动态模型和功能模型提供了基本的框架。对象模型用包含对象和类的对象图来表示。用UML中的类图来建立对象模型。图7.1对象的符号表示图7.2类的符号表示(类名)属性值类名可见性属性名:类型=缺省值可见性操作名(参数:类型,…):结果类型表示类的符号类是具有相同属性、操作、关系的对象集合的总称。通常在UML中类被画成矩形。表示关系的符号类-&-对象间的关系可以概括为归纳、组合、关联关系归纳(泛化)关系泛化是一个类与它的一个或多个细化种类之间的关系,即一般与特殊的关系。被细化的称为父类,每个细化的种类称为子类,子类可以继承父类的性质。组合(聚合)关系聚合是一种整体与部分的关系,在这种关系中表示整体的对象与表示部分的对象关联。有聚合关系的关联指出,某个类是另外某个类的一部分。组合关系是聚合关系的另一种形式,但是子类实例的生命周期依赖于父类实例的生命周期。关联链表示实例对象间的物理或概念上的连接。例如,JoeDoe为SimPlex公司工作,工资2000元。关联描述具有公共结构和公共语义的一组链,例如,关联works-for描述了一组某人为某公司工作的链。实际上链是关联的一个实例。链可以有属性,称为链属性,链属性表示关联中链的性质。有一些修饰可以应用于关联。1.

名字:可以给关系取名字

2.

角色:关系的两端代表不同的两种角色

3.

重数:表示有多少对象通过一个关系的实例相连

关联类

在关联建模中,存在一些情况下,你需要包括其它类,因为它包含了关于关联的有价值的信息。对于这种情况,你会使用关联类来绑定你的基本关联。关联类和一般类一样表示。不同的是,主类和关联类之间用一条相交的点线连接。类也可以使用反射关联与它本身相关联。教师指导论文0..m1学生教师为学生指导论文:教师教学0..m0..n学生教师为学生授课:题目答辩时间成绩教师学生指导论文0..m1SalesLineItemquantitySaledatetimePaymentamoutItemquantityStoreAddressnamePOSRecords-sale-of0..111..*1111..*11*1Captured-on1Paid-byContainedStocked-inHouses属性关联概念(类)7.7动态模型

动态模型描述与时间和操作顺序有关的系统特征——激发事件、事件序列、确定事件先后关系的状态以及事件和状态的组织。动态模型表示瞬时的、行为上的、系统的“控制”特征。它关心的是系统的控制,操作的执行顺序;它从对象的事件和状态的角度出发,表现

温馨提示

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

评论

0/150

提交评论