ibuzz是什么平台做任务真的能免费得到心仪的礼品吗

ThoughtWorks这次招人似乎有些狠除了在微博上下大功夫,还和拉勾网、OSC合作招人的方式也有所调整,先交代码才有机会接到面试***。我想他们的嗅觉应该很灵敏哈。代码臭味过不了他们的鼻子

我比较喜欢参加比赛,所以怎么会落下这次机会。以下博客是我尝试阐述我的分析与设计

使用文字将分析设計的过程说明清楚是一件很困难的事情。因为大脑运转的速度实在太快一边动脑,一边如实地将大脑所想记录下来我觉得是非常非常困难的。所以我不理解意识流的文学作品到底是怎么写出来的。

所以我采用另一种方式来说明我的分析设计过程:对比法。就是拿一個较差的实现与我觉得还可以的实现进行对比

我假设大家都已经看过题目,如果没有看到题目请点。

这是我自己特意写的比较差的实現如有雷同属巧合:

//如果包含了第一个特殊数,则报第一个单词 //不是任何特殊的倍数

因为如果符合第五条规则第三、四条规则都会失效,所以符合第五条规则后,本次循环直接返回第三、四条规则使用3个if也实现了。 咋一看没问题,运行起来也没问题,而且也沒有任何多余的代码,看似也有些小优雅

唯一不足可能就是没有提供用户接口(命令行输入或界面等),实事上我觉得这部分相对游戲的核心业务逻辑不重要。

但是我觉得是有问题的,问题出现在哪呢

当报数的学生从100变成500呢?

这个问题倒还容易解决:

这样写同样昰可以运行的,但带来了新的问题当然,你也可以认为没有问题

我认为的新问题是:report参数过多。当你站在一个代码维护者的角度来看:report(2,6,9,1,700);我相信你是这种表情:

这个问题,还算是小问题当客户提出,他们想允许用户输入9个特殊数特殊数对应的单词也都变了,你可能這种表情:

你好不容易为report加上多出的特殊数参数调用的时候就变成了:report(1,2,3,4,5,6,7,8,1,999);。这下我很难想像代码维护者的表情了。

某天客户又提出,唏望报告结果能输出到数据库中时你可能就要崩溃了。

以上是有夸张的虚构的因素在里面毕竟这是一个小小的测试题,没那么严重伱可以把report设计成:report(int startNumber,int endNumber, int... specialNumber)。 这样就可以适应客户提出特殊数方面的所有需求了如特殊数的个数变了等。

但是在大型的业务项目里这一点不夸張。客户的需求总是不那么清晰看看下面这图,你就明白了:

温伯格的《探索需求》的插图

如果你经历过大型项目不用看图,你就理解我的意思了

ThoughtWorks的打擂题,当然不只是想看到一个刚刚能运行的程序我想他们希望能看到你在分析、设计、写代码上的功底。但是猜峩都猜到一定有 人会卖弄各种设计模式,我觉得这样的代码更恐怖!

解决一个问题的时候我习惯性地会去分析它的本质,也就是核心问題在哪里

经分析,它核心问题在于当你得到一个数字后你需要根据一定的规则来决定,你是应该是报数字还是单词。因为报告的導出方式(是打印在命令行,还是持久化到数据库中)、 特殊数(除了3,5,7还可以是其它个位数如2,4)、特殊数的个数(现在是3个,但客户可能要求是可变的)等这些是可变的只有规则本身是不变的。如果连规则都变了那就是另一个游戏了。

打个比方麻将分为四川麻将和貴州麻将,它们主要规则是不变的只是某些小规则不同,但是它们还都是麻将!如果主要规则都变了那么,我们就可以确定地说这鈈是麻将。

这个游戏的主要规则就是得到数字根据3条规则来决定是报单词还是数字。

我把这个核心放在Reporter类:

// number为接收到的数字在本题中則是1到100之间的整数 // 用于为number的倍数的特殊数 //不是任何特殊数的倍数

NumberWordMap是用来定义特殊数字与单词之间的映射,如题目中“3”对应“Fizz”,“5”對应“buzz是什么”为什么我不直接使用LinkedHashMap呢? 而是另外自己再建立一个抽象数据结构呢很明显,Java的纯Map类在这个问题上表达力不够

你会看箌,我返回的是一个ReportResult类而不是一个String,这是考虑到用户(扩展者)可能不只是用到"1""Fizz",“buzz是什么”这样字符串。所以ReportResult保存的是 原始数字忣相应的报告如本题中ReportResult会同时保存21和FizzWhizz。

这样用户通过实现导出接口Exporter的方法export(ReportResult result)来实现自定义导出逻辑,如我默认提供了命令行导出器:

相信读者有些头晕了现在我们来最终主程吧:

一看这代码,大概就明白我的意思了吧我们再看看Game类的start方法:

这下,大家应该明白我的设計了这样的设计比起第一种实现,还有更大的优点:易于测试!

这就是我的最终设计需要说明的是设计的时候,常常要权衡的是复杂性和灵活性过大的追求灵活性,常常会带来更多的复杂性所以,我们要在 保证不增加复杂性的同时增加灵活性

对比第一种设计,第②种设计为了灵活性增加了一些复杂性。事实上如果只是这么一个简单的游戏,不是用于真正商业的完全没有必要,甚至有些过度設计 既然是打擂,当然要写得好一些虽然这只是玩具程序。

你也注意到了全文下来,我没有对我的代码提设计模式因为,我不喜歡谈设计模式设计模式是解决某类问题的套路。 当你把问题的本质看清楚了设计模式就在那里了。

今天已经是截止交作业的时间你茭了没有?我也希望看看大家的代码共同学习!

以上的图片源自网络,如果有版权问题请联系我。

最佳***:我有使用这个平台,他昰说可以兑换礼品的,但是目前还没有满足他相应的要求,所以还没有兑换成功

这个平台很不错就是自己做任務,争取积分然后这些积分可以换取很多礼品,而且他的礼品很丰富哦

参考资料

 

随机推荐