以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- [转帖]面向对象 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=42141) |
-- 作者:一分之千 -- 发布时间:1/9/2007 6:15:00 PM -- [转帖]面向对象 看到一个关于面向对象的文章,感觉讲的还不错。。 面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对 象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结 构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
谈到面向对象,这方面的文章非常多。但是,明确地给出对象的定义或说明对象的定义的非常少— —至少我现在还没有发现。其初,“面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。 可是,这个定义显然不能再适合现在情况。面向对象的思想已经涉及到软件开发的各个方面。如,面向对 象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以 及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)。许多有关面向对象的文章 都只是讲述在面向对象的开发中所需要注意的问题或所采用的比较好的设计方法。看这些文章只有真正懂 得什么是对象,什么是面向对象,才能最大程度地对自己有所裨益。这一点,恐怕对初学者甚至是从事相 关工作多年的人员也会对它们的概念模糊不清。 面向对象是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已 超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分 布式系统、网络管理结构、CAD技术、人工智能等领域。 一、传统开发方法存在问题 1.软件重用性差 目标之一。 2.软件可维护性差 配置成分组成。在软件开发过程中,始终强调软件的可读性、可修改性和可测试性是软件的重要的质量指 标。实践证明,用传统方法开发出来的软件,维护时其费用和成本仍然很高,其原因是可修改性差,维护 困难,导致可维护性差。 3.开发出的软件不能满足用户需要 的系统时,所开发出的软件系统往往不能真正满足用户的需要。 用结构化方法开发的软件,其稳定性、可修改性和可重用性都比较差,这是因为结构化方法的本质 是功能分解,从代表目标系统整体功能的单个处理着手,自顶向下不断把复杂的处理分解为子处理,这样 一层一层的分解下去,直到仅剩下若干个容易实现的子处理功能为止,然后用相应的工具来描述各个最低 层的处理。因此,结构化方法是围绕实现处理功能的“过程”来构造系统的。然而,用户需求的变化大部 分是针对功能的,因此,这种变化对于基于过程的设计来说是灾难性的。用这种方法设计出来的系统结构 常常是不稳定的 ,用户需求的变化往往造成系统结构的较大变化,从而需要花费很大代价才能实现这种 变化。 二、面向对象的基本概念 (1)对象。 具体的事物,还能表示抽象的规则、计划或事件。 (2)对象的状态和行为。 (3)类。 说类的实例是对象。 (4)类的结构。 体结构关系,整体--部分结构关系。 ①一般——具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。 (5)消息和方法。 收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名 (即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者 是所有对象都知道的全局变量名。 类中操作的实现过程叫做方法,一个方法有方法名、参数、方法体。消息传递如图10-1所示。 (1)对象唯一性。 标识都不改变,不同的对象不能有相同的标识。 (2)分类性。 ,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体 的应用有关。 (3)继承性。 的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容 ,并加入若干新的内容。 继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。 在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。 效的方法,它简化了对象、类的创建工作量,增加了代码的可重性。 件的重用性。 (4)多态性(多形性) 收到同一消息可以产生不同的结果,这种现象称为多态性。 三、面向对象的要素 (1)抽象。 象的意义和行为。使用抽象可以尽可能避免过早考虑一些细节。 类实现了对象的数据(即状态)和行为的抽象。 内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。 语言的封装更为清晰、更为有力。 (3)共享性 。 行为的继承,使各相似子类共享共同的结构和行为。使用继承来实现代码的共享,这也是面向对象的主要 优点之一。 了条件。通过类库这种机制和结构来实现不同应用中的信息共享。 4.强调对象结构而不是程序结构 四、面向对象的开发方法 目前,面向对象开发方法的研究已日趋成熟,国际上已有不少面向对象产品出现。面向对象开发方 法有Coad方法、Booch方法和OMT方法等。 1.Booch方法 Booch最先描述了面向对象的软件开发方法的基础问题,指出面向对象开发是一种根本不同于传统 的功能分解的设计方法。面向对象的软件分解更接近人对客观事务的理解,而功能分解只通过问题空间的 转换来获得。 2.Coad方法 Coad方法是1989年Coad和Yourdon提出的面向对象开发方法。该方法的主要优点是通过多年来大系 统开发的经验与面向对象概念的有机结合,在对象、结构、属性和操作的认定方面,提出了一套系统的原 则。该方法完成了从需求角度进一步进行类和类层次结构的认定。尽管Coad方法没有引入类和类层次结构 的术语,但事实上已经在分类结构、属性、操作、消息关联等概念中体现了类和类层次结构的特征。 3.OMT方法 OMT方法是1991年由James Rumbaugh等5人提出来的,其经典著作为“面向对象的建模与设计”。 该方法是一种新兴的面向对象的开发方法,开发工作的基础是对真实世界的对象建模,然后围绕这 些对象使用分析模型来进行独立于语言的设计,面向对象的建模和设计促进了对需求的理解,有利于开发 得更清晰、更容易维护的软件系统。该方法为大多数应用领域的软件开发提供了一种实际的、高效的保证 ,努力寻求一种问题求解的实际方法。 4.UML(Unified Modeling Language)语言 软件工程领域在1995年~1997年取得了前所未有的进展,其成果超过软件工程领域过去15年的成就 总和,其中最重要的成果之一就是统一建模语言(UML)的出现。UML将是面向对象技术领域内占主导地位 的标准建模语言。 众接受的标准建模语言。UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它融入了软 件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分 析开始的软件开发全过程。 五、面向对象的模型 ·对象模型 对象模型表示了静态的、结构化的系统数据性质,描述了系统的静态结构,它是从客观世界实体的 对象关系角度来描述,表现了对象的相互关系。该模型主要关心系统中对象的结构、属性和操作,它是分 析阶段三个模型的核心,是其他两个模型的框架。 1.对象和类 (1) 对象。
(2) 类。
(3) 属性。 (4) 操作和方法。 操作是类中对象所使用的一种功能或变换。类中的各对象可以共享操作,每个操作都有一个目标对 象作为其隐含参数。 2.关联和链 (1) 关联和链的含义。 。
(2) 角色。 (3) 受限关联。 定词在关联的终端对象集中说明。
(4) 关联的多重性。 号表示的是一对一关联。
3.类的层次结构 递性,也具有逆对称性。 比画很多线来将部分类联系起来简单得多,对象模型应该容易地反映各级层次,图10-10表示一个关于微 机的多极聚集。 (2)一般化关系。 的关系。一般化类称为你类,具体类又能称为子类,各子类继承了交类的性质,而各子类的一些共同性质 和操作又归纳到你类中。因此,一般化关系和继承是同时存在的。一般化关系的符号表示是在类关联的连 线上加一个小三角形,如图10-11
4.对象模型 对象模型是由一个或若干个模板组成。模板将模型分为若干个便于管理的子块,在整个对象模型和 类及关联的构造块之间,模板提供了一种集成的中间单元,模板中的类名及关联名是唯一的。 ·动态模型 动态模型是与时间和变化有关的系统性质。该模型描述了系统的控制结构,它表示了瞬间的、行为 化的系统控制 相互行为。 涉及到事件、状态、操作等重要概念。
2.状态 。状态指明了对象 3.状态图 状态图是一个标准的计算机概念,他是有限自动机的图形表示,这里把状态图作为建立动态模型的 图形工具。 ,由该事件引起的状态变化称为转换。 换,上面标记事件名,箭头方向表示转换的方向。
·功能模型 功能模型描述了系统的所有计算。功能模型指出发生了什么,动态模型确定什么时候发生,而对象 模型确定发生的客体。功能模型表明一个计算如何从输入值得到输出值,它不考虑计算的次序。功能模型 由多张数据流图组成。数据流图用来表示从源对象到目标对象的数据值的流向,它不包含控制信息,控制 信息在动态模型中表示,同时数据流图也不表示对象中值的组织,值的组织在对象模型中表示。图10-15 给出了一个窗口系统的图标显示的数据流图。
数据流图中包含有处理、数据流、动作对象和数据存储对象。 1.处理 处理。
2.数据流 算机中,用数据流来表示一中间数据值,数据流不能改变数据值。 3.动作对象 4.数据存储对象 任何操作,它只响应存储和访问的要求。 面向对象分析的目的是对客观世界的系统进行建模。本节以上面介绍的模型概念为基础,结合“银 行网络系统”的具体实例来构造客观世界问题的准确、严密的分析模型。 供一个协商的基础,作为后继的设计和实现的框架。 (一) 面向对象的分析
系统分析的第一步是:陈述需求。分析者必须同用户一块工作来提炼需求,因为这样才表示了用户 的真实意图,其中涉及对需求的分析及查找丢失的信息。下面以“银行网络系统”为例,用面向对象方法 进行开发。 。每个分理处用分理处计算机来保存各自的帐户,处理各自的事务;各自分理处的出纳站与分理处计算机 通信,出纳站录入帐户和事务数据;自动出纳机与分行计算机通信,分行计算机与拨款分理处结帐,自动 出纳机与用户接口接受现金卡,与分行计算机通信完成事务,发放现金,打印收据;系统需要记录保管和 安全措施;系统必须正确处理同一帐户的并发访问;每个分处理为自己的计算机准备软件,银行网络费用 根据顾客和现金卡的数目分摊给各分理处。 首先标识和关联,因为它们影响了整体结构和解决问题的方法,其次是增加属性,进一步描述类和 关联的基本网络,使用继承合并和组织类,最后操作增加到类中去作为构造动态模型和功能模型的副产品 。 1.确定类 构造对象模型的第一步是标出来自问题域的相关的对象类,对象包括物理实体和概念。所有类在应 用中都必须有意义,在问题陈述中,并非所有类都是明显给出的。有些是隐含在问题域或一般知识中的。 按图10-19所示的过程确定类 查找问题陈述中的所有名词,产生如下的暂定类。 根据下列标准,去掉不必要的类和不正确的类。 描述,因为"顾客"最富有描述性,因此保留它。 事务"中的一部分。 就应该把他归属到类,而不把它作为属性。 独立存在的操作应该描述成类。如我们只构造电话模型,"拨号"就是动态模型的一部分而不是类,但在电 话拨号系统中,"拨号"是一个重要的类,它日期、时间、受话地点等属性。 在银行网络系统中,模糊类是"系统"、"安全措施"、"记录保管"、"银行网络"等。属于属性的有: "帐户数据"、"收据"、"现金"、"事务数据"。属于实现的如:"访问"、"软件"等。这些均应除去。 2.准备数据字典 为所有建模实体准备一个数据字典。准确描述各个类的精确含义,描述当前问题中的类的范围,包括 对类的成员、用法方面的假设或限制。 3.确定关联 两个或多个类之间的相互依赖就是关联。一种依赖表示一种关联,可用各种方式来实现关联,但在分 析模型中应删除实现的考虑,以便设计时更为灵活。关联常用描述性动词或动词词组来表示,其中有物理 位置的表示、传导的动作、通信、所有者关系、条件的满足等。从问题陈述中抽取所有可能的关联表述, 把它们记下来,但不要过早去细化这些表述。 下面是银行网络系统中所有可能的关联,大多数是直接抽取问题中的动词词组而得到的。在陈述中,有 些动词词组表述的关联是不明显的。最后,还有一些关联与客观世界或人的假设有关,必须同用户一起核 实这种关联,因为这种关联在问题陈述中找不到。 银行网络问题陈述中的关联: 使用下列标准去掉不必要和不正确的关联: (1) 若某个类已被删除,那么与它有关的关联也必须删除或者用其它类来重新表述。在例中,我们删 除了"银行网络",相关的关联也要删除。 处理并发访问"就是一种实现的概念。 自动出纳机与用户接口"等。 步对象图如图10-20所示。其中含有关联。
4.确定属性 属性是个体对象的性质,属性通常用修饰性的名词词组来表示.形容词常常表示具体的可枚举的属性值, 属性不可能在问题陈述中完全表述出来,必须借助于应用域的知识及对客观世界的知识才可以找到它们。 只考虑与具体应用直接相关的属性,不要考虑那些超出问题范围的属性。首先找出重要属性,避免那些只 用于实现的属性,要为各个属性取有意义的名字。按下列标准删除不必要的和不正确的属性: (1) 对象:若实体的独立存在比它的值重要,那么这个实体不是属性而是对象。如在邮政目录中,"城 市"是一个属性,然而在人口普查中,"城市"则被看作是对象。在具体应用中,具有自身性质的实体一定 是对象。 象属性,尤其是它不惟一时。 是隐含在对象模型中,只列出存在于应用域的属性。 5.使用继承来细化类 使用继承来共享公共机构,以次来组织类,可以用两种方式来进行。 继承。例如"远程事务"和"出纳事务"是类似的,可以一般化为"事务"。有些一般化结构常常是基于客观世 界边界的现有分类,只要可能,尽量使用现有概念。对称性常有助于发现某些丢失的类。 枚举字情况是最常见的具体化的来源。例如:菜单,可以有固定菜单,顶部菜单,弹出菜单,下拉菜单等 ,这就可以把菜单类具体细化为各种具体菜单的子类。当同一关联名出现多次且意义也相同时,应尽量具 体化为相关联的类,例如"事务"从"出纳站"和"自动出纳机"进入,则"录入站"就是"出纳站"和"自动出纳 站"的一般化。在类层次中,可以为具体的类分配属性和关联。各属性和都应分配给最一般的适合的类, 有时也加上一些修正。 应用域中各枚举情况是最常见的具体化的来源。 6.完善对象模型 对象建模不可能一次就能保证模型是完全正确的,软件开发的整个过程就是一个不断完善的过程。模 型的不同组成部分多半是在不同的阶段完成的,如果发现模型的缺陷,就必须返回到前期阶段去修改,有 些细化工作是在动态模型和功能模型完成之后才开始进行的。 (2) 查找多余的类。 (3)查找丢失的关联。 (4) 网络系统的具体情况作如下的修改: 权限对象中可能具有好几个现金卡,每张都带有安全码,卡片码,它们附在现金卡上,表现银行的卡片权 限。 一个"事务"包括一个或多个"更新",一个"更新"是对帐户的一个动作,它们是取款,存款,查询之一。一 个"更新"中所有"更新"应该是一个原子操作。 处理实际上是实现的概念,将"分理处计算机"并入到"分理处",将"分行计算机"并入到"分行"。
(三)建立动态模型 1.准备脚本 实现模型的一部分。 2.确定事件 以发现正常事件,但不能遗漏条件和异常事件。 3.准备事件跟踪表 个独立的列。
(四)建立功能建模 功能模型用来说明值是如何计算的,表明值之间的依赖关系及相关的功能,数据流图有助于表示功能 依赖关系,其中的处理应于状态图的活动和动作,其中的数据流对应于对象图中的对象或属性。 1.确定输入值、输出值 2.建立数据流图
(五)确定操作 在建立对象模型时,确定了类、关联、结构和属性,还没有确定操作。只有建立了动态模型和功能模 型之后,才可能最后确定类的操作。 七、面向对象的设计 面向对象设计是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。 从面向对象分析到面向对象设计,是一个逐渐扩充模型的过程。 瀑布模型把设计进一步划分成概要设计和详细设计两个阶段,类似地,也可以把面向对象设计再细分 为系统设计和对象设计。系统设计确定实现系统的策略和目标系统的高层结构。对象设计确定解空间中的 类、关联、接口形式及实现操作的算法。 (一)面向对象设计的准则 1.模块化 操作这些数据的方法紧密地结合在一起所构成的模块。 耦合是设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其它部分的影响降到最低程度。 (二)面向对象设计的启发规则 1.设计结果应该清晰易懂 他们不理解的设计。 2.一般——具体结构的深度应适当 3.设计简单类 4.使用简单的协议 5.使用简单的操作 个宾语的简单句子描述它的功能 6.把设计变动减至最小 修改的范围尽可能小。 系统设计是问题求解及建立解答的高级策略。必须制定解决问题的基本方法,系统的高层结构形式包 括子系统的分解、它的固有并发性、子系统分配给硬软件、数据存储管理、资源协调、软件控制实现、人 机交互接口。 1.系统设计概述 设计阶段先从高层入手,然后细化。系统设计要决定整个结构及风格,这种结构为后面设计阶段的更 详细策略的设计提供了基础。 (1)系统分解。 事件和约束的集合。 、数据库组合在一起,不同数据存储要在费用、访问时间、容量及可靠性之间做出折衷考虑。 软件的控制。 2.系统结构的一般框架 3.系统分解——建立系统的体系结构 4.选择软件控制机制 5.数据存储管理 数据存储管理模式的影响。 6.设计人机交互接口 的人机交互接口进行详细设计,以确定人机交互的细节,其中包括指定窗口和报表的形式、设计命令层次 等项内容。 (四)对象设计 (一)程序设计语言 1.选择面向对象语言 用能够最完善、最准确地表达问题域语义的面向对象语言。 在选择编程语言时,应该考虑的其他因素还有:对用户学习面向对象分析、设计和编码技术所能提供 的培训操作;在使用这个面向对象语言期间能提供的技术支持;能提供给开发人员使用的开发工具、开发 平台,对机器性能和内存的需求,集成已有软件的容易程度。 2.程序设计风格 (二)类的实现 在开发过程中,类的实现是核心问题。在用面向对象风格所写的系统中,所有的数据都被封装在类的 实例中。而整个程序则被封装在一个更高级的类中。在使用既存部件的面向对象系统中,可以只花费少量 时间和工作量来实现软件。只要增加类的实例,开发少量的新类和实现各个对象之间互相通信的操作,就 能建立需要的软件。 一种方案是先开发一个比较小、比较简单的来,作为开发比较大、比较复杂的类的基础。 (1)“原封不动”重用。 (三)应用系统的实现 应用系统的实现是在所有的类都被实现之后的事。实现一个系统是一个比用过程性方法更简单、更简 短的过程。有些实例将在其他类的初始化过程中使用。而其余的则必须用某种主过程显式地加以说明,或 者当作系统最高层的类的表示的一部分。 在C++和C中有一个main( )函数,可以使用这个过程来说明构成系统主要对象的那些类的实例。 (四)面向对象测试 (1)算法层。 九、面向对象和基于对象的区别 很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承 ,多态)却一不可。通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继 而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例, 没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的 对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对 象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判 断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“ 基于对象”没有实现这些,的确很饶口。 从事面向对象编程的人按照分工来说,可以分为“类库的创建者”和“类库的使用者”。使用类库 的人并不都是具备了面向对象思想的人,通常知道如何继承和派生新对象就可以使用类库了,然而我们的 思维并没有真正的转过来,使用类库只是在形式上是面向对象,而实质上只是库函数的一种扩展。 面向对象是一种思想,是我们考虑事情的方法,通常表现为我们是将问题的解决按照过程方式来解 决呢,还是将问题抽象为一个对象来解决它。很多情况下,我们会不知不觉的按照过程方式来解决它,而 不是考虑将要解决问题抽象为对象去解决它。有些人打着面向对象的幌子,干着过程编程的勾当。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
5,705.078ms |