面向对象(二)

来源:互联网 发布:c语言英航卡管理系统 编辑:程序博客网 时间:2024/05/01 12:13

 面向对象设计是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。从面向对象分析到面向对象设计,是一个逐渐扩充模型的过程。  瀑布模型把设计进一步划分成概要设计和详细设计两个阶段,类似地,也可以把面向对象设计再细分为系统设计和对象设计。系统设计确定实现系统的策略和目标系统的高层结构。对象设计确定解空间中的类、关联、接口形式及实现操作的算法。  (一)面向对象设计的准则  1.模块化  面向对象开发方法很自然地支持了把系统分解成模块的设计原则:对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。  2.抽象  面向对象方法不仅支持过程抽象,而且支持数据抽象。  3.信息隐藏  在面向对象方法中,信息隐藏通过对象的封装性来实现。  4.低耦合  在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。低耦合是设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其它部分的影响降到最低程度。  5.高内聚  (1)操作内聚。  (2)类内聚。  (3)一般——具体内聚。  (二)面向对象设计的启发规则  1.设计结果应该清晰易懂  使设计结果清晰、易懂、易读是提高软件可维护性和可重用性的重要措施。显然,人们不会重用那些他们不理解的设计。  要做到:  (1)用词一致。  (2)使用已有的协议。  (3)减少消息模式的数量。  (4)避免模糊的定义。  2.一般——具体结构的深度应适当  3.设计简单类  应该尽量设计小而简单的类,这样便以开发和管理。为了保持简单,应注意以下几点:  (1)避免包含过多的属性。  (2)有明确的定义。  (3)尽量简化对象之间的合作关系。  (4)不要提供太多的操作。  4.使用简单的协议  一般来说,消息中参数不要超过3个。  5.使用简单的操作  面向对象设计出来的类中的操作通常都很小,一般只有3至5行源程序语句,可以用仅含一个动词和一个宾语的简单句子描述它的功能  6.把设计变动减至最小  通常,设计的质量越高,设计结果保持不变的时间也越长。即使出现必须修改设计的情况,也应该使修改的范围尽可能小。  (三)系统设计  系统设计是问题求解及建立解答的高级策略。必须制定解决问题的基本方法,系统的高层结构形式包括子系统的分解、它的固有并发性、子系统分配给硬软件、数据存储管理、资源协调、软件控制实现、人机交互接口。  1.系统设计概述  设计阶段先从高层入手,然后细化。系统设计要决定整个结构及风格,这种结构为后面设计阶段的更详细策略的设计提供了基础。  (1)系统分解。  系统中主要的组成部分称为子系统,子系统既不是一个对象也不是一个功能,而是类、关联、操作、事件和约束的集合。  (2)确定并发性。  分析模型、现实世界及硬件中不少对象均是并发的。  (3)处理器及任务分配。  各并发子系统必须分配给单个硬件单元,要么是一个一般的处理器,要么是一个具体的功能单元。  (4)数据存储管理。  系统中的内部数据和外部数据的存储管理是一项重要的任务。通常各数据存储可以将数据结构、文件、数据库组合在一起,不同数据存储要在费用、访问时间、容量及可靠性之间做出折衷考虑。  (5)全局资源的处理。  必须确定全局资源,并且制定访问全局资源的策略。  (6)选择软件控制机制。  分析模型中所有交互行为都表示为对象之间的事件。系统设计必须从多种方法中选择某种方法来实现软件的控制。  (7)人机交互接口设计。  设计中的大部分工作都与稳定的状态行为有关,但必须考虑用户使用系统的交互接口。  2.系统结构的一般框架  3.系统分解——建立系统的体系结构  可用的软件库以及程序员的编程经验。  通过面向对象分析得到的问题域精确模型,为设计体系结构奠定了良好的基础,建立了完整的框架。  4.选择软件控制机制  软件系统中存在两种控制流,外部控制流和内部控制流。  5.数据存储管理  数据存储管理是系统存储或检索对象的基本设施,它建立在某种数据存储管理系统之上,并且隔离了数据存储管理模式的影响。  6.设计人机交互接口  在面向对象分析过程中,已经对用户界面需求作了初步分析,在面向对象设计过程中,则应该对系统的人机交互接口进行详细设计,以确定人机交互的细节,其中包括指定窗口和报表的形式、设计命令层次等项内容。  (四)对象设计  1.对象设计概述  2.三种模型的结合  (1)获得操作。  (2)确定操作的目标对象。  3.算法设计   4.优化设计  5.控制的实现  6.调整继承  7.关联的设计   (一)程序设计语言  1.选择面向对象语言  采用面向对象方法开发软件的基本目的和主要优点是通过重用提高软件的生产率。因此,应该优先选用能够最完善、最准确地表达问题域语义的面向对象语言。  在选择编程语言时,应该考虑的其他因素还有:对用户学习面向对象分析、设计和编码技术所能提供的培训操作;在使用这个面向对象语言期间能提供的技术支持;能提供给开发人员使用的开发工具、开发平台,对机器性能和内存的需求,集成已有软件的容易程度。  2.程序设计风格  (1)提高重用性。  (2)提高可扩充性。  (3)提高健壮性。  (二)类的实现  在开发过程中,类的实现是核心问题。在用面向对象风格所写的系统中,所有的数据都被封装在类的实例中。而整个程序则被封装在一个更高级的类中。在使用既存部件的面向对象系统中,可以只花费少量时间和工作量来实现软件。只要增加类的实例,开发少量的新类和实现各个对象之间互相通信的操作,就能建立需要的软件。  一种方案是先开发一个比较小、比较简单的来,作为开发比较大、比较复杂的类的基础。  (1)“原封不动”重用。  (2)进化性重用。  一个能够完全符合要求特性的类可能并不存在。  (3)“废弃性”开发。  不用任何重用来开发一个新类。  (4)错误处理。  一个类应是自主的,有责任定位和报告错误。  (三)应用系统的实现  应用系统的实现是在所有的类都被实现之后的事。实现一个系统是一个比用过程性方法更简单、更简短的过程。有些实例将在其他类的初始化过程中使用。而其余的则必须用某种主过程显式地加以说明,或者当作系统最高层的类的表示的一部分。  在C++和C中有一个main( )函数,可以使用这个过程来说明构成系统主要对象的那些类的实例。  (四)面向对象测试  (1)算法层。  (2)类层。  测试封装在同一个类中的所有方法和属性之间的相互作用。  (3)模板层。  测试一组协同工作的类之间的相互作用。  (4)系统层。  把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试。   很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承,多态)缺一不可。通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些,的确很饶口。   从事面向对象编程的人按照分工来说,可以分为“类库的创建者”和“类库的使用者”。使用类库的人并不都是具备了面向对象思想的人,通常知道如何继承和派生新对象就可以使用类库了,然而我们的思维并没有真正的转过来,使用类库只是在形式上是面向对象,而实质上只是库函数的一种扩展。   面向对象是一种思想,是我们考虑事情的方法,通常表现为我们是将问题的解决按照过程方式来解决呢,还是将问题抽象为一个对象来解决它。很多情况下,我们会不知不觉的按照过程方式来解决它,而不是考虑将要解决问题抽象为对象去解决它。有些人打着面向对象的幌子,干着过程编程的勾当   这里我们将通过一个具体的实例来认识它的封装性! 在面向对象方法  中,对象可看成是属性(数据)以及这些属性上的专用操作的封装体。  封装是一种信息屏蔽技术,封装的目的是使对象的定义和实现分离。   Step1:  1.1新建一个工程命名为VBOOP;  1.2单击工程菜单,选择添加类模块后并单击确定按钮;  1.3在其属性窗口中将类的名称改为TScore。  Step2:编辑TScore类模块代码  2.1.这里为TScore类定义四个私有(Private)变量,它们只能在本模块  中是可见的,即类的一些成员被隐藏起来,用户只能通过属性过程  或函数等方法来访问,从而对对象进行封装。  定义变量的基本语法:  Private/Publc <变量名> As <变量类型>  代码部分:  Private FName As String/'学生的姓名  Private FMath As Single/'数学成绩  Private FEnglish As Single /'英语成绩  2.2.为TScore类定义六个公用(Public)的属性(Property)过程和一  个计算总分的方法函数。  定义方法的基本语法:  Private/Publc Property Get <读属性过程名> As <属性返回值类型>;  Private/Public Property Let <写属性过程名>(ByVal 变量名 As 返回值类型);  Private/Publc Function <函数名> As <函数返回值类型>;  get: 将模块中的私有变量的值赋给属性过程,通常称为读;  Let: 通过属性过程给模块中的私有变量值赋,通常称为写。  代码部分:  Public Property Get GetName() As String   GetName = FName   End Property  Public Property Let SetName(ByVal Name As String)   FName = Name  End Property  Public Property Get GetMath() As Single  GetMath = FMath  End Property  Public Property Let SetMath(ByVal Math As Single)  FMath = Math  End Property  Public Property Get GetEnglish() As Single  GetEnglish = FEnglish  End Property  Public Property Let SetEnglish(ByVal English As Single)  FEnglish = English  End Property  Public Function Total() As Single/'计算总成绩函数   Total = GetMath + GetEnglish  End Function  Step3:回到Form1窗口,在窗口上添加12个控件:  3.1添加5个文本框txtName、txtMath、txtEN、txtTotal;  3.2添加5个标签labName、labMath、labEN、labTotal  其Caption属性分别为姓名、数学、英语、总成绩;  3.3添加2个命令按钮ComSetValues、ComSearch  其Caption属性分别为赋值、查询。  Step4:编辑窗口事件  4.1.构造Score对象及查询关键字SearchKey。在面向对象方法  中,我们可以这样说定义类就是定义数据类型,而声明对  象就是声明变量。也就是说,对象实际上就是变量。   Dim Score As New TScore  Dim SearchKey As String  4.2.给模块中四个私有变量赋值的单击事件  Private Sub ComSetValues_Click()  If Val(txtMath.Text) >= 0 And Val(txtMath.Text) <= 100  And Val(txtEN.Text) >= 0 And Val(txtEN.Text) <= 100   Then  With Score  .SetName = txtName.Text  .SetMath = Val(txtMath.Text)  .SetEnglish = Val(txtEN.Text)  End With  txtName.Text = /"/"  txtMath.Text = /"/"  txtEN.Text = /"/"  Print /"姓名:/" & Score.GetName & /"数学:/" & Score.GetMath & /"英语:/" & Score.GetEnglish  Else  MsgBox /"成绩的取值范围:[0,100]/", 64, /"提示/"  End If  End Sub