分析和设计这两个术语在实际工作中经常被一起提及,但它们之间存在着明显的区别。实际上,它们是两个完全不同的概念。分析是对需求(或问题)的调查研究,而设计则是对已经定义的问题进行逻辑上的解决方案构造。分析的目的是让我们了解所面临的问题,而设计则告诉我们如何解决这些问题。
在实际工作中,我们通常会不断地进行分析、设计、分析、设计的循环过程,直到问题和解决方案达到足够的“好”,即得到参与者的一致认可。面向对象分析和设计就是使用面向对象这个工具进行分析和设计的过程。在分析和设计阶段,对象这个词具有不同的含义。在分析阶段,对象是业务领域内的概念;而在设计阶段,对象指软件对象,如模块、组件、类等。
面向对象分析的主要工作内容是编写用例,并通过用例发现和建立领域模型。而面向对象设计的任务则是将业务领域概念映射为可以编码实现的软件对象。这些任务包括分配软件对象职责、确定软件对象协作方式以及详细设计软件类。在使用面向对象这个工具时,熟练地为对象分配职责是一项非常重要的能力。
为了展示面向对象分析和设计的工具和方法,我们可以通过一个简单的例子来进行说明。以骰子游戏为例,玩家掷2个骰子,如果总点数为7则玩家获得胜利,否则输掉游戏。在这个过程中,我们可以将工作分为定义用例、定义领域模型、分配对象职责并绘制交互图以及定义设计类图四个步骤。
首先,我们需要定义用例。用例是用户使用系统(或解决方案)的场景和情节。在这个骰子游戏中,用例描述了玩家与系统之间的交互过程。通过用例,我们可以了解到用户是如何使用系统来达成业务目标的。用例是捕获需求和记录需求的重要工具。
接下来,我们需要定义领域模型。领域模型是对业务领域的抽象表示,它包含了业务领域内的所有概念和关系。在这个例子中,我们的领域模型可能包括骰子、玩家、游戏规则等相关概念及其之间的关系。
然后,我们需要分配对象职责并绘制交互图。这意味着我们需要根据用例描述来确定系统中各个对象的功能和职责,并将其表示为交互图。交互图可以帮助我们更好地理解系统内部的结构和关系。
最后,我们需要定义设计类图。设计类图是对系统中各个类的结构和关系的描述。在这个例子中,我们的设计类图可能包括骰子类、玩家类、游戏规则类等类及其之间的关系。
综上所述,通过分析和设计这两个环节,我们可以更好地理解需求和问题,并为解决方案的实现提供有力的支持。在实际工作中,我们需要不断地学习和掌握各种分析和设计方法,以便能够更高效地完成项目任务。
本文主要介绍了面向对象分析和设计(OOA&D)的7个主要步骤,包括确定问题域、建立用例模型、定义领域模型、分配对象职责并绘制交互图、定义设计类图、生成软件模型以及书写规范说明与详细设计。
第一步是确定问题域,即从用户的角度出发,找出问题的本质和关注点。在这个过程中,需要与业务专家沟通,了解他们的需求和期望,以便更好地理解问题域。
第二步是建立用例模型,即将问题域中的用例提炼出来,形成一个完整的用例集合。在这个过程中,需要注意用例的粒度和复杂度,以及用例之间的依赖关系。
第三步是定义领域模型,即将用例中的概念、属性和关联抽象成一个领域模型。在掷骰子游戏中有3个概念,分别是玩家、骰子、游戏。三者的关联是游戏包含一个玩家和两个骰子。玩家有名字,骰子有点数,这些都是属性。这一步骤完成后,我们得到了一个领域模型,标志着面向对象分析工作结束。
第四步是分配对象职责并绘制交互图。从这里我们开始进入设计阶段。前面提到过,设计阶段讨论的对象主要指软件对象。这一步骤我们主要关注如何将概念、关联以及交互映射成软件对象。通常一个概念(领域对象)对应一个软件对象,但这不是绝对的。这个步骤不会关注某个类的具体细节,而是考察各个类在软件中如何协作。下面描述了游戏中各个概念的职责和概念之间的交互:
- 玩家:玩游戏
- 游戏:掷骰子1
- 游戏:获得骰子1点数
- 游戏:掷骰子1
- 游戏:获得骰子2点数
- 游戏:判断并展示结果
使用UML可以更直观地展示概念和交互图,比如下面的时序图:
可能你已经注意到,这里的描述和领域模型稍有不同。在领域模型中,“掷骰子”行为是“玩家”所拥有的。这是因为在设计阶段必须考虑方案的实施(编码),不能简单地将领域对象直接映射为软件对象。软件设计可以从真实世界中获得灵感,但绝不是对真实世界的简单模拟。
最后一个步骤是定义设计类图。在这里对具体的类进行详细设计,以指导后续的编码工作。类:DiceGame 属性:die1 类型:Die 属性:die2 类型:Die 行为:play() 类:Die 属性:faceValue 类型:int 行为:getFaceValue(): int 行为:roll() 这里分析和设计工作告一段落。这里再说一点,分析和设计工作的产出物可以使用任何形式来展示。这里之所以选择UML,是因为UML具有直观形象、应用广泛、提供多层次视角等优点。
一个成功的软件必须是贴合用户实际需求的。面向对象分析和设计可以帮助开发团队做到这一点,面向对象分析和设计产出的软件模型更接近领域模型。领域驱动设计是另一种提高软件价值的开发方法,在这里不做讨论。