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-3 通用低耦合应用架构图
表示层。用户与系统交互的组件集合。用户通过这一层向系统提交请求或发出指令,系统通过这一层接收用户请求或指令,待指令消化吸收后再调用下一层,接着将调用结果展现到这一层。表示层应该是轻薄的,不应该具有业务逻辑。
业务逻辑层。系统的核心业务处理层。负责接收表示层的指令和数据,待指令和数据消化吸收后,再进行组织业务逻辑的处理,并将结果返回给表示层。
数据持久层。数据持久层用于访问信息系统层,即访问数据库或文件操作的代码应该只能放到数据持久层中,而不能出现在其他层中。
信息系统层。系统的数据来源,可以是数据库、文件、遗留系统或者网络数据。
图21-3看起来像一个多层“蛋糕”,蛋糕师们在制作多层蛋糕的时候,先做下层再做上层,最后做顶层。没有下层就没有上层,这叫做“上层依赖于下层”。图21-3说明了,信息系统层是最底层,是所有层的基础,没有信息系统层就没有其他层。其次是数据持久层,没有数据持久层就没有业务逻辑层和表示层。再次是逻辑层,没有逻辑层就没有表示层,最后是表示层。也就是说,我们开发一个应用的顺序应该是,先是信息层,其次是数据持久层,再次是业务逻辑层,最后是表示层。
但是凡事都有例外,有时候应用不需要存储数据,也就不需要信息系统层,没有信息系统层,数据持久层也就没有必要了,数据持久层是为了访问数据信息而设计的。图21-3所示的架构会变成图21-4所示的两层架构。
图 21-4 两层架构图
我们需要开发的计算器应用没有数据存储,因此可以采用图21-4所示的两层架构设计。
21.1.5 应用设计
架构设计定下来后,我们就可以对计算器应用进行设计,如图21-5所示,计算器应用表示层需要一个视图控制器类ViewController
,一般是一个界面视图控制器类。图21-6所示为详细的类图。
图 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
|