面向对象是围绕对象和类来分析、设计软件系统的。
面向对象分析:
面向对象分析的主要任务是根基用户的需求,建立一个准确的、完整的、一致的系统模型。在面向对象的分析过程里,项目
组通过分析软件的功能性需求,得到一个理想化的系统模型,该模型更多的侧重于描述我们需求解决的问题是什么---我们称这种模型
为分析模型。
面向对象分析与面向对象设计的区别:
1、在侧重点上,面向对象分析侧重于理解问题,描述软件做什么,而面向对象设计侧重于理解解决方案,描述软件如何做。
2、面向对象分析一般只考虑理想的设计,不关心技术和实现的细节,而面向对象设计更具体、更详细、更接近真实的代码的设计方案。
3、在设计结果的描述方式上,分析阶段侧重描述对象的行为,设计阶段侧重于描述对象的属性和方法。
4、面向对象分析只关注功能性需求,而面向对象设计既关注功能性需求,也关注非功能性需求。
5、面向对象分析的产生的系统模型通常规模较小,而面向对象的设计产生的系统模型规模较大,内容也比较完整、详尽。
用例驱动的面向对象分析:
面向对象分析的过程包括:
1、从用例中提取实体对象和实体类。
提取实体对象的方法,依据用例描述中出现的名词和名词短语来提取实体对象,必须对原始的名词和名词短语进行筛选。
得到实体对象后,对实体对象进行归纳、抽象出实体类。
2、提取属性
3、提取关系
4、添加边界类
5、添加控制类
6、绘制类图
7、绘制顺序图
8、编制术语表
有了思想才能飞翔,缺乏灵活就象少了轮子的汽车,难以飞奔。为了更好的理解设计思想,结合一个尽可能简洁的实例来说明OOD、设计模式及重构。通过下面的代码,详细地阐述面向对象设计思想。 一、传统过程化设计思想假定我们要设计一个媒体播放器(只从软件设计的角度,不涉及硬件)。该媒体播放器目前只支持音频文件mp3和wav。按照结构化设计思想,设计出来的播放器的代码如下:
1public class MediaPlayer
2{
3 private void PlayMp3()
4 {
5 MessageBox.Show("Play the mp3 file.");
6 }
7
8 private void PlayWav()
9 {
10 MessageBox.Show("Play the wav file.");
11 }
12
13 public void Play(string audioType)
14 {
15 switch (audioType.ToLower())
16 {
17 case ("mp3"):
18 PlayMp3();
19 break;
20 case ("wav"):
21 PlayWav();
22 break;
23 }
24 }
25}
1public class MP3
2{
3 public void Play()
4 {
5 MessageBox.Show("Play the mp3 file.");
6 }
7}
8
9public class WAV
10{
11 public void Play()
12 {
13 MessageBox.Show("Play the wav file.");
14 }
15}
16
17Public class MediaPlayer
18{
19 switch (audioType.ToLower())
20 {
21 case ("mp3"):
22 MP3 m = new MP3();
23 m.Play();
24 break;
25 case ("wav"):
26 WAV w = new WAV();
27w.Play();
28 break;
29 }
30}
2 {
3 public void Play()
4 {
5 MessageBox.Show("Play the AudioMedia file.");
6 }
7}
1public abstract class AudioMedia
2{
3 public abstract void Play();
4}
5
6public class MP3:AudioMedia
7{
8 public override void Play()
9 {
10 MessageBox.Show("Play the mp3 file.");
11 }
12}
13
14public class WAV:AudioMedia
15{
16 public override void Play()
17 {
18 MessageBox.Show("Play the wav file.");
19 }
20}
21
22public class MediaPlayer
23{
24 //根据需要完成任务的单向分派
25 public void Play(AudioMedia media)
26 {
27 media.Play();
28 }
29}
1public abstract class VideoMedia
2{
3 public abstract void Play();
4}
5
6public class RM:VideoMedia
7{
8 public override void Play()
9 {
10 MessageBox.Show("Play the rm file.");
11 }
12}
13
14public class MPEG:VideoMedia
15{
16 public override void Play()
17 {
18 MessageBox.Show("Play the mpeg file.");
19 }
20}
1public interface IMedia
2{
3 void Play();
4}
5
6public abstract class AudioMedia:IMedia
7{
8 public abstract void Play();
9}
10
11public abstract class VideoMedia:IMedia
12{
13 public abstract void Play();
14}
15
16这样再更改MediaPlayer类的代码:
17public class MediaPlayer
18{
19 public void Play(IMedia media)
20 {
21 media.Play();
22 }
23}
1Public void BtnPlay_Click(object sender,EventArgs e)
2{
3 IMedia media = null;
4 switch (cbbMediaType.SelectItem.ToString().ToLower())
5 {
6 case ("mp3"):
7 media = new MP3();
8 break;
9 //其它类型略;
10 case ("rm"):
11 media = new RM();
12 break;
13 //其它类型略;
14 }
15 MediaPlayer player = new MediaPlayer();
16 player.Play(media);
17}
1public class MP3Factory:IMediaFactory
2{
3 public IMedia CreateMedia()
4 {
5 return new MP3();
6 }
7}
8//其它工厂略;
9
10public class RMFactory:IMediaFactory
11{
12 public IMedia CreateMedia()
13 {
14 return new RM();
15 }
16}
17//其它工厂略;
1Public void BtnPlay_Click(object sender,EventArgs e)
2{
3IMediaFactory factory = null;
4 switch (cbbMediaType.SelectItem.ToString().ToLower())
5{
6 //音频媒体
7 case ("mp3"):
8 factory = new MP3Factory();
9 break;
10 //视频媒体
11case ("rm"):
12 factory = new RMFactory();
13 break;
14 //其他类型略;
15 }
16 MediaPlayer player = new MediaPlayer();
17 player.Play(factory.CreateMedia());
18}
1Public void BtnPlay_Click(object sender,EventArgs e)
2{
3IMediaFactory factory = null;
4 switch (cbbMediaType.SelectItem.ToString().ToLower())
5 {
6 case ("mp3"):
7 factory = new MP3Factory();
8 break;
9 //其他类型略;
10 case ("rm"):
11 factory = new RMFactory();
12 break;
13 //其他类型略;
14 }
15 IMedia media = factory.CreateMedia();
16 media.Play();
17}
18
<appSettings>
<add key="mp3" value="MediaLibrary.MP3Factory" />
<add key="wav" value=" MediaLibrary.WAVFactory" />
<add key="rm" value=" MediaLibrary.RMFactory" />
<add key="mpeg" value=" MediaLibrary.MPEGFactory" />
</appSettings>
1private void InitMediaType()
2{
3cbbMediaType.Items.Clear();
4foreach (string key in ConfigurationSettings.AppSettings.AllKeys)
5{
6 cbbMediaType.Item.Add(key);
7}
8cbbMediaType.SelectedIndex = 0;
9}
1Public void BtnPlay_Click(object sender,EventArgs e)
2{
3string mediaType = cbbMediaType.SelectItem.ToString().ToLower();
4string factoryDllName = ConfigurationSettings.AppSettings[mediaType].ToString();
5//MediaLibray为引用的媒体文件及工厂的程序集;
6IMediaFactory factory = (IMediaFactory)Activator.CreateInstance(“MediaLibrary”,
7factoryDllName).Unwrap();
8IMedia media = factory.CreateMedia();
9media.Play();
10}
C#面向对象分析
面向对象分析属于软件开发过程中的问题定义阶段,其目标是清晰、精确地定义问题领域。传统的系统分析产生一组面向过程的文档,定义目标系统的功能;面向对象分析则产生一种描述系统功能和问题领域的基本特征的综合文档。
原则
面向对象分析的主要原则如下。
1.抽象
从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫做抽象。抽象是形成概念的必须手段。
抽象原则有两方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析研究其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其共同特征而得到一批事物的抽象概念。
抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象和数据抽象两个方面。过程抽象是指,任何一个完成确定功能的操作序列,其使用者都可以把它看做一个单一的实体,尽管实际上它可能是由一系列更低级的操作完成的。数据抽象是指根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改和观察。数据抽象是面向对象分析的核心原则。它强调把数据(属性)和操作(服务)结合为一个不可分的系统单位(即对象),对象的外部只需要知道它做什么,而不必知道它如何做。
2.封装
封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。
3.继承
特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。
在面向对象分析中运用继承原则,就是在每个由一般类和特殊类形成的一般—特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和服务,一次性地在一般类中进行显式定义。在特殊类中不再重复地定义一般类中已定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的全部属性和服务。继承原则的好处是:使系统模型比较简练也比较清晰。
4.分类
就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。
5.聚合
聚合的原则是:把一个复杂的事物看成若干比较简单的事物的组装体,从而简化对复杂事物的描述。
6.关联
关联是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系。
7.消息通信
这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA中要求用消息连接表示出对象之间的动态联系。
8.粒度控制
一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不详察每一部分的具体的细节;考虑某部分的细节时则暂时撇开其余的部分。这就是粒度控制原则。
9.行为分析
现实世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为往往相互依赖、相互交织。
阶段
面向对象分析过程可分为问题领域分析和应用分析两个阶段。
问题领域分析是软件开发的基本组成部分,目的是使开发人员了解问题领域的结构,建立大致的系统实现环境。问题领域分析给出一组抽象概念(从高层来表示问题领域知识,常常超出当前应用的范围)作为特定系统需求开发的参考。问题领域分析实际上是一种学习过程。软件开发人员在这个阶段应该尽可能地理解当前系统中与应用有关的知识,应该放开思维,放宽考虑的范围,尽可能地标识与应用有关的概念。问题领域分析的边界可能很模糊。有了广泛的问题领域知识,涉及到具体的应用时,就可以更快地进入状态,掌握应用的核心知识。而且,在用户改变对目标系统的需求时,广泛的分析可以帮助我们预测出目标系统在哪些方面会发生哪些变化。通常进行小组分析,小组成员可以包括领域专家和分析员等。在分析过程中,应该标识出系统的基本概念(对象、类、方法、关系等)、识别问题领域的特征,并把这些概念集成到问题领域的模型中。问题领域的模型必须包含概念之间的关系,以及每个概念的全部信息。标识出来的相关概念应该根据信息内容来有机地融合到问题领域的综合视图中。
应用分析是依据在问题领域分析时建立起来的问题领域模型来进行的。应用分析时,把问题领域模型用于当前特定的应用之中。首先,通过收集到的用户信息来对问题领域进行取舍,把用户需求作为限制条件来使用,以缩减问题领域的信息量。因此,问题领域分析的视野大小直接影响到应用分析保留的信息量。一般来说,问题领域分析阶段产生的模型并不需要用程序设计语言来表示,而应用分析阶段产生的影响条件则需要用某种程序设计语言来表示。模型识别的要求可以针对一个应用,也可以针对多个应用。通常我们着重考虑两个方面,即应用视图和类视图。在类视图中,必须对每个类的属性和操作进行细化,并表示出类之间的相互作用关系。
目标
Coad和Yourdon 认为,面向对象分析主要应该考虑与特定应用有关的对象,以及对象之间在结构和相互作用上的关系。在面向对象分析中,需要建立分析模型来描述系统的功能。
面向对象分析需要完成如下两个任务:
— 形式化地说明所面对的应用问题,最终成为软件系统基本构成的对象,以及系统所必须遵从的、由应用环境所决定的规则和约束条件。
— 明确地规定构成系统的对象如何协同工作和完成指定的功能。
通过面向对象分析所建立的系统模型是以概念为中心的,因此称为概念模型。概念模型由一组相关的类组成。面向对象分析可以通过自顶向下地逐层分解来建立系统模型,也可以自底向上地从已经定义的类出发,逐步构造新的类。概念模型的构造和评审由如下5个层次构成:
— 类和对象层
— 属性层
— 服务层
— 结构层
— 主题层
这5个层次不是构成软件系统的层次,而是分析过程中的层次。也可以说是问题的不同侧面。每个层次的工作都为系统的规格说明增加了一个组成部分。当5个层次的工作全部完成时,面向对象分析的任务也就完成了。
在实际操作中,面向对象分析的目标是得出问题领域的功能模型、对象模型和动态模型,并用相应的UML图将它们表示出来。
步骤
面向对象分析通常按照下面的步骤来进行:
(1)标识对象和类。可以从应用领域开始,逐步确定形成整个应用的基础类和对象。这一步需要分析领域中目标系统的责任,调查系统的环境,从而确定对系统有用的类和对象。
(2)标识结构。典型的结构有两种,即一般—特殊结构和整体—部分结构。一般—特殊结构表示一般类是基类,特殊类是派生类。比如,汽车是轿车和卡车的基类,这是一种一般—特殊结构。整体部分结构表示聚合,由属于不同类的成员聚合成为新的类。比如,轮子、车体和汽车底盘都是汽车的一部分,这些不同功能的部件聚合成为汽车这个整体。
(3)标识属性。对象所保存的信息称为它的属性。类的属性描述状态信息,在类的某个实例中,属性的值表示该对象的状态值。需要找出每个对象在目标系统中所需要的属性,并将属性安排在适当的位置,找出实例连接,最后再进行检查。应该给出每个属性的名字和描述,并指定该属性所受的特殊限制(如只读、属性值限定在某个范围之内等)。
(4)标识服务。对象收到消息后执行的操作称为对象提供的服务。它描述了系统需要执行的处理和功能。定义服务的目的是为了定义对象的行为和对象之间的通信。其具体步骤包括:
— 标识对象状态
— 标识必要的服务
— 标识消息连接
— 描述服务
可以用类似于流图的图形来表示服务。
(5)标识主题。为了更好地理解包含大量类和对象的概念模型,需要标识主题,即对模型进行划分,给出模型的整体框架,划分出层次结构。可以按照如下步骤来标识主题。
— 识别主题
— 对主题进行改进和细化
— 将主题加入到分析模型
主题是一个与应用相关的概念,而不是人为任意引出来的,主题层的工作有助于理解分析的结果。
优点
面向对象分析的主要有点有:
(1)加强了对问题域和系统责任的理解;
(2)改进与分析有关的各类人员之间的交流;
(3)对需求的变化具有较强的适应性;
(4)支持软件复用;
(5)贯穿软件生命周期全过程的一致性;
(6)实用性;
(7)有利于用户参与。