优秀的程序员要学会少敲代码,多思考!

日期:2020-05-07编辑作者:Web前端

时间: 2019-09-06阅读: 113标签: 代码

TDD

如果只把一个字符一个字符地敲代码叫做 Coding,未免悲哀了一点。优秀的项目,编码阶段实际敲代码的时间不会很长;优秀的程序员,大部分时间都用来思考了。这个时候,你就需要学会代码评审,什么?你说不知道什么是代码评审?没关系,往下看

TDD是个好东西,推广时,需从Why/what/how来说服别人,结合最近看的一些资料,来说明一下问题:

我来说说代码评审其它鲜为人知的好处:

1、单元测试的理由


《[高效程序员的45个习惯:敏捷开发修炼之道》中已经对于单元测试好处做了一些说明:

- 单元测试能及时提供反馈。你的代码会重复得到锻炼。若修改或者重构,作为防护网会检查是否破外了已有功能。快速得到反馈,并容易修复他。他是重构的基础。

- 单元测试让你的代码更健壮。测试帮助你全面的思考代码的行为,帮你联系正面,反面以及异常情况。

- 单元测试是有用的设计工具。有助于简单设计,注重实效。

- 单元测试是让你自信的后台。你测试代码,了解不同条件下的行为,面对压力找到自信。

- 单元测试解决问题的探测器www.129028.com金沙,。提供发现问题和解决问题的方法。

- 单元测试是可信的文档。 学API时,可以帮你提供精准和可靠的文档。是程序员之间的语言。

- 单元测试学习工具。帮你了解API行为。

增加阅历,学习别人代码的可贵之处

2、TDD的风格


参考文章《TDD 真的能带来好设计么?》(原文:http://codurance.com/2015/05/12/does-tdd-lead-to-good-design/)中介绍TDD有两种主要的风格,它们在何时进行设计有着相当显著的区别。

和英语学习是一个道理, 如果只听一种纯正口音的英语,英文反而不容易学好 ,我们需要阅读各种营养的代码,广泛阅读能帮助开阔眼界,积累一些好的设计思路,甚至提高阅读恶心代码的免疫能力。

2.1 古典派

古典派是由Kent Beck开创的原本风格,也被称为底特律式TDD

对工程和业务逻辑的熟悉

2.1.1 主要特点

- 设计在重构阶段发生。

- 一般来说测试是基于状态的测试。

- 在重构阶段,由测试驱动的单元可能会分化为多个类。

- 极少使用Mock技术,除非是要与现存系统隔离。

- 在编码前不进行设计方面的思索。设计完全是从代码中浮现出来的。

- 是避免过度设计的极佳方法。

- 基于状态的测试以及无前置设计,使得这种风格更容易理解和采用。

- 常常结合简单设计四规则一起使用。

- 当我们知道输入和期望的输出,但是不清楚实现可能是什么样的时候,很适合使用这种方式进行探索。

- 在我们无法借助行业专家和行业语言(比如数据转换,算法等)的情况下很有帮助。

和盲目地走读代码不同,代码评审之前起码是对大致的业务和实现有一定了解,是带着问题去看代码的,更容易帮助自己理清代码实现,熟悉业务逻辑。

2.1.2 问题

- 单纯为了测试暴露状态。

- 相比由外而内风格,重构阶段通常更大。后面会详细介绍由外而内风格。

- 当新的类在重构阶段浮现出类时,被测的单元就会超出一个类。如果我们单单看那个测试的话,这没什么问题,然而,当新的类浮现出来后,它就有了自己的生命。它会被程序的其他部分复用。当这个类演化时,可能会破坏其它不相关的测试,因为那些测试使用了它们实际的实现而不是mock对象。

- 经验不足的练习者往往会跳过重构,也就是设计改进的阶段,导致开发进程变为 红灯—绿灯—红灯—绿灯—...—红灯—绿灯—大重构。

- 由于探索式的特点,测试驱动下的类产生于“我想我们需要一个有这样接口的类”。可能无法和系统的其它部分很好地对接。

- 有可能会缓慢费事。我们常常一开始已经知道被测的类不应该有这么多的职责,古典派的建议是等待重构阶段,只在确实有必要时才抽出其它类。对于初学者来说这可能是个好建议,对更有经验的程序员纯粹是浪费时间。

大声地鼓励,宽容地讨论,知识共享,给团队一个互相学习进步的氛围

2.2 由外而内

由外而内TDD,也被称作伦敦派或者mock式,是由一些XP实践先驱接受和发展出的风格。随后它启发产生了BDD。

代码评审不是挑错,看到优秀的代码,要说出来,让大家都看得到,这是那些优秀代码的创造者们应得的奖励。团队中的其他人听到了表扬,阅读了代码,从身边最实际的例子当中收获了成长。评审过程中,提出的问题未必最终被接受,但是在问题确认的辩驳、争论过程中,很容易见到思维的火花,所谓“道理越辩越明”,一个团队需要有这样充满生气的讨论。

2.2.1 主要特点

- 不同于经典派,由外及内TDD为我们如何着手测试驱动代码做出了规定:从外(接到外部输入的第一个类)到内(各个将会实现系统需要的一个单一特性的类)。

- 一般从一个验收测试开始,验收测试用来检验是否整个功能工作。验收测试也为实现进行了向导。

-验收测试的失败会告知我们功能还有某些部分没有实现的信息(数据没有返回,消息没有送入队列,数据没有存人数据库等等),从中我们可以开始进行单元测试。第一个被测的类负责接收外部的请求(比如一个控制器,队列监听器,事件接收器,组件入口等)。

- 鉴于我们知道我们不会在一个类里实现整个程序,我们会假定被测试类会需要一些合作类。然后我们在测试里验证被测类与其合作类之间的协作。

- 通过被测类需要调用合作类公开方法来完成的各种事,可以识别出合作类。合作类的名字和方法名应该来自于行业语言中的名词和动词。

- 当一个类被完全测试后,我们选取一个合作类(此时应该还没有进行实现),并采用与上一个类相同的方式,通过测试驱动它的行为。这就是我们叫它由外而内的原因:我们从靠近系统输入的地方(外部)通过不断识别合作类,逐步向程序内部推进。

- 设计起始于红灯阶段,也就是开始写测试时。

- 测试测的是行为和协作,而非状态。

- 在重构阶段对设计进行完善。

- 每个合作类以及它的公开方法都是为了给已有的客户类提供服务的,这使得代码可读性很高。

- 相比经典式方法,由外而内式的重构阶段要小得多。

- 提高了封装性,因为不需要仅仅为了测试而暴露状态。

- 更符合“tell, don't ask”设计方法。

- 更符合面向对象编程的原本理念:测试是关于对象间发送的消息,而非检测对象的状态。

- 适用于商业应用,从user story和验收条件中可以获得名词和动词。(作为类名和方法名)。

及时识别出代码设计的缺陷,找到需要重构的地方

2.2.2 问题

- 对于初学者来说很难接受,因为需要更高层次的设计能力。

- 开发者从代码中无法得到反馈来创建合作类。他们需要通过写测试来使合作类显现出来。

- 不成熟的创建合作类有可能导致过度设计。

- 不适用于探索式的工作,以及不特定于user story的行为(数据转换,算法等)。

- 设计能力糟糕的话可能会导致mock对象爆炸式的激增。

- 基于行为的测试要比基于状态的测试难写。

- 在写测试的时候需要具备DDD(领域驱动设计)以及其他设计技能,包括简单设计四规则。

本文由www.129028.com金沙发布于Web前端,转载请注明出处:优秀的程序员要学会少敲代码,多思考!

关键词:

nginx负载均衡如何实现www.129028.com金沙?

什么是nginx? Nginx是一个免费的,开源的,高性能的服务器和反向代理服务器软件,同时它也可以为IMAP和POP3服务器代...

详细>>

最少编码原则

这的确是大多数程序员,甚至是那些高级程序员都很容易混淆的一个重点。作为一名程序员,编写代码无疑是你职业...

详细>>

CSS中cursor 鼠标指针光标样式

值 前面url()是自定义鼠标的样式,图像的地址,后面的参数是 css 标准的 cursor样式,(IE下面可以不需要) 出现版本...

详细>>

AJAX:如何处理书签和后退按钮(1)

或者如果你不喜欢onclick: window.onload = initialize;function initialize() { // initialize the DHTML History // framework dhtmlHistory.initial...

详细>>