QP计算器案例
主要的目的是从头开始理解这个UML状态图,以及状态图的设计思想,上图是最终的成品
设计目标
首先要保证每次的计算都是准确无误的,其次在计算过程中不能出现任何异常,要做到没有任何异常要满足以下几点条件
1.正浮点数的运算,在计算器案例中所有的操作数都视为双精度浮点数对待
2.负号的判断,要保证负号的识别都是准确无误的
3.小数点的识别,判断用户输入的小数点是否合法,并忽略到用户输入的多余小数点
4.0的判断,和小数点类似,用户在输入0里,也要判断是否为合法,举粟子来说,在初始状态时用户输入多个0时,应该只保留一个0,其他的都忽略。但在已经存在输入数的情况位,0又属于有效位,需要保留。
5.长度的判断,判断用户输入的数字是否有溢出
原始设计
以常规思想设计一个计算器模型,则组成部分有,操作数1,操作2,加减乘除,等于号。所以原始设计为
1.png
这个状态机的问题:当用户点击equals时,原则上应该在屏幕上显示用户的计算结果,但以这个状态机来看的话,当用户点击equals时直接又切换到了操作数1的状态,在操作数1的状态屏幕应当清0,并准备记录用户所输入的数字,所以用户根本无法看到计算结果,下面对其进行修正。
2.png
相比于第一个状态机,增加了几点不同:
1.将加减乘除抽象成一个更高级的对象OPER
2.增加了result这个状态,用来显示结果
3.用户可以点Canel再次将状态切换到operand1
4.用户也可以再次点击某个操作符将result作为操作数再次进行操作
但显然这个状态机也是存在问题的,首先Cancel只有在运算出结果后才是可点击的状态,这显然不符合使用习惯。
再次进行修改
3.png这次我们增加了一个更高级别的状态机叫做on state,并增加了OFF功能,
让该状态机下面的子状态统一继承了Cancel和OFF功能。这样用户就可以随时关机和Cancel,更加符合使用习惯。
接下来我们对功能进行修改
在operand1, operand2中我们还需要对用户输入的数字进行具体分析是正数,0,还是小数。所以接着在operand1中增加三个子状态机用于以上分析。
4.png
子状态机zeroX的用途时当用户输入多余的时,只保留一个0,忽略掉用户输入的多余的0。
子状态机intX用于处理用户输入的整数部分
子状态机fracX用于处理用户输入的小数点,及以后部分
子状态intX可以从zeroX进入,或者由用户输入进入该子状态机
fracX可以从同级的zeroX intx及用户输入进入
由上面三个子状态机就可以将用户输入的数字,小数点,0,进行完整的判断了
网友评论