本节书摘来自异步社区《Java和Android开发实战详解》一书中的第2章,第2.1节如何构建应用程序,作者 陈会安,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.1 如何构建应用程序
Java和Android开发实战详解
一般来说,我们使用Java程序语言的目的,就是编写程序代码构建应用程序,以期让计算机执行来解决问题。
2.1.1 如何编写程序代码
程序设计(Programming)很困难吗?事实上,如果你可以引导问路人到达目的地、走迷宫或开车到你家,一步一步详细列出活动流程,就表示你一定可以编写程序代码。不过,在列流程时请注意!计算机一点都不聪明,也不会举一反三,所以,我们需要告诉计算机详细的步骤和信息,不能只有模棱两可的内容。
例如,在北京开车从建国门北上到奥林匹克公园,行车路线如下所示。
step02step01从二环出发向北开。
step03进入安定门外大街(安定门桥)。
进入安定路。
step04直行到路口后,右转进入安慧桥,然后直行。
step05左转进入大屯路后直行到终点。
上述步骤告诉我们人类的话,所提供的信息已经足以让我们开车到达目的地,但是如果将这些步骤告诉计算机,计算机一定不知道如何开车到达目的地,因为它还需要更多的信息,如下所示。
从哪里开始开车?二环路上需向北开几千米?
如何分辨十字路口?如何从十字路口下来?
在安定门高架桥开几公里可以到安定路出口?如何下去?
从安慧桥直行几公里可以看到红绿灯?
开多少公里可以看到大屯路?如何左转?接着需要如何开?如何停车?
换句话说,编写程序代码时需要告诉计算机非常详细的步骤,如同教导小孩去做一件他从没有做过的事。所谓程序设计就是在解决问题,你需要将解决问题的详细步骤一一写下来(即算法,第2.1.3小节将介绍),然后将它转换成程序代码即可。
2.1.2 程序设计的基础
如前所述,程序设计是将需要解决的问题转换成程序代码,程序代码不只能够在计算机上正确执行,而且还应可以验证程序执行的正确性。基本上,程序设计的过程主要可以分成5个阶段,如图2-1所示。
1.需求
需求(Requirements)是为了了解问题本身,以便确切获得程序需要输入的数据和预期应产生的结果,如图2-2所示。
在输入数据后,执行程序应可以输出执行结果,这就是程序设计的需求。例如,要计算从1加到100的总和,程序输入数据应是相加求和的数值,范围为1~100,执行程序则可以输出计算结果5050。
2.设计
了解程序设计(Design)的需求后,我们就可以开始找寻解决问题的方法和策略。简单地说,设计实际是在找出解决问题的步骤,如图2-3所示。
图2-3的数据需要经过处理才能转换成有用的信息,也就是输出结果。例如,为了求1加到100即1+2+3+4+…+100的结果,可以在程序中使用数学运算的加法来解决问题,或第4章的循环来执行计算。
再看一个例子,如果需要将华氏温度转换成摄氏温度,所输入数据当是华氏温度,温度转换则使用一个数学公式,经过运算后,就可以得到摄氏温度,也就是我们所需的信息。
换句话说,为了解决需求,程序需要执行数据的运算或比较等操作,将详细的执行步骤和顺序写下来,这就是设计解决问题的方法,也就是第2.1.3小节的算法。
3.分析
解决需求时是不是只有一种解决方法?未必。例如,有100个数据需要存储,我们既可以定义100个变量保存数据,也可以使用第6章的数组(一种数据结构)来保存。分析(Analysis)阶段是将所有可能解决问题的算法都写下来,然后分析哪一种方法比较好,选择最好的算法来编写程序代码。
如果一时不能分辨出哪一种方法比较好,不妨直接选择一种方法继续下一个阶段,因为在编写程序代码时,如果发现另一种方法比较好,我们可以马上改用另一种方法来编写程序代码。
4.编写程序代码
现在我们就可以使用程序语言来进行编码(Coding)工作,例如本书使用的是Java语言。在实际编写程序时,可能发现另一种方法比较好,因为设计归设计,有时在实际编写程序时才会发现其优劣,如果是一个良好的设计方法,就算改成其他方法也不会太困难。
设计者有时很难下决定,继续此方法,还是改为其他方法而重新开始。此时需视情况而定。不过每次编写程序代码最好只使用一种方法,而不要同时使用多种方法。当发现问题需要重新开始时,已经有了编写一种方法的经验,第2次将会更加容易。
5.验证
验证(Verification)是为了证明程序执行的结果是否符合需求的输出数据,在这个阶段可以再细分成3个子阶段。
证明:执行程序时需要证明它的执行结果是正确的,所输入数据符合既定组合,程序规格说明也都符合算法的需求。
测试:程序需要测试各种可能情况、条件和输入数据,以测试程序执行无误。如果有错误产生,就需要除错来解决问题。
调试:如果程序无法输出正确结果,通过调试来找出错误的地方。我们不但需要找出错误,还需要找出更正错误的方法。
上述5个阶段是设计每一个程序和开发应用程序都需经历的阶段,不论大型应用程序或一个小程序,都可以套用相同流程。首先针对问题定义需求,接着找寻各种解决方法,在编写程序代码的过程中找出最佳的解决方法,最后经过重重验证,就可以构建正确执行的程序。
2.1.3 算法
解决问题的步骤、策略或方法就是“算法”(Algorithm),其基本定义如下:
算法是用于完成目标工作且步骤有限的一组命令。除此之外,算法还必须满足一些条件,如下所示。
输入(Input):数个外界的输入数据。也可以没有。
输出(Output):至少有一个输出结果。
明确性(Definiteness):每一个命令步骤都十分明确,不能模棱两可。
有限性(Finiteness):这组命令一定会结束。
有效性(Effectiveness):每一个步骤都可行,可以追踪其结果。
根据上述算法设计的程序一定会结束,但并非所有程序都满足这项特性。例如,早期的MS-DOS操作系统,除非系统当机,否则它永远执行一个等待循环,等待用户输入命令。
因为算法只是将解决问题的步骤详细写出来,所以并没有固定方式,基本上只要能够描述命令的执行过程即可。常用算法描述方式有如下几种。
一般语言文字:直接使用文字描述来说明执行的步骤。
伪码(Pseudo Code):一种接近程序语言的描述方法,它并没有固定语法,每一行约可转换成一行程序代码,如下所示:
/ 计算1加到10 /
Let counter = 1
Let total = 0
while counter <= 10
total = total + counter
Add 1 to counter
Output the total /* 显示结果 */
流程图(Flow Chart):使用结构化的图表描述执行过程,以各种不同形状的图形表示不同的操作,使用箭头直线标示执行方向。例如,图2-4即为上述伪码的流程图。