Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby de FizzBuzz

ohto
March 07, 2018

Ruby de FizzBuzz

Introduction to test driven development.
This presentation is based on
https://qiita.com/ohto/items/281d127a7938121556c0

ohto

March 07, 2018
Tweet

More Decks by ohto

Other Decks in Programming

Transcript

  1. 開発対象 -FizzBuzz 例 1. 1 2. 2 3. Fizz 4.

    4 5. Buzz 6. Fizz 7. 7 8. 8 9. Fizz 10. FizzBuzz 15 / 28
  2. 開発 -テスト テスト作成 – 1 から 100 までの期待する答えを作成 spec/fizz_buzz.answer とする

    – テストコード(rspec) を作成 – rspec spec でテスト実行 19 / 28
  3. 開発 -テスト require_relative '../fizz_buzz.rb' describe :FizzBuzz do before :all do

    dir = File.expand_path(File.dirname(__FILE__)) @_read = ->(fn){ File.open(fn).map{ |r| r.chomp }} @answer = @_read[File.join(dir, 'fizz_buzz.answer')] end it 'should be eauql to anser' do fn = 'fizz_buzz.result' fizzbuzz(100, fn) expect(@_read[fn]).to match_array @answer end end 20 / 28
  4. 開発 -実装(初回: 文字列結合) def fizzbuzz(n, fn) File.open(fn,'w') do |f| 1.upto(n)

    do |i| out = '' i % 3 == 0 and out << 'Fizz' i % 5 == 0 and out << 'Buzz' f.puts out.empty?? i : out end end end 文字列を結合 22 / 28
  5. 開発 -実装(場合分け) def fizzbuzz(n, fn) File.open(fn,'w') do |f| 1.upto(n) do

    |i| f.puts case when i % 15 == 0 then 'FizzBuzz' when i % 3 == 0 then 'Fizz' when i % 5 == 0 then 'Buzz' else i end end end end 文字列演算が重いので、 場合分けに変更 23 / 28
  6. 開発 -実装(ハッシュを使う) class FizzBuzz CONDITION = { 0 => 'FizzBuzz'

    } { 3 => 'Fizz', 5 => 'Buzz', }.each do |no, key| no.step(14,no){ |i| CONDITION[i] = key } end def fizzbuzz(n, fn) FizzBuzz.fizzbuzz(n, fn) end class << self public def fizzbuzz(n, fn) File.open(fn,'w') do |f| 1.upto(n) do |i| f.puts CONDITION[i % 15] || i end end end end end 24 / 28
  7. 開発 -評価(実行速度の計測) require 'benchmark' n = 10000000 fn = 'fizzbuzz.out'

    Benchmark.bm do |r| r.report('no 1'){ fizzbuzz1(n, fn) }; File.delete(fn) r.report('no 2'){ fizzbuzz2(n, fn) }; File.delete(fn) r.report('no 3'){ FizzBuzz.fizzbuzz(n, fn) }; File.delete(fn) end 25 / 28
  8. 開発 -評価(実行速度の計測: 結果) user system total real no 1 5.810000

    0.160000 5.970000 ( 6.045857) no 2 5.120000 0.150000 5.270000 ( 5.311798) no 3 4.850000 0.130000 4.980000 ( 4.990330) ハッシュ版が一番速かった!! 26 / 28