您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 设计及方案 > 第七章面向对象分析设计基础--软件工程
武当山旅游门户网站(fenlei.wdsxx.com)分类信息第7章面向对象基础7.1从一个例子看结构化方法的问题7.2面向对象概念7.3面向对象开发方法介绍7.4UML语言7.5用例图7.6活动图7.7状态图7.8交互图7.9类图7.10配置图7.11组件图武当山旅游门户网站(fenlei.wdsxx.com)分类信息7.1从一个例子看结构化方法的问题例子:设计并实现一个四则运算软件,输入两个数和运算符号,输出运算结果。用结构化设计:这个例子很简单没有必要画数据流程图,如果一定要画的话,只有三个处理“数据录入”,“计算”,“结果输出”,转换成设计模块也只有“主模块”“数据录入”“计算”“结果输出”4个简单的模块。注:主模块太简单我们省略了。模块名称:input功能:输入运算数和运算符输入模块主要代码输出/返回无提示输入信息:请输入数字A、B和运算符:读入NumberA、NumberB和OperateNumberA,NumberB,Operate输入模块主要代码输出/返回NumberANumberBOperateStringResult=;Switch(Operate){case+:Result=string(NumberA+NumberB);break;case−:Result=string(NumberA−NumberB);break;case*:Result=string(NumberA×NumberB);break;case/:if(NumberB!=0)Result=string(NumberA÷NumberB);elseResult=除数不能为0break;}Result输入模块主要代码输出/返回ResultConsole.WriteLine(运算结果:+Result);无模块名称:comput功能:计算模块名称:output功能:输出结果武当山旅游门户网站(fenlei.wdsxx.com)分类信息结构化方法是将需求分解为一个个简单的功能,简单的功能直接影射为模块,复杂的功能可以设计多个模块。当需求发生变化,例如,增加一个平方运算或开根运算时,需要修改计算模块,这就要求程序员对计算模块的代码非常了解。这对于功能简单的软件比较容易实现,当软件规模比较大,功能复杂时,非常容易出错,并且软件的维护量很大。武当山旅游门户网站(fenlei.wdsxx.com)分类信息面向对象方法:首先设计一个计算类operation,有两个私有的操作数numberA和numberB、五个方法:setNumberA(),setNumberB(),getNumberA(),getNumberB()和GetResult()在设计时考虑到软件的可扩充性,把计算类设计为基类,四则运算分别继承基类。为了增加软件的灵活性,设计一个实例化工厂类,专门生成运算类的实例化对象。类图如下:武当山旅游门户网站(fenlei.wdsxx.com)分类信息在客户端主程序直接调用实例化工厂类创建相应的运算类对象,工厂返回相应的运算类对象指针。例如,下面的代码oper指向OperationAdd类,接着进行属性赋值,最后调用该类的GetResult方法计算结果。输入和输出的处理代码与结构化方法相同,故省略。Operationoper;oper=OperationFactory.createOperate(+);oper.setNumberA(1);oper.setNumberB(2);double.result=oper.GetResult();面向对象方法比结构化方法设计的软件结构要复杂一些。在本例中,每个计算分别设计为一个子类,如果要增加新的运算,只需添加子类,同时在实例化工厂类中添加相应的switch分支,其他的处理不受影响。也就是说,程序员不必了解其他运算的处理代码,程序的整体结构没有变化。武当山旅游门户网站(fenlei.wdsxx.com)分类信息结构化方法的问题:结构化方法分析和设计阶段所应用的模型之间存在鸿沟。分析阶段的主要模型是数据流程图,设计阶段的主要模型是软件模块结构图,数据流程图和软件模块结构图之间需要进行转换。不同的人转换出的模块图可能不同,有很大的随意性,这是做工程非常忌讳的,质量很难评价。在分析阶段用数据流程图将用户需求和软件的功能需求统一起来。系统分析人员从整体至局部不断地理解用户需求,并且自顶向下逐步细化数据流程图。这里存在着两个问题:细化程度没有标准,只能凭借分析人员的经验自己把握;过程:分析用户需求确定软件功能分解复杂的功能为多个简单的功能。当需求变更时,功能分解就要重新进行,功能变化就会导致软件模块结构发生变化,造成了软件结构不稳定。武当山旅游门户网站(fenlei.wdsxx.com)分类信息结构化方法的问题(续):结构化程序设计将数据定义与处理数据的过程相分离,不利于软件复用。例如,在图书馆信息管理系统中,对图书基本信息进行处理的典型方法是:在数据说明中定义图书基本信息的结构,设计图书信息添加模块、修改模块、删除模块等等功能模块,实现对图书信息的处理。当新的系统要复用图书处理功能时,要分别复制数据说明定义和各个功能处理模块。结构化方法设计的软件结构不稳定,缺乏灵活性,可维护性差。从上面的例子看出,结构化方法一旦需求变更,软件的结构变化比较大,扩充功能往往意味着修改原来的结构。当软件工程的规模比较大,用户需求经常变更的情况下,不宜使用结构化方法。武当山旅游门户网站(fenlei.wdsxx.com)分类信息7.2面向对象的概念什么是对象?在现实世界中的任何有属性的单个实体或概念,都可看做对象。学生张三是一个对象,具有姓名、学号、班级等属性;一个银行账户是一个对象,具有用户名、余额等属性;一份订单也是一个对象,具有货品名、单价、数量等属性。除了描述对象的属性之外,还可以说明对象所拥有的操作。例如,打印学生的姓名、学号和班级;查询一个顾客的账户余额;打印订单的价格等等。对象的操作是对象的动态特征。软件中的对象封装了一组属性和对属性进行的操作,是对现实世界中的对象实体的抽象。武当山旅游门户网站(fenlei.wdsxx.com)分类信息什么是类?类是具有相同属性和相同行为的对象集合。学生是一个类,其中的一名学生张三是学生类的一个实例,其属性有:姓名=张三,学号=J20080101,班级=计算机08-1:具有的操作可以是获得或设置属性值,或与其他对象用消息通信。例如,获得学生的姓名、修改班级号,向其他对象发送消息。实际上,类就是一个创建对象的模板,定义了该类所有对象的属性和方法。每个对象都属于一个类,属于某个类的一个具体对象称为该类的实例。武当山旅游门户网站(fenlei.wdsxx.com)分类信息消息机制为了实现某个功能,对象之间通过发送消息相互通信,这可能发生在同一个类的不同对象之间,也可以在不同类的对象之间。例如,用鼠标点击屏幕对话框中的一个命令按钮时,一条消息发给了对话框对象,通知它命令按钮被按下了,它就开始执行相应的操作。一般来说,发送一条消息至少要说明接受消息的对象名、消息名(什么操作),还要对参数加以说明。武当山旅游门户网站(fenlei.wdsxx.com)分类信息封装面向对象程序设计的特点是将属性和方法封装在一起,就是类。封装隐藏了对象内部的处理细节,内部的变化不被其他对象所知。例如电脑在不断的升级,但是机箱还是方的,里面装的CPU和内存已是今非昔比了,人们用机箱把CPU和内存封装起来,对外只提供一些标准的接口,如USB插口、网线插口和显示器插口等等,只要这些接口不变,内部怎么变,也不会影响用户的使用方式。封装的优势:便于复用,即在不同或相同的软件中重复使用已有的对象。例如,学生对象可应用在学籍信息管理系统中,也可以应用在学校图书馆信息管理系统中作为一类读者管理…封装隐藏了对象内部的处理细节,内部的变化不被其他对象所知,对减少需求变更产生的影响是有效的保障。武当山旅游门户网站(fenlei.wdsxx.com)分类信息继承性如果两个类有继承关系,子类拥有父类的所有数据和方法。被继承的类称为父类,子类可以在继承父类的基础上进行扩展,添加新属性和方法;也可以改写父类的方法,就是说方法的名称是相同的,但具体的操作可以不同。武当山旅游门户网站(fenlei.wdsxx.com)分类信息例如,若把“学生”信息作为一个类,继承它可以生成多个子类,如“小学生”、“中学生”和“大学生”等。这些子类都具有“学生”的特性,因此“学生”类是它们的“父亲”,子类是“小学生”、“中学生”、“大学生”类,它们自动拥有“学生”类的所有属性和方法。武当山旅游门户网站(fenlei.wdsxx.com)分类信息继承优点如下:便于复用,相同的属性和方法在父类中定义,子类直接复用程序结构清晰,维护工作量减少,例如增加“研究生”的处理需求时,只要通过添加“研究生”子类,程序员不必了解“小学生”,“中学生”等类的处理过程,代码的修改量比较结构化方法少。当父类的某个操作对子类不合适时,子类可以采用“覆盖”继承,既在父类的基础上修改继承。使得每个子类既兼容父类的主要属性和方法,又能够反映自己特殊的属性和方法。武当山旅游门户网站(fenlei.wdsxx.com)分类信息多态性定义是:同一操作作用于不同类的实例,将产生不同的执行结果。例如,类Shape是任意多边形对象,它有1个方法:draw();有3个子类Circle、Square和Triangle,分别继承Shape类的draw()方法。classShape{voiddraw(){}//父类的方法draw()}classCircleextendsShape{voiddraw(){System.out.println(”Circle)}}classSquareextendsShape{voiddraw(){System.out.println(”Square’’)}}classTriangleextendsShape{voiddraw(){System.out.println(Triangle”)}}客户端主程序:Shape[]s=newShape[3];//3个实例s[0]=newCircle();//园继承父类s[1]=newSquare();//正方继承父类s[2]=newTriangle();//三角继承父类for(inti=0;i3;i++)s[i].draw();该程序的执行结果为:CircleSquareTriangle
本文标题:第七章面向对象分析设计基础--软件工程
链接地址:https://www.777doc.com/doc-3242292 .html