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);
}
}
运行测试:
我们来让测试通过:
app\FizzBuzz.php
<?php
namespace App;
class FizzBuzz
{
public function execute($number)
{
return $number;
}
}
再次测试:
向前推进:
.
.
/** @test */
public function it_translate_2_for_fizzbuzz()
{
$this->assertEquals($this->fizzbuzz->execute(2),2);
}
}
运行测试:
测试通过,所以我们继续向前推进:
.
.
/** @test */
public function it_translate_3_for_fizzbuzz()
{
$this->assertEquals($this->fizzbuzz->execute(3),'fizz');
}
}
我们来让测试通过:
app\FizzBuzz.php
<?php
namespace App;
class FizzBuzz
{
public function execute($number)
{
if($number % 3 == 0) return 'fizz';
return $number;
}
}
再次测试:
继续向前推进:
.
.
/** @test */
public function it_translate_5_for_fizzbuzz()
{
$this->assertEquals($this->fizzbuzz->execute(5),'buzz');
}
}
运行测试:
我们来让测试通过:
<?php
namespace App;
class FizzBuzz
{
public function execute($number)
{
if($number % 5 == 0) return 'buzz';
if($number % 3 == 0) return 'fizz';
return $number;
}
}
运行测试:
向前推进:
.
.
/** @test */
public function it_translate_6_for_fizzbuzz()
{
$this->assertEquals($this->fizzbuzz->execute(6),'fizz');
}
}
运行测试:
测试通过,所以我们继续推进:
.
.
/** @test */
public function it_translate_10_for_fizzbuzz()
{
$this->assertEquals($this->fizzbuzz->execute(10),'buzz');
}
}
运行测试:
继续推进:
.
.
/** @test */
public function it_translate_15_for_fizzbuzz()
{
$this->assertEquals($this->fizzbuzz->execute(15),'fizzbuzz');
}
}
运行测试:
我们来让测试通过:
<?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;
}
}
运行测试:
现在我们的三条规则已经测试完毕,为了保险起见,我们可以多做几个随机测试:
.
.
/** @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');
}
}
运行测试:
现在我们只用添加一个方法,将转换后的结果组合起来即可:
.
.
/** @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;
}
}
运行测试: