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

Ruby de FizzBuzz

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for ohto ohto
March 07, 2018

Ruby de FizzBuzz

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

Avatar for ohto

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