我将面向对象分析与设计技术总结概括为三部分
第一部分:面向对象基本概念
第二部分:面向对象分析部分
第三部分:面向对象设计部分
第一部分 面向对象基本部分
1.1 软件开发过程概述
1.2 面向对象技术
面向对象(Object-oriented)技术是一种新型程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象、类、封装、继承、聚合、关联、消息、多态等基本概念来构造系统的软件开发方法。它充分体现了分解、抽象、模块化、信息隐蔽等思想,可以有效地提高软件生产率、缩短软件开发时间、提高软件质量,是控制软件复杂性的有效途径。
(1)传统结构化方法与面向对象方法比较?
传统的结构化方法着眼于一个信息系统需要什么样的方法和处理过程。以过程抽象来对待系统的需求,其主要思想就是对问题进行功能分解,如果分解后得到的功能过大,那么再对这些功能进行分解,直到最后分解得到的功能能比较方便地处理和理解为止。它从算法的角度进行建模,所有的软件都用过程或者函数作为其主要构造块,所以,具有模型脆弱、难以适应需求的变动、维护较困难等特点。
与传统的结构化方法相比,面向对象方法在描述和理解问题域时采用截然不同的方法。其基本思想是,对问题域进行自然分割,以更接近人类思维方式建立问题域模型,从而使设计出的软件尽可能直观地描述现实世界,具有更好的可维护性,能适应用户需求的变化。
面向对象技术优点:
首先,用面向对象技术开发的系统比较稳定,较小的需求变化不会导致大的系统结构的改变。
其次,用面向对象技术开发的系统易于理解。结构化方法和面向对象方法对现实世界采用了不同的映射方法。在结构化方法中,现实世界被映射为功能的集合;在面向对象方法中,现实世界中的实体及其相互关系被映射为对象及对象间的关系,实体之间的相互作用被映射为对象间的消息发送,以及其他类似的各种映射关系。
第三,采用面向对象技术开发的系统具有更好的适应性,能更好地适应用户需求的变化,有助于改造大型软件系统。
第四,用面向对象技术开发的系统具有更高的可靠性,有助于软件的维护与复用。
第五,面向对象技术有助于提高软件的质量和生产率。
(2)面向对象的基本原则
抽象、封装、委托、分类、继承
1.3 面向对象基本概念
对象:对象(object)是系统中用来描述客观事物的一个实体,它是构造系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组方法组成。属性是用来描述对象静态特征的一个数据项,操作是用来描述对象动态特征的一个动作序列。对象之间通过消息通信。
类:类(class)是具有相同属性和方法的一组对象的集合,它为属于该类的全部对象提供一个统一的抽象描述。类是静态的,类的语义和类之间的关系在程序执行前就已经定义好了,而对象是动态的,对象是在程序执行时被创建和删除的。
封装:封装就是把对象的属性和方法结合成一个独立的系统单位,并尽可能地隐藏对象的内部细节。封装使一个对象形成两个部分:接口部分和实现部分,对于用户来说,接口部分是可见的,而实现部分是不可见的。封装提供了两种保护,首先封装可以保护对象,防止用户直接存取对象的内部细节;其次,封装也保护了客户端,防止对象实现部分的变化可能产生的副作用,即实现部分的改变不会影响到客户端的改变。
继承:特殊类(子类)拥有其一般类(父类)的生命属性与操作,称作特殊类对一般类的继承。在子类中可以增加或重新定义所继承的属性或方法,如果是重新定义,则称为覆盖(override)。与覆盖很类似的一个概念是重新(overload),重载指的是一个类中有多个同名的方法,但这些方法在操作数或/和操作数的类型上有区别。
多态:多态指的是一个实体在不同上下文条件下具有不同意义或用法的能力。对象的多态通常是指一般类中定义的操作和属性被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。注意:多态属于运行时的问题,而重载是编译时的问题。
example:Graph类中有一个draw方法,Circle和Rectangle类中继承了draw方法,可以声明一个Graph类型对象的变量,但在运行时,可以把Circle类型或Rectangle类型的对象赋值给变量,即变量所引用的对象在运行在运行时会有不同的形态。如果调用draw方法,则根据运行时该变量所引用Circle还是Rectangle,来决定调用Circle中的draw方法还是Rectangle中的draw方法。
消息:消息是向对象发出的服务请求,它包含了提供服务的对象标识、服务标识、输入信息和回答信息等。注意:消息不等同于函数调用。消息可以包括同步消息和异步消息,如果消息是异步的,则一个对象发送消息后,就继续自己的活动,不等待消息接收者返回控制,而函数调用往往是同步的,消息的发送者要等待接收者返回。
1.4 常见软件开发方法对比
(1)喷泉模型:以用户需求为动力,以对象为驱动的模型。生存期的各个阶段可以相互重叠和多次反复,而且在项目的整个生存期中,嵌入了生存期
优点:可以提高软件项目开发效率、节省开发时间、适用于面向对象的软件开发
缺点:
- 需要大量开发人员,不利于项目的管理;
- 要求严格管理文档,审核难度加大
(2)瀑布模型:将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试、运行维护六个基本活动,且规定了自上而下、相互衔接的固定次序.各个阶段完成之后都有评审,允许反馈,不支持用户参与,要求预先确定需求
优点:
- 严格按预先计划步骤、顺序执行
- 为项目提供了按阶段分的检查点
- 当完成一个任务后,只需关注后续阶段
缺点
- 缺乏灵活性,太过线性理想化
- 各个阶段划分完全固定,阶段之间产生了大量的文档
- 线性末期才能见到结果
适用范围:适用于需求易于完整定义,且不易变更的软件系统
(3)快速原型模型:分为两步走,第一步建立一个快速原型实现客户、用户交互;第二步,开发用户满意的产品
优点:
- 整合了”边做边改“和”瀑布模型“的优点
- 生命周期短
- 减少需求不明确带来的开发风险
- 适用于小型交互型系统
缺点:可能导致系统设计差、效率低、难以维护
适用范围:适用于需求复杂、难以确定、动态变化的软件系统
(4)增量模型:软件产品被增量式地一块块设计、实现和测试,每个阶段支付一个构件产品,整个产品被分成若干个构件,能够较好的适应变化
优点:
- 有计划管理技术风险
- 人员分配灵活,开始不需要大量人力
- 先推出核心产品
- 适用于需求经常变更的软件开发过程
缺点:若增量包之间存在相交的情况未很好的处理,则必须做全盘分析
适用范围:适用于技术风险较大,用户需求较为稳定的软件系统
(5)迭代模型:整个软件开发过程被分为一系列短小的、固定长度的小项目,小项目被称为一系列的迭代,每一次迭代都包括了需求分析、设计、实现和测试
优点:
- 降低了一个增量上的开支风险
- 降低了产品无法按照既定进度进入市场的风险
- 加快了开发工作的进度
- 复用性更高
缺点:对产品人员的节奏把控能力要求较高
适用范围:适用于需求难以确定,不断变更的软件系统
(6)螺旋模型:结合瀑布模型、快速原型模型、迭代模型,并引入了风险分析活动,以风险为驱动,开发过程被分为制定计划、风险分析、实施客户评估
优点:
- 设计上的灵活性,可以在项目的各个阶段进行变更
- 以小的分段来构建大型系统,使成本计算变得简单容易
- 客户始终参与每个阶段的开发,保证了项目不偏离正确方向以及项目的可控性
- 随着项目推进,客户始终掌握项目的最新信息 , 从而他或她能够和管理层有效地交互
- 客户认可这种公司内部的开发方式带来的良好的沟通和高质量的产品
缺点:
- 难以让用户确定演化方法的结果是可以控制的;
- 建设周期长,而软件更新速度较快,难以满足用户需求
- 过多的迭代次数会增加开发成本,延迟提交时间
适用范围:适用需求难以确定,软件开发风险较大的软件系统
(7)敏捷开发模型:它是以人为核心、迭代、循序渐进的开发方法,即将项目分解成多个相互联系,但也可以独立运行的小项目,并分别完成
优点:
- 敏捷开发的高适应性,以人为本的特性
- 更加的灵活并且能够充分的利用了每个开发者的优势
缺点:项目周期很长,很难保证开发的人员不更换,而没有文档就会造成在交接的过程中出现很大的困难
参考书籍
《面向对象的系统分析》(第2版) 邵维忠 杨芙清 著
《UML面向对象技术教程》 王少锋 编著