像机器一样思考(五)—— 第一个应用

转自:https://www.zybuluo.com/jtong/note/640178

经过前面四篇,我们已经具备了最基本的思考编程的能力。我们开始做一个真正的应用吧。

例题

我们现在做一个应用,该应用是一个命令行应用。当程序启动的时候,我们会看到一个命令行的主界面:

 
 
  1. 1. 添加学生
  2. 2. 生成成绩单
  3. 3. 退出
  4. 请输入你的选择(13):

如果我们输入1,那么界面就会变成:

 
 
  1. 请输入学生信息(格式:姓名, 学号, 民族, 班级, 学科: 成绩, ...),按回车提交:

如果输入格式不正确,就返回:

 
 
  1. 请按正确的格式输入(格式:姓名, 学号, 学科: 成绩, ...):

如果输入格式正确就会返回

 
 
  1. 学生xxx的成绩被添加

然后打印

 
 
  1. 1. 添加学生
  2. 2. 生成成绩单
  3. 3. 退出
  4. 请输入你的选择(13):

等于回到了主界面。 
如果我们在主界面输入了2,那么界面就会变成:

 
 
  1. 请输入要打印的学生的学号(格式: 学号, 学号,...),按回车提交:

如果我们输入的不正确,就会打印:

 
 
  1. 请按正确的格式输入要打印的学生的学号(格式: 学号, 学号,...),按回车提交:

如果输入的格式正确,则会打印成绩单并回到主界面。

 
 
  1. 成绩单
  2. 姓名|数学|语文|英语|编程|平均分|总分
  3. ========================
  4. 张三|75|95|80|80|82.5|330
  5. 李四|85|80|70|90|81.25|325
  6. ========================
  7. 全班总分平均数:xxx
  8. 全班总分中位数:xxx

如果我们输入的学号不存在,该学号在计算时就会被忽略。

讲解

这个题目比之前的复杂一点,我们可以先按照功能简单列一下任务列表。

 
 
  1. #1 打印主菜单
  2. #2 添加学生成绩
  3. #3 生成成绩单
  4. #4 退出

然而这个列表是跟我们的程序不等价的。我们还是应该列出跟程序等价的任务列表。为了便于表达,我们就需要画图。我们先不考虑面向对象,直接面向过程的划分,我们画出来的图大概是下面这个样子:

Screen Shot 2017-02-02 at 1.25.48 PM.png-206.5kB

也许你觉得这个做法并不够好,我也这么觉得,那我们可以重构这个图,画出一种更好的解法:

Screen Shot 2017-02-02 at 1.26.40 PM.png-215.3kB

可以看出,这两种做法,在图形上看并没有明显的区别,但是命名上暴露出了思路的不同,后者明显减少了程序对外输入输出的次数。所以不要随便命名。 
但如果没有上面那个图,我们是看不出来buildReport这个函数他打印了还是没打印,这就需要我们有一套约定俗成的用语规范,从用语规范中可以看出来我们到底做了什么。

课后练习

  1. 针对两张图,分别列出所有的任务。
  2. 在脑中模拟一下,如果测试先行的方式写代码,两种实现的时间花费各会是多少。按照任务列表逐项估出时间,并比较两种实现的时间差异。

题外话 - 1

对于接触本文章的编程初学者,我需要多说几句:我们可以看到,其实一个真正的应用也是由一些简单函数构成的,那就说明编程思想和技巧并不受限于应用的表象。前端、后端、应用、系统之类的名词,往往是从分工的角度来讲的,如果从个人发展的角度来讲,不要拿这些名词限制自己。这也是我们这个系列只讲一些简单应用的缘故,抽象来讲思路是一样的。

题外话 - 2

到这里,你应该能感觉到我们这些题目,其实是一个个思维训练,对于这个思维训练,最重要的事情有三点: 
1. 语文问题(用词精确,前后一致) 
2. 接口问题(完全穷尽) 
3. 每个函数之间互相不知道对方的内在实现(各自独立) 
能做好这三点,代码就能完胜行业里的大多数人:)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值