首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编码kata,玩转FizzBuzz

Kata一词来源于空手道的形或招式,而Code kata或者称之为编码招式的概念由David Thomas提出,是指针对某一种特定技术或技能进行重复性的练习,从而将其熟练掌握

文中图片均来自互联网

Kata一词来源于空手道的形或招式,而在编程领域Code kata或者称之为编码招式的概念由David Thomas提出,是指针对某一种特定技术或技能进行重复性的练习,从而将其熟练掌握。伴随Code kata,许多编程题目被总结出来作为进行Code kata的对象,深入地研究这些题目对提高编程能力大有裨益,因此从这期开始,我们开辟了星云道场这个专题,其目标就是通过一个个经典的题目来学习kata,今天我们研究的对象是FizzBuzz。

01

题目介绍

FizzBuzz的背景很简单(如下),原题的描述可以在Coding Dojo网站上找到,大致的意思就是编一个程序,它将打印1~100的数字,当遇到3的倍数时打印Fizz,当遇到5的倍数时打印Buzz,而当遇到同为3和5的倍数时则打印FizzBuzz。

Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz “.

由于逻辑简单,一直以来此题都是学习TDD的入门教案,除此之外还可以练习设计模式的运用,因此这一道小小的题目其中蕴含的能量还是相当丰富的。

02

快速实现

使用TDD很快就能实现FizzBuzz,测试代码范例如下:

FizzBuzz实现代码也不复杂,如下所示:

这样看起来似乎就完成了FizzBuzz,你也许会说“这太简单了!kata也不过如此!”,先别这么着急下结论,让我们来看看它的变换。

03

变换

分析一下FizzBuzz的实现,从上面的代码看方法的主体就是三个条件分支,自上而下分布,并且这种顺序不能随意地调整,所以这里存在一种隐性的约束;再细究一下就会发现所有的分支之后其实还有一个缺省的行为,即对于所有不满足条件的输入直接输出,所以从代码流程上理解FizzBuzz,就是将4个条件串联后顺序执行。

上面的分析反复地强调了执行顺序,对于这种隐性的约束是否有办法将其显示地表达出来呢?答案是肯定的。不过在给出答案之前,再让我们考察一下FizzBuzz中的3个条件分支。

条件是什么?是规则、约束或者策略,无论是哪一种定义都能从概念和功能上形成一个聚合体,或者用编程领域更加通俗的话来讲就是对象或封装,而规则的任务就是执行一个动作,所以可以抽象如下:

回到之前讨论的执行顺序上,要想显式地表达它可以有两种方式:一种是规则之间的相互连接,比如责任链模式;另一种是借助有序集合,比如策略模式。下面我们就选择责任链模式进行说明。

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

从上图中可以看到责任链模式需要显式地为每个规则指定明确的后续处理者,按照这个模式上述的抽象和规则就变换为:

在上面的基础上可以进一步重构,观察几个规则的实现就会看到结构性重复,为了进一步减少重复代码我们需要利用模板模式,并且再次分析规则又可发现规则之间还存在组合关系,比如Fizz规则与Buzz规则的合集就是FizzBuzz规则,于是我们的代码几经变换后变成了下面的样子:

04

结语

现在,一个与第一版实现完全不一样的FizzBuzz就诞生了。这是一个利用设计模式(责任链、模板、组合)重构得到的FizzBuzz,所以我们可以把它称之为设计模式kata,怎么样?是不是觉得生活处处是惊喜!

通过上面的几次变换不难发现,正如我们在开篇所说,虽然FizzBuzz是个很小的程序但它蕴藏的能量却是非常大的,这就是kata的神奇之处,它可以根据编程者的需要进行多样化的专题练习。

今天我们介绍的FizzBuzz实现基本上还是中规中矩的,只是利用一些技巧来进行转换,其实还有更多好玩的东西藏在里面,在下一期道场中我将从另一个的角度继续探讨FizzBuzz。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180318G0VJP800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券