面向对象的开发方法(Object oriented,OO)git
从事软件开发的工程 师们经常有这样 的体会:在软件开发过程当中,使用者会不断地提出各类更改要求,即便在软件投入使用后,也经常须要对其作出修改,在用结构化开发的程序中,这种修改每每是很 困难的,并且还会由于计划或考虑不周,不但旧错误没有获得完全改正,又引入了新的错误;另外一方面,在过去的程序开发中,代码的重用率很低,使得程序员的效 率并不高,为提升软件系统的稳定性、可修改性和可重用性,人们在实践中逐渐创造出软件工程的一种新途径――面向对象方法学。程序员
面向对象方法学的出发点和基本原则是尽量模拟人类习惯的思惟方式,使开发软件的方法与过程尽量接近人类认识世界、解决问题的方法与过程。因为客观世界的问题都是由客观世界中的实体及实体相互间的关系构成的,所以咱们把客观世界中的实体抽象为对象(Object)。持面向对象观点的程序员认为计算机程序的结构应该与所要解决的问题一致,而不是与某种分析或开发方法保持一致,他们的经验代表,对任何软件系统而言,其中最稳定的成分每每是其相应问题论域(problem domain)中的成分。(例如在过去几百年中复式计账的原则未作任何实质性的改变,而其使用的工具早已从鹅毛笔变成了计算机。)数据库
因此,“面向对象”是一种认识客观世界的世界观,是从结构组织角度模拟客观世界的一种方法。通常人们在认识和了解客观现实世界时,一般运用的一些构造法则:编程
-
区分对象及其属性,例如区分台式计算机和笔记本计算机;安全
-
区分总体对象及其组成部分,例如区分台式计算机组成(主机、显示器等);服务器
-
不一样对象类的造成以及区分,例如全部类型的计算机(大、中、小型计算机、服务器、工做站和普通微型计算机等)。数据结构
通俗地讲,对象指的是一个独立的、异步的、并发的实体,它能“知道一些事情” (即存储数据),“作一些工做”(即封装服务),并“与其它对象协同工做”(经过交换消息),从而完成系统的全部功能。并发
由于所要解决的问题具备特殊性,因此对象是不固定的。一个雇员能够做为一个对象,一家公司也能够做为一个对象,到底应该把什么抽象为对象,由所要解决的问题决定。框架
从以上的简单介绍中咱们能够看出,面向对象所带来的好处是程序的稳定性与可修改性(因为把客观世界分解成一个一个的对象,而且把数据和操做都封装在对象的内部)、可复用性(经过面向对象技术,咱们不只能够复用代码,并且能够复用需求分析、设计、用户界面等等)。
1. 认为客观世界是由各类对象组成的,任何事物都是对象,复杂的对象能够由比较简单的对象以某种方式组合而成。按照这种观点,能够认为整个世界就是一个最复杂 的对象。所以,面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。
2.把全部对象都划分红各类对象类(简称为类(Class)),每一个对象类都定义了一组数据和一组方法,数据用于表示对象的静态属性,是对象的状态信息。所以,每当创建该对象类的一个新实例时,就按照类中对数据的定义为这个新对象生成一组专用的数据,以便描述该对象独特的属性值。
例如,荧光屏上不一样位置显示的半径不一样的几个圆,虽然都是Circle类的对象,可是,各自都有本身专用的数据,以便记录各自的圆心位置、半径等等。
类中定义的方法,是容许施加于该类对象上的操做,是该类全部对象共享的,并不须要为每一个对象都复制操做的代码。
3.按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。
4.对象彼此之间仅能经过传递消息互相联系。
2、OO方法的基本思想
对象:是事物运行方式、处理方法和属性值的一种抽象表述。它是严格信息包和有关信息包的操做描述;它是事物的本质,不会随周围环境改变而变化的相对固定的最小的集合。它可用一组属性和能够执行的一组操做来定义。
例:在计算机屏幕上画多边形,每一个多边形是一个用有序顶点的集所定义的对象。
这些顶点的次序决定了它们的链接方式,顶点集定义了一个多边形对象的状态,包括它的形状和它在屏幕上的位置,在多边形上的操做包括:draw(屏幕显示)、 move(移动)、 contains(检查某点是否在多边形内)。
类的定义包括一组数据属性和在数据上的一组合法的操做。在一个类中,每一个对象都是类的实例(instance)。同类的对象具备相同的方法集。
类还具备父类、子类之分。父类高层次的类,表达共性,子类低层次表达个性。子类经过继承机制得到父类的属性和操做。例如:电视机、电话、计算机等都是电子产品,它们具备电子产品的公共特性,当定义电视机类Video,电话类Telephone和计算机类Computer时候,为避免它们公共特性的重复编码,可将这些电子产品的公共特性部分定义为电子产品类,将Video,Telephone和Computer定义为它的子类,子类继承了父类的全部属性和操做,并且子类本身还可扩充定义本身的属性和操做:如电子产品类具备型号、价格、颜色等属性,computer则继承了这些属性,并扩充本身的属性:显示类型、内存大小等属性。
(1)古典法
候选的对象和类一般来自下列来源:
有形事物:汽车、气象数据、压力传感器。
角色:父亲、教师、医生、女兵。
事件:降落、中断、要求。
交互做用:借款、会议、交叉。
候选的对象还可能来自:
结构:“ 是一个”及“ …的部分”关系。
其它系统:与待研制系统有交往的其它系统。
承担的角色:用户与待研制系统交往时所承担的不一样角色,如站长、站调、统计员等。
地点:待研制系统中重要的具体地点、办公处以及场所,如信号楼、技术科、调度室。
组织单位:用户所属组织,如生产部、经营部、总务处等。
(2)领域分析法
古典法是集中于问题的有形事物,而领域分析法则集中于问题领域中重要的对象、操做以及关系识别。其任务是在某一问题领域中识别出全部一切应用问题共有的客体和类,例如,销售、会计、债券交易、编译程序等都是问题领域。
领域分析法举例
例如,须要研制一个邮政销售(函售)系统,所考虑的函售应用问题如它们的关健对象一时想不出来,可对整个销售领域进行领域分析,即从现存的零售、批发系统中发现那些一时想不出来的对象,或获得启发而定出所需对象。
(3)结构化分析法
它是利用结构化分析的成果,如DFD(数据流程图)、实体关系图、数据字典等,找出和识别对象。
数据流程图中的数据存储、外部实体,有些非系统内部的数据流(它可来自外部的刺激或系统对外界的响应)等都可以做为候选对象。如存户来银行存款,便是外部对银行存款系统的的一个刺激,其数据内容是存户款;给存户的月终结算,是系统对外部的响应。
模块性: 对象是一个独立存在的实体。从外部能够了解它的功能,其内部细节是“ 隐蔽”的, 不 受外界干扰。对象之间的相互依赖性很小。因此,模块性体现了抽象和信息的隐蔽。它使得一个复杂的软件系统能够经过定义一组相对独立的模块来实现,这些独立 模块彼此之间只需交换那些为了完成系统功能所必须交换的信息。当模块内部实现发生变化而致使代码修改时,只要对外接口操做的功能不变,就不会给软件系统带 来影响。
继承和类比性:对象之间属性关系的共同性,即子模块继承了父模块的属性;经过类比方法抽象出典型对象的过程为类比。
继承:是利用已有的定义做为基础来创建新的定义,而没必要重复定义它们。
例如,汽车具备“ 型号”、“ 年代”和“ 引擎”等属性,其子类吉普车、轿车及卡车都继承了这些属性。
动态链接性:各个对象之间统1、方便、动态的消息传递机制。它是面向对象语言的共同特性,其含义是将一条发送给一个对象的消息与包含该消息的方法的对象联接起来,它使得增长新的数据类型不须要改变现有的代码。
3.以对象为主体的OO方法
(1)客观事物都是由对象(object)组成的,对象是在原事物基础上抽象的结果。任何复杂的事物均可以经过对象的组合构成。
(2)对象由属性(attribute)和方法组成。属性反映了对象的信息特征,如:特色、值、状态等等;方法(method)则是用来定义改变属性状态的各类操做。
例如:电视机对象的属性有颜色、音量、亮度、频道等,其上的操做有调节颜色、调节音量、调节亮度、调节频道等。
如:图书馆系统中其业务过程和业务实体中,最基本的对象类只有读者和复本。最基本的业务操做只有借阅和查询。
(3)对象之间的联系主要是经过传递消息(message)来实现的,而传递的方式是经过消息模式(message pattern)和方法所定义的操做过程来完成的。
例如当用户请求document的对象打印它本身时,该文档可发送一消息给对象printer以在打印队列中请求一位置,而printer则可发送一消息 返回至该文档以要求对信息加以格式化。消息还可包含解释一请求的信息。如请求一对象打印其自身的消息可包含打印机名。
(4)对象可按照其属性进行归类(class),类有必定的结构,类上有超类(父类),类下有子类。这种对象或类之间的层次结构是靠继承关系维系着的。通常父类具备通用性,子类具备特殊性。例如:
图4-4-1 类、子类、超类关系
segment是一个对象,paragraph和table共享某些性质,则可用更抽象的类text表示;paragraph也是一个类,它虽是segment的父类倒是text的子类,text是类document的子类,text是table的超类(父类)。
又如汽车是轿车、吉普车及卡车的父类,轿车、吉普车及卡车是汽车的子类。父类和子类是相对的。父类之上可有另外一父类,而成为其子类。
(5)对象是一个被严格模块化的实体,称为封装(encapsulation)。这种封装了的对象知足软件工程的一切要求,并且能够直接被面向对象的程序设计语言所接受。
例如,电视机箱将电视内部的显象管、印刷板、元件和线路都封装起来了。人们只能经过电视机面板上按钮改变其属性(颜色、音量、亮度、频道、制式等)。
有关对象的概念还有下列相关的一些内容:
实例就是由某个特定的类所描述的一个具体的对象。类是对具备相同属性和行为的一组类似的对象的抽象,类在现实世界中并不能真正存在。在地球上并无抽象的“中国人”,只有一个个具体的中国人,例如,张3、李4、王五,一样,谁也没见过抽象的“圆”。
实际上类是创建对象时使用的“样板”,按照这个样板所创建的一个个具体的对象,就是类的实际例子,一般称为实例。
对 象之间进行通讯的一种构造叫作消息,当一个消息发送给某个对象时,包含要求接收对象去执行某些活动的信息。接收到消息的对象通过解释,而后予以响应。这种 通讯机制叫作消息传递。发送消息的对象不须要知道接收消息的对象如何对请求予以响应。一般,一个消息由下述三部分组成:
(a)接收消息的对象;
(b)消息选择符(也称为消息名);
(c)零个或多个变元。
方法,就是对象所能执行的操做,也就是类中所定义的服务。方法描述了对象执行操做的算法,响应消息的方法。在C++语言中把方法称为成员函数。
例如,在录音机的例子中,为了能让使用者按下“放音键”就开始播放磁带,必须在录音机类中给出“按下放音键”的定义,也就是给出这个动做的实现方法。
属性,就是类中所定义的数据,它是对客观世界实体所具备的性质的抽象。类的每一个实例都有本身特有的属性值。
例如,在录音机类中定义的表明录音机的型号、外观、电压等数据就是属性。
广义地说,继承是指可以直接得到已有的性质和特性,而没必要重复定义它们。在面向对象的软件技术中,继承是子类自动地共享基类(或父类)中定义的数据和方法的机制。一个类直接继承其父类的所有描述(数据和操做)。
继承具备传递性,继承性使得类似的对象能够共享程序代码和数据结构,从而大大减小了程序中的冗余信息。使得对软件的修改变得比过去容易得多了。
继承性使得用户在开发新的应用系统时没必要彻底从零开始,能够继承原有的类似系统的功能或者从类库中选取须要的类,再派生出新的类以实现所须要的功能,因此,继承的机制主要是支持程序的重用和保持接口的一致性。
在 面向对象的软件技术中,多态性是指子类对象能够像父类对象那样使用,一样的消息既能够发送给父类对象也能够发送给子类对象。也就是说,在类等级的不一样层次 中能够共享(公用)一个行为(方法)的名字,然而不一样层次中的每一个类却各自按本身的须要来实现这个行为。当对象接收到发送给它的消息时,根据该对象所属于 的类动态选用在该类中定义的实现算法。
有两种重载:函数重载是指在同一做用域内的若干个参数特征不一样的函数可使用相同的函数名字;运算符重载是指同一个运算符能够施加于不一样类型的操做数上面。固然,当参数特征不一样或被操做数的类型不一样时,实现函数的算法或运算符的语义是不相同的。
重载进一步提升了面向对象系统的灵活性和可读性。
OO方法开发过程分为4个阶段:
1.系统调查和需求分析:对系统面临的问题和用户的开发需求进行调查研究。
2.分析问题的性质和求解问题:在复杂的问题域中抽象识别出对象及其行为、结构、属性和方法。这一个阶段通常称为面向对象分析,即OOA。
3.整理问题:对分析的结果进一步抽象、归类整理,最终以范式的形式肯定下来,即OOD。
4.程序实现:使用面向对象的程序设计语言将其范式直接映射为应用程序软件,即OOP(它是一个直接映射过程)。
本节着重讨论面向对象分析(Object-Oriented Analysis, OOA)。
面向对象分析与其它分析方法同样,是提取系统需求的过程。
面向对象分析的关键,是识别出问题域内的对象,并分析他们相互间的关系,最终创建起问题域的正确模型。
通 常,面向对象分析过程从分析陈述用户需求的文件开始。需求陈述的内容包括:问题范围,功能需求,性能需求,应用环境及假设条件等。总之,需求陈述应该阐明 “作什么”而不是“怎样作”。它应该描述用户的需求而不是提出解决问题的方法。在利用面向对象开发方法时,书写需求陈述要尽力作到语法正确,并且应该慎重 选用名词、动词、形容词和同义词。
接下来,系统分析员应该深刻理解用户需求,抽象出目标系统的本质属性,并用模型准确地表示出来。
面向对象分析大致上按照下列顺序进行:创建功能模型、创建对象模型、创建动态模型、定义服务。
1.创建功能模型
功能模型从功能角度描述对象属性值的变化和相关的函数操做,代表了系统中数据之间的依赖关系以及有关的数据处理功能,它由一组数据流图组成。其中的处理功能能够用IPO图、伪码等多种方式进一步描述。
创建功能模型首先要画出顶层数据流图,而后对顶层图进行分解,详细描述系统加工、数据变换等,最后描述图中各个处理的功能。
2.创建对象模型
复杂问题(大型系统)的对象模型由下述五个层次组成:主题层(也称为范畴层)、类-&-对象层、结构层、属性层和服务层,如图4-4-2所示。
图4-4-2 对象模型的层次
这五个层次很像叠在一块儿的五张透明塑料片,它们一层比一层显现出对象模型的更多细节。在概念上,这五个层次是整个模型的五张水平切片。
创建对象模型典型的工做步骤是:首先确立对象类和关联,对于大型复杂的问题还要进一步划分出若干主题;而后给类和关联增添属性,以进一步描述它们;接下来利用适当的继承关系进一步合并和组织类。
(1)肯定类-&-对象
类-&-对象是在问题域中客观存在的,系统分析员的主要任务就是经过分析找出这些类-&-对象。首先,找出全部候选的类-&-对象;而后,从候选的类-&-对象中筛选掉不正确的或没必要要的项。
步骤1:找出候选的类-&-对象
对象是对问题域中有意义的事物的抽象,它们既多是物理实体,也多是抽象概念,在分析所面临的问题时,能够参照几类常见事物,找出在当前问题域中的候选类-&-对象。
另外一种更简单的分析方法,是所谓的非正式分析。这种分析方法以用天然语言书写的需求陈述为依据,把陈述中的名高速做为类-&- 对象的候选者,用形容词做为肯定属性的线索,把动高速做为服务(操做)候选者。固然,用这种简单方法肯定的候选者是很是不许确的,其中每每包含大量不正确 的或没必要要的事物,还必须通过更进一步的严格筛选。一般,非正式分析是更详细、更精确的正式的面向对象分析的一个很好的开端。
步骤2:筛选出正确的类-&-对象
非正式分析仅仅帮助咱们找到一些候选的类-&-对象,接下来应该严格考察候选对象,从中去掉不正确的或没必要要的,仅保留确实应该记录其信息或须要其提供服务的那些对象。筛选时主要依据下列标准,删除不正确或没必要要的类-&-对象:
<1>冗余(若是两个类表达了一样的信息)
<2>无关(仅须要把与本问题密切相关的类-&-对象放进目标系统中)
<3>笼统(需求陈述中笼统的、泛指的名词)
<4>属性(在需求陈述中有些名词实际上描述的是其它对象的属性)
<5>操做(正确地决定把某些词做为类仍是做为类中定义的操做)
<6>实现(去掉仅和实现有关的候选的类-&-对象)
(2)肯定关联
两个或多个对象之间的相互依赖、相互做用的关系就是关联。分析肯定关联,能促使分析员考虑问题域的边缘状况,有助于发现那些还没有被发现的类-&-对象。
步骤1.初步肯定关联
在 需求陈述中使用的描述性动词或动词词组,一般表示关联关系。所以,在初步肯定关联时,大多数关联能够经过直接提取需求陈述中的动词词组而得出。经过分析需 求陈述,还能发现一些在陈述中隐含的关联。最后,分析员还应该与用户及领域专家讨论问题域实体间的相互依赖、相互做用关系,根据领域知识再进一步补充一些 关联。
步骤2.自顶向下
把现有类细化成更具体的子类,这模拟了人类的演绎思惟过程。从应用域中经常能明显看出应该作的自顶向下的具体化工做。例如,带有形容词修饰的名词词组每每暗示了一些具体类。可是,在分析阶段应该避免过分细化。
(3)定义结构
结构指的是多种对象的组织方式,用来反映问题空间中的复琐事物和复杂关系。这里的结构包括两种:分类结构与组装结构。分类结构针对的是事物的类别之间的组织关系,组织结构则对应着事物的总体与部件之间的组合关系。
使 用分类结构,能够按事物的类别对问题空间进行层次化的划分,体现现实世界中事物的通常性与特殊性。例如在交通工具、汽车、飞机、轮船这几件事物中,具备一 般性的是交通工具,其它则是相对特殊化的。所以能够将汽车、飞机、轮船这几种事物的共有特征归纳在交通工具之中,也就是把对应于这些共有特征的属性和服务 放在“交通工具”这种对象之中,而其它须要表示的属性和服务则按其特殊性放在“汽车”、“飞机”、“轮船”这几种对象之中,在结构上,则按这种通常与特殊 的关系,将这几种对象划分在两个层次中,如图4-4-3所示:
4-4-3 分类结构示例
组织结构表示事物的总体与部件之间的关系。例如把汽车当作一个总体,那么发动机、变速箱、刹车装置等都是汽车的部件,相对于汽车这个总体就分别是一个局部。
(4)识别主题
对 一个实际的目标系统,特别是大的系统而言,尽管经过对象和结构的认定对问题空间中的事物进行了抽象和归纳,但对象和结构的数目仍然是可观的,所以若是不对 数目众多的对象和结构进行进一步的抽象,势必形成对分析结果理解上的混乱,也难以搞清对象、结构之间的关联关系,所以引入主题的概念。
主题是一种关于模型的抽象机制,它给出了一个分析模型的概貌。
主 题直观地来看就是一个名词或名词短语,与对象的名字相似,只是抽象的程度不一样。识别主题的通常方法是:为每个结构追加一个主题;为每一种对象追加一个主 题;若是当前的主题的数目超过了7个,就对已有的主题进行归并,归并的原则是,当两个主题对应的属性和服务有着较密切的关联时,就将它们归并成一个主题。
(5)认定属性
属性是数据元素,用来描述对象或分类结构的实例。
认定一个属性有三个基本原则:首先,要确认它对响应对象或分类结构的每个实例都是适用的;其次,对知足第一个条件的属性还要考察其在现实世界中与这种事物的关系是否是足够密切;第三,认定的属性应该是一种相对的原子概念,即不依赖于其它并列属性就能够被理解。
3.创建动态模型
当问题涉及交互做用和时序时(例如用户界面及过程控制等),创建动态模型则是很重要的。
创建动态模型的第一步,是编写典型交互行为的脚本。脚本是指系统在某一执行期间内出现的一系列事件。编写脚本的目的,是保证不遗漏重要的交互步骤,它有助于确保整个交互过程的正确性和清晰性。
第二步从脚本中提取出事件,肯定触发每一个事件的动做对象以及接受事件的目标对象。
第三步,排列事件发生的次序,肯定每一个对象可能有的状态以及状态间的转换关系。
最后,比较各个对象的状态,检查它们之间的一致性,确保事件之间的匹配。
4.定义服务
一般在完整地定义每一个类中的服务以前,须要先创建起动态模型和功能模型,经过对这两种模型的研究,可以更正确更合理地肯定每一个类应该提供那些服务。
正如前面已经指出的那样,“对象”是由描述其属性的数据,及能够对这些数据施加的操做(即服务)封装在一块儿构成的独立单元。所以,为创建完整的动态模型, 既要肯定类的属性,又要定义类的服务。在肯定类中应有的服务时,既要考虑类实体的常规行为,又要考虑在本系统中特殊须要的服务。
首先考虑常规行为:在分析阶段能够认为类中定义的每一个属性都是能够访问的,即假设在每一个类中都定义了读、写该类每一个属性的操做。
其次,从动态模型和功能模型中总结出特殊服务。
最后应该尽可能利用继承机制以减小所需定义的服务数目。
5、OOD方法(面向对象的设计)
如前所述,分析是提取和整理用户需求,并创建问题域精确模型的过程。设计则是把分析阶段获得的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。从面向对象分析到面向对象设计(一般缩写为OOD),是一个逐渐扩充模型的过程。或者说,面向对象设计就是用面向对象观点创建求解域模型的过程。
尽 管分析和设计的定义有明显区别,可是在实际的软件开发过程当中两者的界限是模糊的。许多分析结果能够直接映射成设计结果,而在设计过程当中又每每会加深和补充 对系统需求的理解,从而进一步完善分析结果。所以,分析和设计活动是一个屡次反复迭代的过程。面向对象方法学在概念和表示方法上的一致性,保证了在各项开 发活动之间的平滑(无缝)过渡,领域专家和开发人员可以比较容易地跟踪整个系统开发过程,这是面向对象方法与传统方法比较起来所具备的一大优点。
在之前的软件设计中人们总结出几条基本原理,这些原理在进行面向对象设计时仍然成立,可是增长了一些与面向对象方法密切相关的新特色,从而具体化为下列的面向对象设计准则:
(1) 模块化
面向对象软件开发模式,很天然地支持了把系统分解成模块的设计原理:对象就是模块。它是把数据结构和操做这些数据的方法紧密地结合在一块儿所构成的模块。
(2) 抽象
抽象表示对规格说明的抽象(abstraction by specification)和参数化抽象(abstraction by parametrization)。
(3) 信息隐藏
在面向对象方法中,信息隐藏经过对象的封装性实现:类结构分离了接口与实现,从而支持了信息隐藏。对于类的用户来讲,属性的表示方法和操做的实现算法都应该是隐藏的。
(4) 弱耦合
在面向对象方法中,对象是最基本的模块,所以,耦合主要指不一样对象之间朴素关联的紧密程度。弱耦合是优秀设计的一个重要标准,由于这有助于使得系统中某一部分的变化对其它部分的影响降到最低程度。
固然,对象不多是彻底孤立的,当两个对象必须朴素联系、朴素依赖时,应该经过类的协议(即公共接口)实现耦合,而不该该依赖于类的具体实现细节。
(5) 强内聚
设计中使用的一个构件内的各个元素,对完成一个定义明确的目的所作出的贡献程度。在设计时应该力求作到高内聚。在面向对象设计中存在下述三种内聚:
<1>服务内聚
一个服务应该完成一个且仅完成一个功能。
<2>类内聚
一个类应该只有一个用途。
<3>通常-特殊内聚
设计出的通常-特殊结构,应该符合多数人的概念。
(6) 可重用
软件重用是 提升软件开发生产率和目标系统质量的重要途径。重用也叫再用或复用,是指同一事物不做修改或稍加改动就屡次重复使用。重用是从设计阶段开始的。重用有两方 面的含义:一是尽可能使用已有的类(包括开发环境提供的类库,及以往开发相似系统时建立的类),二是若是确实须要建立新类,则在设计这些新类的协议时,应该 考虑未来的可重复使用性。
软件成分的重用能够进一步划分红如下三个级别:
<1>代码重用
<2>设计结果重用
设计结果重用指的是,重用某个软件系统的设计模型(即求解域模型)。这个级别的重用有助于把一个应用系统移植到彻底不一样的软/硬平台上。
<3>分析结果重用
这是一种更高级别的重用,即重用某个系统的分析模型。这种重用特别适用于用户需求未改变,但系统体系结构发生根本变化的场合。
通 过度析软件重用的效果发现,重用率越高,生产率并不必定就越高。仅当开发人员使用已有软构件构造系统时,其工做效率比从新从底层编写程序的效率高时,重用 率的提升才会致使生产率提升。可见,经过软件重用来提升软件生产率,并非一件垂手可得的事情。软构件的实用程序和程度,以及软件开发人员的素质、开发环 境等因素,都直接影响软件重用的效果。事实上,自20世纪60年代以来,人们就开始研究软件重用技术,主要目的是大幅度提升软件生产率,下降软件成本。可是,多年来始终没能有效地实现软件重用,直到面向对象技术崛起以后,才为软件重用带来了新的但愿。
2.面向对象设计的内容
采用面向对象方法设计软件系统时,面向对象设计模型(即求解域的对象模型)与面向对象分析模型(即求问题域的对象模型)同样,也由主题、类-&- 对象、结构、属性、服务等五个层次组成。这五个层次表示的细节一层比一层多,咱们能够把这五个层次想象为整个模型的水平切片。此外,大多数系统的面向对象 设计模型,在逻辑上都由四大部分组成。这四大部分对应于组成目标系统的四个子系统,它们分别是问题域子系统、人-机交互子系统、任务管理子系统和数据管理 子系统。
经过面向对象分析所得出的问题域精确模型,为设计问题域子系统奠基了良好的基础,创建了完整的框架。只要可能,就应该保持面向对象分析所创建的问题域结构。一般,面向对象设计仅需从实现角度对问题域模型做一些补充或修改,主要是增添、合并或分解类-&-对象、属性及服务,调整继承关系等等。当问题域子系统过度复杂庞大时,应该把它进一步分解成若干个更小的子系统。
下面介绍在面向对象设计过程当中,可能对面向对象分析所得出的问题域模型的补充或修改:
<1>调整需求
有两种状况出现须要调整需求:用户需求或外部环境发生了变化;分析员对问题的理解存在问题。不管哪一种状况出现,一般都只须要简单地修改分析的结果,而后把这些修改的结果反映到问题域子系统中。
<2>重用已有的类
代码重用从设计阶段开始,在研究面向对象分析结果时就应该寻找使用已有类的方法。若由于没有合适的类能够重用而确实须要建立新的类,则在设计这些新类的协议时,考虑到未来的可重用性。
<3>把问题域类组合在一块儿
在面向对象设计过程当中,设计者每每经过引入一个根类而把问题域组合在一块儿,但这是在没有更先进的组合机制时才采用的一种组合方法。
<4>增添通常化类以创建协议
在设计过程当中经常发现,一些具体类须要有一个公共的协议,也就是说,它们都须要定义一组相似的服务(极可能还须要相应的属性)。在这种状况下能够引入一个附加类(例如,根类)。
<5>调整继承层次
若是面向对象分析模型中包含了多重继承关系,然而所使用的程序设计语言却并不提供多重继承机制,则必须修改面向对象分析的结果。即便使用支持多重继承的语言,有时也会出于实现考虑而对面向对象分析结果做一些调整。
在面向对象分析过程当中,已经对用户界面需求做了初步分析,在面向对象设计过程当中,则应该对系统的人-机子系统进行详细设计,以肯定人-机交互的细节,其中 包括指定窗口和报表的形式、设计命令层次等项内容。人-机交互部分的设计结果,将对用户情绪和工做效率产生重要影响。
<1> 设计人-机交互界面的准则
一致性
减小步骤
及时提供反馈信息
提供撤消命令
无须记忆
易学
富有吸引力
<2>设计人-机交互子系统的策略
-
分类用户
为设计好人-机交互子系统,设计者应该认真研究使用它的用户。设计者首先应该把未来可能与系统交互的分类。一般从下列几个不一样角度进行分类:
按技能水平分类(新手/初级/中级/高级)。
按职务分类(总经理/经理/职员)。
按所属集团分类(职员/顾客)。
-
描述用户
应该仔细了解将来使用系统的每类用户的状况,把得到的下列各项信息记录下来:
用户类型。
使用系统欲达到的目的。
特征(年龄、性别、受教育程度、限制因素等)。
关键的成功因素(需求、爱好、习惯等)。
技能水平。
完成本职工做的脚本。
-
设计命令层次
设计命令层次的工做一般包含如下几项内容:
研究现有的人-机交互含义和准则
如今,Windows已经成了微机上图形用户界面事实上的工业标准。
确切初始的命令层次
所谓命令层次,实质上是用过程抽象机制组织起来的、可供选用的服务的表示形式。
精化命令层次
精化命令层次应考虑如下因素:次序、总体---部分关系、操做步骤。
-
设计人-机交互类
人-机交互类与所使用的操做系统及编程语言密切相关。
虽 然从概念上说,不一样对象能够并发地工做。可是,在实际系统中,许多对象之间每每存在相互依赖关系。此外,在实际使用的硬件中,可能仅由一个处理器支持多个 对象。所以,设计工做的一项重点就是,肯定哪些是必须同时操做的对象,哪些是相互排斥的对象。而后进一步设计任务管理子系统。
<1> 分析并发性
彼 此间不存在交互,或者它们同时接受事件,则这两个对象在本质上是并发的。经过检查各个对象的状态图及它们之间交换的事件,可以把若干个非并发的对象归并到 一条控制线中。所谓控制线,是一条遍布状态图集合的路径,在这条路径上每次只有一个对象是活动的。在计算机系统中用任务(task)实现控制线,通常认为任务是进程(process)的别名。一般把多个任务的并发执行称为多任务。
<2> 设计任务管理子系统
常见的任务有事件驱动型任务、时钟驱动型任务、优先任务、关键任务和协调任务等。设计任务管理子系统,包括肯定各种任务并把任务分配给适当的硬件或软件去执行。
-
肯定事件驱动型任务
某些任务是由事件驱动的,这类任务可能主要完成通讯工做。例如,设备、屏幕窗口、其它任务、子系统、另外一个处理器或其它系统通讯。事件一般是代表某些数据到达的信号。
-
肯定时钟驱动任务
某些任务每隔必定时间间隔就被触发以执行某些处理,例如,某些设备须要周期性地得到数据;某些人-机接口、子系统、任务、处理器或其它系统也可能须要周期性地通讯。在这些场合每每须要使用时钟驱动型任务。
-
肯定优先任务
优先任务能够知足高优先级或低优先级的处理需求。
高优先级:某些服务具备很高的优先级,为了在严格限定的时间内完成这种服务,可能须要把这类服务分离成独立的任务。
低优先级:与高优先级相反,有些服务是低优先级的,属于低优先级处理(一般指那些背景处理)。设计时可能用额外的任务把这样的处理分离出来。
-
肯定关键任务
关键任务是关系到系统成功或失败的那些关键处理,这类处理一般都有严格的可靠性要求。
-
肯定协调任务
当系统中存在三个以上任务时,就应该增长一个任务,用它做为协调任务。
-
肯定资源需求
使用多处理器或固件,主要是为了知足高性能的需求。设计者必须经过计算系统载荷来估算所须要的CPU(或其它固件)的处理能力。
数据管理子系统是系统存储或检索对象的基本设施,它创建在某种数据存储管理系统之上,而且隔离了数据存储管理模式。
<1> 选择数据存储管理模式
文 件管理系统、关系数据库管理系统、面向对象数据管理系统三种数据存储管理模式有不一样的特色,适用范围也不一样,其中文件系统用来长期保存数据,具备成本低和 简单等特色,但文件操做级别低,为提供适当的抽象级别还必须编写额外的代码;关系数据库管理系统提供了各类最基本的数据管理功能,采用标准化的语言,但其 缺点是运行开销大,数据结构比较简单;面向对象数据管理系统增长了抽象数据类型和继承机制,提供了建立及管理类和对象的通用服务。
<2> 设计数据管理子系统
设计数据管理子系统,既须要设计数据格式又须要设计相应的服务。设计数据格式包括用范式规范每一个类的属性表以及由此定义所需的文件或数据库;设计相应的服务是指设计被存储的对象如何存储本身。
面向对象实现主要包括两项工做:把面向对象设计结果翻译成用某种程序语言书写的面向对象程序;测试并调试面向对象的程序。
面向对象程序的质量基本上由面向对象设计的质量决定,可是,所采用的程序语言的特色和程序设计风格也将对程序的生成、可重用性及可维护性产生深远影响。
1.程序设计
(1)面向对象的语言与非面向对象的语言
到底应该选用面向对象语言仍是非面向对象语言,关键不在于语言功能强弱。选择编程语言的关键因素,是语言的一致的表达能力、可重用性及可维护性。从面向对象观点看来,可以更完整、更准确地表达问题和语义的面向对象语言的语法是很是重要的,由于这会带来下述几个重要优势:面向对象语言的造成借鉴了历史上许多程序语言的特色,从中吸收了丰富的养分。当今的面向对象语言,从50年代诞生的LISP语言中引进了动态联编的概念和交到式开发环境的思想,从60年代推出的SIMULA语言中引进了类的概念和继承机制,此外,还受到70年代末期开发的Modula-2语言和Ada语言中数据抽象机制的影响。
100年代以来,面向对象语言像雨后春笋同样大量涌现,造成了两大类面向对象语言。一类是纯面向对象语言,如Smalltalk和Eiffel等语言。另外一类是混合型面向对象语言,也就是在过程语言的基础上增长面向对象机制,如C++等语言。
通常说来,纯面向对象语言着重支持面向对象方法研究和快速原型的实现,而混合型面向对象语言的目标则是提升运行速度和使传统程序员容易接受面向对象思想。成熟的面向语言一般都提供丰富的类库和强有力的开发环境。
下面介绍在选择面向对象语言时应该着重考察的一些技术特色。
<1>支持类与对象概念的机制
全部面向对象语言都容许用户动态建立对象,而且能够用指针引用动态建立的对象。容许动态建立对象,就意味着系统必须处理内存管理问题,若是不及时释放再也不须要的对象所占用的内存,动态存储分配就有可能耗尽内存。
<2>实现总体--部分结构的机制
通常说来,有两种实现方法,分别使用指针和独立的关联对象实现总体一部分结构。大多数现有的面向对象语言并不显示支持独立的关联对象,在这种状况下,使用指针是最容易的实现方法,经过增长内部指针能够方便地实现关联。
<3>实现通常--特殊结构的机制
既 包括实现继承的机制也包括解决名字冲突的机制。所谓解决名字冲突,指的是处理在多个基类中可能出现的重名问题,这个问题仅在支持多重继承的语言中才会遇 到。某些语言拒绝接受有名字冲突的程序,另外一些语言提供了解决冲突的协议。不论使用何种语言,程序员都应该尽力避免出现名字冲突。
<4>实现属性和服务的机制
对于实现属性的机制应该着重考虑如下几个方面:支持实例链接的机制;属性的可见性控制;对属性值的约束。对于服务来讲,主要应该考虑下列因素:支持消息链接(即表达对象交互关系)的机制;控制服务可见性的机制;动态联编。
<5>类型检查
程序设计语言能够按照编译时进行类型检查的严格程度来分类。若是语言仅要求每一个变量或属性隶属于一个对象,则是弱类型的;若是语法规定每一个变量或属性必须准确地隶属于某个特定的类,则这样的语言是强类型的。
<6>效率
许多人认为面向对象语言的主要缺点是效率低。事实上,若有完整类库的面向对象语言,有时能比使用非面向对象语言获得运行更快的代码。这是由于类库中提供了更高效的算法和更好的数据结构。
<7>持久保存对象
<8>参数化类
所 谓参数化类,就是使用一个或多个类型去参数化一个类型的机制,有了这种机制,程序员就能够先定义一个参数化的类模板(即在类定义中包含以参数形式出现的一 个或多个类型),而后把数据类型做为参数传递进来,从而把这个类模板用在不一样的应用程序中,或用在同一应用程序的不一样部分。Eiffel语言中就有参数化类,C++语言也提供了类模板。
<9>开发环境
软件工具和软件工程环境对软件生产率有很大影响。因为面向对象程序中继承关系和动态联编等引入的特殊复杂性,面向对象语言所提供的软件工具或开发环境就显得尤为重要了。至少应该包括下列一些最基本的软件工具:编辑程序,编译程序或解释程序,浏览工具,调试器(debugger)等。
(2)程序设计风格
良好的程序设计风格对保证程序质量的重要性。良好的程序设计风格对面向对象实现来讲尤为重要,不只能明显减小维护或扩充的开销,并且有助于在新项目中重用已有的程序代码。
良好的面向对象程序设计风格,既包括传统的程序设计风格和准则,也包括为适应面向对象方法所特有的概念(例如,继承性)而必须遵循的一些新准则。
<1>提升可重用性
面向对象方法的一个主要目标,就是提升软件的可重用性。正如本书11.3节所述,软件重用有多个层次,在编码阶段主要涉及代码重用问题。通常说来,代码重用有两种:一种是本项目内的代码重用,另外一种是新项目重用旧项目的代码。内部重用主要是找出设计中相同或类似的部分,而后利用继承机制共享它们。
-
提升方法的内聚
-
减少方法的规模
-
保持方法的一致性
保持方法的一致性,有助于实现代码重用。通常说来,功能类似的方法应该有一致的名字、参数特征(包括参数个数、类型和次序)、返回值类型、使用条件及出错条件等。
-
把策略与实现分开
-
全面覆盖
若是输入条件的各类组合均可能出现,则应该针对全部组合写出方法,而不能仅仅针对当前用到的组合状况写方法。
此外,一个方法不该该只能处理正常值,对空值、极限值及界外值等异常状况也应该可以做出有意义的响应。
-
尽可能不使用全局信息
应该尽可能下降方法与外界的耦合程度,不使用全局信息是下降耦合度的一项主要措施。
-
利用继承机制
在面向对象程序中,继承机制是实现共享和提升重用程度的主要途径。
有时提升类似类代码可重用性的一个有效途径,是从不一样类的类似方法中分解出不一样的“因子”(即不一样的代码),把余下的代码做为分用方法中的公共代码,把分解出的因子做为名字相同算法不一样的方法,放在不一样类中定义,并被这个公用方法调用。
程序员每每但愿重用其它方法编写的、解决同一类应用问题的程序代码。重用这类代码的一个比较安全的途径,是把被重用的代码封装在类中。
<2> 提升健壮性
为提升健壮性应遵照如下几条准则:预防用户的误操做,不要预先限制条件,先测试后优化。
通常说来,对面向对象软件的测试可分为下列四个层次进行:
(1)算法层
测试类中定义的每一个方法,基本上至关于传统软件测试中的单元测试。
(2)类层
测试封装在同一个类中的全部方法与属性之间的相互做用。在面向对象软件中类是基本模块,所以能够认为这是面向对象测试中所特有的模块(单元)测试。
(3)主题层
测试一组协同工做的类-&-对象之间的相互做用。大致上至关于传统软件测试中的子系统测试,可是也有面向对象软件的特色(例如,对象之间经过发送消息相互做用)。
(4)系统层
把各个子系统组装完整的面向对象软件系统,在组装过程当中同时进行测试。
设 计测试方案的传统技术,例如,逻辑覆盖、等价划分、边界值分析和错误推测等方法,仍然能够做为测试类中每一个方法的主要技术。面向对象测试的主要目标,也是 用尽量低的测试成本和尽量少的测试方案,发现尽量多的错误。可是,面向对象程序中特有的封装、继承和多态等机制,也给面向对象测试带来一些新特色, 增长了测试和调试的难度。
7、面向对象的语言(产品)
面向对象的语言应该具有的特征:
1.用对象而非过程(功能或算法)做为程序设计的基本逻辑构件;
2.每一个对象属于应该类(型),并为该类的一个实例;
3.一个类可继承其它类的性质。
面向对象的语言有:
1.SmallTalk-76,80,(80年代下半叶)
2.Actor(80年代下半叶)
3.C++,Objective-C (20世纪80年代下半叶)
4.Object Pascal, Object-Oriented Turbo Pascal,Apple ObjectPascal (80年代初开始)
5.Eiffel (80年代上半叶)
6.Ada9X
但Microsoft Visual C++, Boland C++等都属于混合型面向对象的语言,由于它们是在原来的过程语言的基础上发展起来的,都保留了原来的数据类型,如整数、浮点数、字符以及记录等。
几个有表明性的商品软件
Microsoft Visual Basic先从软件的可视化、速成化和组件化开始的,这3化已经开始或正在造成信息与软件工艺的主流之一。
Bland Delphi是组件软件和复合文书工艺的软件。它包含面向对象Pascal的编辑程序、查错程序、可视研制环境和工具、强大的数据库存取(BDE-Database Engine)工具;它用Object Pascal作情节描述语言。
Optima++ Developer 是 Sybase/Powersoft出版的可视化、速成化的研制工具。它是采用C++的一种纯可视编辑工具,用拖扔编程技术,从一组标准的和可增的控件制模 板中拖出组件,将其扔进应用图表中去,并编辑其性质。它可在Windows 9X和NT下运行,它不只是一个GUI(图形用户接口)建造程序,并且仍是一个C/S(客户/服务器)数据库构造工具。
IBM的VisualAge(SmallTalk版),用一套图标来表明应用组件(对象),并提供许多标准函数(例程)、部件,供GUI配置关系数据库存取、通讯、等之用。
用户编程时,只需用鼠标把要用的部件(图标)拖扔到屏幕中的工做面内,按要求设置这些图标的缺省项和参数值,再把这些图标用线段链接起来,表示它 们之间的关系和交互操做,并最后加以测试。在组装过程当中,要添加复杂的计算/控件流,可用VisualAge的描述语言(Scripting Language-一种4GL)来编写。若是这还不行,VisualAge则提供SmallTalk编辑环境,以添加所需的语句。
Digitalk(现叫ParcPlace-Digitalk)的Visual Smalltalk提 供组件组装的可视研制环境和工具,用拖扔手段,可视地把组件组装成一个软件(程序),它还能自建新的组件。它最适宜研制软件雏形的OO程序设计语言。应用 完成以后,使用Digitalk Smalltalk编译程序编译,其计算效率据称可增长25%,GUI效率增长了100%。
Prograph CPX(跨平台)将程序面向对象结构的可视化方面作得较突出:
-它用图标表明一个软件的组成部分,对象、类、组件所有可视化;
-全套图标都用多面体图标,如类具备“ 方法”面和“ 属性”面;
-能对图标加以注释,对象和类关系可用线段表示;
-经过工具可方便地将方法加入Tools菜单;
-既有解释程序、又有编译程序,可解除解释程序速度慢的问题。
1.特色
(1)利用特定软件直接从对象客体的描述到软件结构的转换。
(2)解决了传统结构化方法中客观世界描述工具与软件结构的不一致性。
(3)减小了从系统分析、设计到软件模块结构之间的屡次转换映射的繁杂过程。
优势:
(1)是一种全新的系统分析设计方法(对象、类、结构属性、方法)。
(2)适用于各种信息系统的开发。
(3)实现了对客观世界描述到软件结构的直接转换 ,大大减小后续软件开发量。
(4)开发工做的重用性、继承性高,下降重复工做量。
(5)缩短了开发周期。
缺点:
(1)须要必定的软件支持环境。
(2)不太适宜大型的MIS开发,若缺少总体系统设计划分,易形成系统结构不合理、各部分关系失调等问题。
(3)只能在现有业务基础上进行分类整理,不能从科学管理角度进行理顺和优化。
(4)初学者不易接受、难学。
面 向对象方法学把分析、设计和实现很天然地联系在一块儿了。虽然面向对象设计原则上不依赖于特定的实现环境,可是实现结果和实现成本却在很大程度上取决于实现 环境。所以,直接支持面向对象设计范式的面向对象程序语言、开发环境及类库,对于面向对象实现来讲是很是重要的。
为了把面向对象设计结果顺利地转变成面向对象程序,首先应该选择一种适当的程序设计语言。面向对象的程序设计语言适合用来实现面向对象设计结果。事实上,具备方便的开发环境和丰富的类库的面向对象程序设计语言,是实现面向对象设计的最佳选择。
良好的程序设计风格对于面向对象实现来讲格外重要。它既包括传统的程序设计风格准则,也包括与面向对象方法的特色相适应的一些新准则。
面向对象方法学使用独特的概念和完成软件开发工做,所以,在测试面向对象程序的时候,除了继承传统的测试技术以外,还必须研究与面向对象程序特色相适应的新的测试技术。在这方面须要作的研究工做还不少,目前已逐渐成为国内外软件工程界研究的一个新的热门课题。
完毕!!!!!!!!!!!!