6.FizzBuzz

未匹配的标注
  • 本系列文章为laracasts.com 的系列视频教程——Code Katas in PHP 的学习笔记。若喜欢该系列视频,可去该网站订阅后下载该系列视频,支持正版
  • Kata 是一个简短,可重复的编程挑战,可以帮助我们进行快速地编程练习。
  • 开发模型仍旧是 TDD(测试驱动开发),视频中使用的是 phpspec 进行开发,笔记中使用了 Laravel 应用,因此代码有不同。

本节说明

  • 对应第 6 小节:FizzBuzz

本节内容

这一节我们的练习是 FizzBuzz 游戏。首先我们简单了解下规则:写一个程序按自然数的顺序打印数字,但是在遇到 3 的倍数时用“fizz”替代数字,5 的倍数用“buzz”代替,既是 3 的倍数又是 5 的倍数打印“fizzbuzz”。我们来开始练习:

$ php artisan make:test FizzBuzzTest --unit

添加第一个测试:

<?php

namespace Tests\Unit;

use Tests\TestCase;
use App\FizzBuzz;

class FizzBuzzTest extends TestCase
{
    public function setUp()
    {
        parent::setUp();
        $this->fizzbuzz = new FizzBuzz();
    }

    /** @test */
    public function it_translate_1_for_fizzbuzz()
    {
        $this->assertEquals($this->fizzbuzz->execute(1),1);
    }
}

运行测试:
file
我们来让测试通过:
app\FizzBuzz.php

<?php

namespace App;

class FizzBuzz 
{
    public function execute($number)
    {
        return $number;
    }
}

再次测试:
file
向前推进:

    .
    .
    /** @test */
    public function it_translate_2_for_fizzbuzz()
    {
        $this->assertEquals($this->fizzbuzz->execute(2),2);
    }
}

运行测试:
file
测试通过,所以我们继续向前推进:

    .
    .
    /** @test */
    public function it_translate_3_for_fizzbuzz()
    {
        $this->assertEquals($this->fizzbuzz->execute(3),'fizz');
    }
}

file
我们来让测试通过:
app\FizzBuzz.php

<?php

namespace App;

class FizzBuzz 
{
    public function execute($number)
    {
        if($number % 3 == 0) return 'fizz';

        return $number;
    }
}

再次测试:
file
继续向前推进:

    .
    .
    /** @test */
    public function it_translate_5_for_fizzbuzz()
    {
        $this->assertEquals($this->fizzbuzz->execute(5),'buzz');
    }
}

运行测试:
file
我们来让测试通过:

<?php

namespace App;

class FizzBuzz 
{
    public function execute($number)
    {
        if($number % 5 == 0) return 'buzz';

        if($number % 3 == 0) return 'fizz';

        return $number;
    }
}

运行测试:
file
向前推进:

    .
    .
    /** @test */
    public function it_translate_6_for_fizzbuzz()
    {
        $this->assertEquals($this->fizzbuzz->execute(6),'fizz');
    }
}

运行测试:
file
测试通过,所以我们继续推进:

    .
    .
    /** @test */
    public function it_translate_10_for_fizzbuzz()
    {
        $this->assertEquals($this->fizzbuzz->execute(10),'buzz');
    }
}

运行测试:
file
继续推进:

    .
    .
    /** @test */
    public function it_translate_15_for_fizzbuzz()
    {
        $this->assertEquals($this->fizzbuzz->execute(15),'fizzbuzz');
    }
}

运行测试:
file
我们来让测试通过:

<?php

namespace App;

class FizzBuzz 
{
    public function execute($number)
    {
        if($number % 15 == 0) return 'fizzbuzz';

        if($number % 5 == 0) return 'buzz';

        if($number % 3 == 0) return 'fizz';

        return $number;
    }
}

运行测试:
file
现在我们的三条规则已经测试完毕,为了保险起见,我们可以多做几个随机测试:

    .
    .
    /** @test */
    public function it_translate_123_for_fizzbuzz()
    {
        $this->assertEquals($this->fizzbuzz->execute(123),'fizz');
    }

    /** @test */
    public function it_translate_150_for_fizzbuzz()
    {
        $this->assertEquals($this->fizzbuzz->execute(150),'fizzbuzz');
    }
}

运行测试:
file
现在我们只用添加一个方法,将转换后的结果组合起来即可:

    .
    .
    /** @test */
    public function it_translate_a_sequence_of_number_for_fizzbuzz()
    {
        $this->assertEquals(
            $this->fizzbuzz->executeUpTo(10),
            [1,2,'fizz',4,'buzz','fizz',7,8,'fizz','buzz']
        );
    }
}

代码实现很简单:

    .
    .
    public function executeUpTo($number)
    {
        $output = [];

        foreach (range(1,$number) as $i)
        {
            $output[] = $this->execute($i);
        }

        return $output;
    }
}

运行测试:
file

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~