2014-09-03 2 views
-2

나는 이것을 작성하는 더 좋은 방법이 있어야한다는 것을 알고있다. 가능한 경우 if/else를 사용하지 않거나 적어도 잘라내려고하지만 Ruby의 멍청한 마음으로 일부 리팩토링 도움이 많이 감사 할 것입니다.Refactor if/else 문 - 루비

several ways을있다

def super_fizzbuzz(array) 

array.map {|x| 
    if x % 15 == 0 
     "FizzBuzz" 
    elsif x % 3 == 0 
     "Fizz" 
    elsif x % 5 == 0 
     "Buzz" 
    else x 
    end} 

end 
+1

면접을하셨습니까? –

+0

@DaveNewton - 아니, 집에서 도전하고 있습니다. –

+3

codereview.stackexchange.com에서 이런 종류의 질문을해야합니다. 이것을보십시오 : http://codereview.stackexchange.com/questions/56927/fizzbuzz-in-ruby – Curley

답변

1

[스포일러는이 고전적인 문제를 수행하는 ... 당신이 선호하는 경우이 방법은 더 IFS를/elses의

(1..100).each do |x| 
m3 = x.modulo(3) == 0 
m5 = x.modulo(5) == 0 
puts case 
    when (m3 and m5) then 'FizzBuzz' 
    when m3 then 'Fizz' 
    when m5 then 'Buzz' 
    else x 
end 
end 

OR을이없는 경우 문 작은 코드 블록, 이것은 당신이 가지고있는 것의 좋은 리펙토링이다.

(1..100).each{|i| 
    x = '' 
    x += 'Fizz' if i%3==0 
    x += 'Buzz' if i%5==0 
    puts(x.empty? ? i : x); 
} 
3

나는 이렇게 할 것이다 :

def super_fizzbuzz(array) 
    array.map do |x| 
    case 
    when x % 15 == 0 then 'FizzBuzz' 
    when x % 3 == 0 then 'Fizz' 
    when x % 5 == 0 then 'Buzz' 
    else x 
    end 
    end 
end 
1

나는

array.map do |x| 
    [FizzBuzz, Fizz, Default].map do |fizzer| 
    fizzer.new(x).get 
    end.compact.first 
end 

class FizzBuzz 
    attr_reader :x 
    private :x 

    def initialize(x) 
    @x = x 
    end 

    def get 
    'FizzBuzz' if x % 15 
    end 
end 

class Fizz 
    attr_reader :x 
    private :x 

    def initialize(x) 
    @x = x 
    end 

    def get 
    'FizzBuzz' if x % 3 
    end 
end 

Default = Struct(:get) 

...

처럼 당신이 responsabilities을 분할하고 단 한 가지에 대한 책임을 각 클래스있을 것이다 그런 식으로 뭔가를 할 것입니다.