面向对象分析与设计
上QQ阅读APP看书,第一时间看更新

1.4.2 需求分析

需求获取的过程中,开发人员首先得到的可能就是一份由用户提供的简单的需求陈述。当然从用户获得的需求陈述可能会很简单,也可能很复杂,这与项目本身具有的复杂性有关。

假设得到的需求陈述如下。

开发一个计算器软件,要求该计算器具有简单计算器和科学计算器两种工作模式。简单计算器按照即时计算的方式进行加减乘除四则计算。科学计算器则能够支持带括号的四则运算功能,同时带有常用数学函数计算和统计功能。

这样一个陈述看似十分清楚,但其中仍然缺少很多必要的细节。例如,简单计算器中的四则计算模式中使用什么样的计算规则,是否含有倒数、开平方和括号等功能;科学计算模式中又含有哪些具体的数学函数,计算规则是什么样的;统计功能又含有哪些具体的计算。只有这些问题都弄清楚了,才会得到满足需求的计算器。

首先将计算器视为一个物理或逻辑实体,假设经过一个简单的分析后,确定了图1-4所示的计算器的界面结构。

图1-4 计算器的用户界面

可以看出,这个结构由若干个命令按钮和若干个显示区域构成。其中,命令按钮用于输入数字、运算符和命令;显示区域分别用于显示当前表达式、当前计算结果和历史记录列表。这个界面结构兼容了科学计算模式和简单计算模式,使用时这两种模式都包含了一个统计计算器。统计计算器主要用于计算一组数据的最大、最小、均值和方差等统计指标。

对于这两种计算器来说,由于它们需要实现的功能不同,因此它们的物理结构和运算规则也不尽相同。不同的设计者或不同的用户对计算规则的要求也不尽相同。

下面介绍计算器的运算规则问题,假设我们设计的计算器使用如下两种规则。

(1)简单计算器的运算规则

可以将简单计算器的运算过程视为输入一个表达式并进行计算的过程。所采用的规则不同,计算的方式和结果也不相同。必要时可以设计多种规则,并分析最终接受和采用哪种规则。而对这些规则的描述,则要求使用能够便于交流的方式加以描述。

计算规则考虑的主要因素包括运算符的优先级和结合性,对优先级和结合性的定义不同,得到的运算规则也不会相同。

比较常见的有如下两个规则。

1)使用优先级的计算规则。这是一种最常见的运算规则,其所有运算符都按左结合性计算,并且将运算符划分成乘除和加减两种优先级的运算规则。

例如:输入的表达式3+5*8时,先计算乘法,再计算加法,最终的计算结果是43。

2)不划分优先级的运算规则。即不划分运算符的优先级,且所有运算符都按左结合性进行计算的运算规则。

例如,输入的表达式是3+5*8时,先计算加法,再计算乘法,最终的运算结果则是64。

这两种规则各有优缺点,前者自然,易于被人们接受,但实现相对复杂。后者实现简单,但与人们日常习惯相悖,不容易被大多数人理解和接受。

尽管如此,在需求分析阶段,必须做出明确的需求决策,以决定使用哪种运算规则。最终的决策可能是二选一,例如,选择不划分优先级的运算规则,也可能是二者都要,运行时由用户选择使用哪种计算规则。

简单计算器使用的运算符包括+、-、*、/,如果使用优先级的计算规则,还需要、运算符。

(2)科学计算器的运算规则

两种计算器之间最大的不同之处在于科学计算器包含了括号、函数等运算符,这使得其运算规则必然是一种划分优先级的运算规则,否则,括号将失去其应有的作用。此时的运算符的优先级如表1-1所示。

表1-1 运算符的优先级

下面考虑建立系统的概念模型。分析上述讨论的内容中出现的名词,以及这些名词所代表的事物之间的关系,使用类图描述这些概念,可以得到如图1-5所示的概念模型。这个概念模型对于后续的软件结构设计将具有十分重要的意义。

图1-5给出了初步的计算器概念模型,其中Calculator表示计算器,SimpleCalculator表示简单计算器,ScientificCalculator表示科学计算器。Express表示表达式,ExpressWith-Brackets表示带括号的表达式,ExpressWithoutBrackets表示不带括号的表达式,它们分别表示不同计算器的输入。CalculatorForm、SimpleCalculatorForm和ScientificCalculatorForm分别表示不同的计算器界面。

图1-5 计算器的概念模型

这个概念模型决定了软件的结构模型,也决定了软件功能的实现方式。后续的设计与实现都将以这个概念模型为基础来完成。