21.1 应用分析与设计

本节将从开发这个应用的分析和设计开始讲起,其中设计过程包括需求分析、原型设计、架构设计和应用设计。

21.1.1 应用概述

为了学习Swift语言,我们需要编写一个简单而又完整的应用,还要考虑到与UI相关的知识,因此我们选择了计算器应用。几乎每个平台都有计算器,有的计算器很简单,只有加、减、乘、除运算;有的可以进行复杂的数学计算,这是为工程计算准备的;还有的可以进行二进制、八进制和十六进制数的计算,是为程序员准备的。或许你不是程序员,也不是工程师,只是卖菜的小贩、杂货铺的小老板、整理报销差旅费的业务员,你可能只需要可以进行加、减、乘、除简单计算的计算器就足够了。

21.1.2 需求分析

由客户群决定了我们开发的计算器应用是主要实现简单的加、减、乘、除运算的计算器,而且考虑到iPhone与iPad应用场景的不同,计算器应用只考虑iPhone版本就可以了,同时考虑到单手操作,我们只需设计和开发iPhone竖屏布局的计算器。

根据上面的功能描述,确定需求如下:

  • 加运算

  • 减运算

  • 乘运算

  • 除运算

这里我们采用用例分析的方法来描述用例图,如图21-1所示。

{%}

图 21-1 计算器应用用例图

21.1.3 原型设计

原型设计草图对于应用设计人员、开发人员、测试人员、UI设计人员以及用户都是非常重要的,该应用的原型如图21-2所示。

{%}

图 21-2 原型设计图

21.1.4 分层架构设计

为应用设计架构也是必需的,而且分层架构设计还可以提高项目管理的水平,科学化任务分配以及实施敏捷开发。架构设计就是应用的“骨架”,搭建好“骨架”,再往里添砖加瓦。

首先,我们来了解一下应用程序的架构设计。软件设计的原则是提高软件系统的可复用性和可扩展性,架构设计采用层次划分的方式,这些层次之间是松耦合的,层次内部是高内聚的。图21-3是通用的低耦合应用架构图。

21.1 应用分析与设计 - 图3

图 21-3 通用低耦合应用架构图

  • 表示层。用户与系统交互的组件集合。用户通过这一层向系统提交请求或发出指令,系统通过这一层接收用户请求或指令,待指令消化吸收后再调用下一层,接着将调用结果展现到这一层。表示层应该是轻薄的,不应该具有业务逻辑。

  • 业务逻辑层。系统的核心业务处理层。负责接收表示层的指令和数据,待指令和数据消化吸收后,再进行组织业务逻辑的处理,并将结果返回给表示层。

  • 数据持久层。数据持久层用于访问信息系统层,即访问数据库或文件操作的代码应该只能放到数据持久层中,而不能出现在其他层中。

  • 信息系统层。系统的数据来源,可以是数据库、文件、遗留系统或者网络数据。

图21-3看起来像一个多层“蛋糕”,蛋糕师们在制作多层蛋糕的时候,先做下层再做上层,最后做顶层。没有下层就没有上层,这叫做“上层依赖于下层”。图21-3说明了,信息系统层是最底层,是所有层的基础,没有信息系统层就没有其他层。其次是数据持久层,没有数据持久层就没有业务逻辑层和表示层。再次是逻辑层,没有逻辑层就没有表示层,最后是表示层。也就是说,我们开发一个应用的顺序应该是,先是信息层,其次是数据持久层,再次是业务逻辑层,最后是表示层。

但是凡事都有例外,有时候应用不需要存储数据,也就不需要信息系统层,没有信息系统层,数据持久层也就没有必要了,数据持久层是为了访问数据信息而设计的。图21-3所示的架构会变成图21-4所示的两层架构。

21.1 应用分析与设计 - 图4

图 21-4 两层架构图

我们需要开发的计算器应用没有数据存储,因此可以采用图21-4所示的两层架构设计。

21.1.5 应用设计

架构设计定下来后,我们就可以对计算器应用进行设计,如图21-5所示,计算器应用表示层需要一个视图控制器类ViewController,一般是一个界面视图控制器类。图21-6所示为详细的类图。

21.1 应用分析与设计 - 图5

图 21-5 计算器应用架构设计

{%}

图 21-6 计算器应用类图

ViewController主界面的视图控制器和ViewController类中的成员如表21-1所示。

表21-1 ViewController类

类成员 成员类型 成员类型/返回值类型 说明
operandPressed(sender: AnyObject) 方法 void 点击操作符按钮调用
equalsPressed(sender: AnyObject) 方法 void 点击等号(=)按钮调用
clearPressed(sender: AnyObject) 方法 void 点击清除(C)按钮调用
decimalPressed(sender: AnyObject) 方法 void 点击小数点(.)按钮调用
numberButtonPressed(sender: AnyObject) 方法 void 点击数字按钮调用
mainLabel 属性 UILabel 界面中显示计算结果的主标签控件
logic 属性 CalcLogic 业务逻辑层类CalcLogic实例

CalcLogic是计算业务逻辑处理类,CalcLogic类中的成员如表21-2所示。

表21-2 CalcLogic类述

类成员 成员类型 成员类型/返回值类型 说明
init () 方法 默认构造器
updateMainLabelStringByNumberTag (tag : Int, mainLabelString : String)-> String 方法 String 通过点击的数字按钮的标签,返回更新主标签所需要的内容
doesStringContainDecimal(string : String)-> Bool 方法 Bool 判断字符串中是否包含小数点
calculateByTag(tag : Int, mainLabelString : String)->String 方法 void 通过标签计算数值,然后返回更新主标签所需要的内容
clear() 方法 void 清除实例中的存储属性内容
deinit 方法 析构器
lastRetainValue 属性 Double 保存上一次的值
opr 属性 Operator 最近一次选择的操作符(加、减、乘、除) Operator类型自定义的枚举类型,Operator枚举成员包含了加、减、乘、除操作符
isMainLabelTextTemporary 属性 Bool 临时保存MainLabel内容,为true时,输入数字MainLabel内容被清为0