经过业务域读音的确认,我们得到了一个完善后的需求 。
你是一名翻译体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏 。此时有200名学生在上课 。游戏的是什么规则是:
让中文所有学生拍成一队,然后按顺序报数 。学生报数时,如果所报数字是3的倍数,那么不能说该数字,而游戏要说Fizz;如果所报数字是5的倍数,那么要说Buzz 。学生报数时,如果所报数字同时是两个特殊数的倍数,也要特殊处理,比如3和5的倍数,那么不能说该数字,而是要说FizzBuzz 。方案域方案域就是想想牛津代码写完之后什么样,我们这里讲一个简单的,我称之为上下文图 。
上下文图表达的是代码的静态关系 。比如,如果我的代码要这么写:

文章插图
那图就是这么画的:
如果代码要这么写:

文章插图
那么图就是这么画的:

文章插图
整个这个画图的过程,是对程序的一个拆解,这个拆解的过程实际上也是伴随着设计的 。这个图的主要讲解目的就是画出一个一个只有数据依赖、没有过程依赖的小型的上下文 。
什么叫过程依赖?如下图所示:

文章插图
上面的代码每一段if的逻辑执行完都调用了一个continue(类似的还有break和return),这使得每一个if的block都是与外面的for block耦合的,我无法单独把其抽取成一个函数 。也就没法单独测试,它的可测试性一点都不高 。
如果我不把程序拆成只有数据依赖没有过程依赖的小型上下文,那么无论是从调试还是测试的角度都会变得很复杂,因而实现也会变得复杂 。
这段程序另一个可测试性差的地方在于直接输出到了标准输出流里,如果标准库没有给我们提供打桩的方法,那么这个程序就只能人肉测 。即便提供了,测试成本也提升了,远不如直接测一个字符串来的容易 。所以我们在考虑输入输出的时候,也要考虑输入是否容易准备、输出是否容易获得 。
比起画上下文读这个图,得到可测试性高的读程序设计,这个状态才是我们想要的 。当你有足够多的经验后,其实你并不需要画这么简单的一个图,但是你脑子里还是会浮现出这样的结构,按这样的方式去思考程序,我们的目的就达到了 。
当我们得到一个可牛津测试的程序设计后,最后再理清一下,看看每个小型限界上下文的输入和输出,考虑输出的每个数据项是否都能从输入中得到所有的计算因子 。如果这一步做不好,那么下层实现域实现的时候就会没思路 。
实现域任务列表
从方案域落到实现域的第一步是得到实现域所需的任务列表 。
从图落到实现还是有些变化,我们的图实际上有点像Inception当中的用户故事地图 。用户故事地图是站在用户使用软件java的角度列出软件有什么功能 。但是软件毕竟还是需要一步一步做出来故事 。所以上面的故事卡,还要重新搬到看板上去,fizzbuzz怎么读,变成看板上的任务卡,按照实现的角度排列顺序调整优先级,并且补充相应的技术卡等卡片 。
同理,上下文图也需要经过这样一次映射转化为任务列表 。任务列表并不跟上下文图里的图一一对应 。就是说我有一个技术不会,我可能要查一查,这也是一个任务 。查完之后要做一个试验验证,确定我想要的方式能实现,这也是一个任务 。试验完了之后,在真实的产品代码中使用这个技术把需求实现出来也是一个任务 。通常我们把任务就分为这几类:沟通协调(技术类的,非需求类的)、技术调研、原型测试、编码实现 。随着团队的配合度越来越高,技术越来越熟悉,前三个就会越来越少,任务就会越发趋向于更多的编码实现 。
相关经验推荐
- 家谱英语
- 第三天英文怎么写 第四天英文怎么写
- oliver怎么读 oliver怎么读英语人名
- 苹果的英语怎么读 蚂蚁的英语怎么读
- 即使是这样英语怎么说 即使这是色情
- 新年贺词中英文对照50字 英语新年贺词50字
- 你喜欢吃水果吗的英语怎么说 问别人喜欢吃什么水果的英浯怎么说
- 制造商一定要在外包装上写吗 制造商一定要在外包装上写吗英语
- 云南2023年普通高等学校招生第二次英语科目听力考试和口语测试公告
- 云南高考第二次英语听力考试需要戴口罩吗
