实战营第一战:FizzBuzz

用户头像
escray
关注
发布于: 2020 年 05 月 04 日
实战营第一战:FizzBuzz

2020-05-01



居然什么都没干。



虽然训练营从 5 月 6 日才正式开始,但是原本计划是五月份每天一个小时左右的学习时间,没想到,第一天就……



好吧,其实我还是去看了一下训练营的飞书群,领了一个红包,然后看到有 5、6 个同学都已经交作业了,焦虑



2020-05-02



顺着飞书群里面的留言,看了一篇 CSDN 上关于 TDD 的笔记,主要是介绍三角测量原理的,大意就是多个角度测量,以确保精确。具体到测试驱动开发,意思就是要写一些不同角度的单元测试,以保证测试的准确性。



其实很早之前就看过《测试驱动开发》那本书,而且敲过书中的代码,当时似乎看的是 C# 版本的。这次训练营期间,如果有机会,打算重读一下 Java 版本的。



然后通读了有关极限编程的文章 http://extremeprogramming.cn/,其实里面的大部分的概念,我都愿意接受,但是一直没有机会体验或者深入实践。如果有机会,希望能拿到采用极限编程的职位。



看到又有一名同学提交了作业,我今天一定要提交一次。



第一版的代码,丑陋的



public class FizzBuzz {
    public static  void  main(String[] args)
    {
        System.out.println("hello, world");
        for (int i = 1; i <= 100; i++) {
            if (i % 3 == 0) {
                if (i % 5 == 0) {
                    System.out.println("FizzBuzz");
                } else {
                    System.out.println("Fizz");
                }
            } else if( i % 5 == 0) {
                System.out.println("Buzz");
            } else {
                System.out.println(i);
            }
        }
    }
}



我能够在 10 分钟左右完成一段丑陋的代码,完成任务需求,但是写不出单元测试。估计很多程序员都能写这样的代码,但是熊节老师会说,“你这个程序,打算怎么给人用呢?”



我对于 IntelliJ IDEA 编辑器非常不熟悉,而且完全没有先写测试用例的思路,任重道远。



看了一遍熊节老师的 TDD 演示,我自己的问题一个是出在拆解任务上,另外就是在于对于编辑器不熟练。好在我还有时间,还可以练。



练了一下 typing.io,打算在这一个月内提高一下自己的打字速度,我现在的 WPM 在 45 左右。不知道练到多少,就可以达到职业水准,在实战营里有手速接近 70 的快手。



按照训练营的视频指导,完成了一个最简单 TDD 流程,这个例子似乎在 Kent Beck 的书上也有。



// CalculatorTest.javaimport org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class CalculatorTest {
  @Test
  public void should_add_two_numbers() {
    Calculator calculator = new Calculator();
    int result = calculator.add(1, 2);
    assertThat(result, is(3));
  }
}
// Calculator.java
public class Calculator {
    public int add(int x, int y) {
        return x + y;
    }
}



已经过了 12 点了,明天继续。



2020-05-03



看到群里面有人的 wpm 达到了 60,而我现在处于 50 上下的样子。



今天没有进行测试驱动开发的练习。



2020-05-04



在开始之前,用 typing.io 做了一下热身,已经可以将 wpm 提高到 50 以上了。



跟着 @熊节 老师的视频,完成了一次 FizzBuzz,视频大概是 14 分钟,而我这边加上熟悉编辑器和快捷键,第一次大概用了一个小时左右。



老师设定的目标是,在重复练习之后,把时间控制在 7 分钟以内。



自己写的第一遍,大概花了 25 分钟左右,中间出现了一些失误,比如先测试了被 3 整除,而不是普通数字;另外,有好几次搞错了测试用例,特别是在最后的那一步,当数字中包含 3 或 5 的时候。



小结一下,第一遍的问题主要是出现在一开始拆分任务的时候,没有想得特别清楚;也就导致了测试用例没有准备充分。但是如果把测试用例全都准备好,似乎又违背的测试驱动开发的本意。



再写一遍,大概还是控制在 20 分钟左右,这一次居然把 relateTo 里面的“或” || 写成了“并” &&。



// FizzBuzzTest.java
import org.junit.Test;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class FizzBuzz01Test {
    @Test
    public void should_return_raw_number_if_number_is_number() {
        checkFizzBuzz(1, "1");
        checkFizzBuzz(2, "2");
    }
    @Test
    public void should_return_fizz_if_number_is_divided_by_3() {
        checkFizzBuzz(3, "Fizz");
        checkFizzBuzz(33, "Fizz");
    }
    @Test
    public void should_return_buzz_if_number_is_divided_by_5() {
        checkFizzBuzz(5, "Buzz");
        checkFizzBuzz(55, "Buzz");
    }
    @Test
    public void should_return_fizzbuzz_if_number_is_divided_by_3_and_5() {
      checkFizzBuzz(15, "FizzBuzz");
      checkFizzBuzz(45, "FizzBuzz");
    }
    @Test
    public void should_return_fizzbuzz_if_number_is_contains_3_or_5() {
        checkFizzBuzz(13, "Fizz");
        checkFizzBuzz(52, "Buzz");
        checkFizzBuzz(51, "FizzBuzz");
    }
    private void checkFizzBuzz(int i, String s) {
        assertThat(new FizzBuzz01(i).toString(), is(s));
    }
}
// FizzBuzzTest.java
import static java.lang.String.valueOf;
public class FizzBuzz01 {
    private int rawNumber;
    public FizzBuzz01(int rawNumber) {
        this.rawNumber = rawNumber;
    }
    @Override
    public String toString() {
        if (isRelated(3) && isRelated(5)) {
            return "FizzBuzz";
        }
        if (isRelated(3)) {
            return "Fizz";
        }
        if (isRelated(5)) {
            return "Buzz";
        }
        return valueOf(rawNumber);
    }
    private boolean isRelated(int i) {
        return rawNumber % i == 0 || valueOf(rawNumber).contains(valueOf(i));
    }
}



IntelliJ IDEA 的确好用,应该可以算是生产力工具。之前在 Visual Studio 上用过 JetBrains 的 C# 插件,风格类似,有些快捷键也一样(从 Windows 转到了 MacOS)。



突然意识到目前的写法似乎有些问题。不应该使用构造函数来传递参数,可以使用一般的对象方法或者是静态方法。



今日常用 IntelliJ IDEA 快捷操作:



  • 最好用的是 Command + Shift + Enter 补全代码

  • Alt + Ctrl + R 运行程序(包括测试)

  • Command + Alt + N 内联代码

  • Command + Shift + T 打开测试代码(测试和源码互相切换)



发布于: 2020 年 05 月 04 日 阅读数: 51
用户头像

escray

关注

Let's Go 2017.11.19 加入

大龄程序员

评论

发布
暂无评论
实战营第一战:FizzBuzz