FizzBuzz is a common and simple exercise in implementing the Strategy pattern. A brief synopsis of the Kata is as follows:
Print the numbers one through 100.Using Ruby, the algorithm for this is quite straight forward using conditionals:
If the number is divisible by 3, print FIZZ.
If the number is divisible by 5, print BUZZ.
If the number is divisible by both, print FIZZBUZZ.
(1..100).each do |i| if i%3==0 and i%5==0 puts "FIZZBUZZ" elsif i%3==0 puts "FIZZ" elsif i%5==0 puts "BUZZ" else puts i end end
The kata only becomes interesting when you add an additional requirement; don't use conditionals. And of course, test drive your implementation. You can see my implementation on GitHub. I implemented two classes for processing a digit: Fizz
and Buzz
. These processors responded to process
and processable?
and were injected into a FizzBuzzRunner
class along with the range. Additionally a default processor PassThrough
was injected to the runner, which would be applied if no other processor was applicable and shared the same interface as the other processors.
The runner would query applicable_processors
, asking each if the digit was processable?
. If no processor was applicable, it would use the default, PassThrough
. After collecting the applicable_processors
, the results_from
each processor were collected into an array. This allowed my final algorithm algorithm to read like well written prose.
class FizzBuzzRunner def initialize(range: range, processors: processors, default_processor: default_processor) @range = range @processors = processors @default_processor = default_processor end def as_string as_array.join(" ") end def as_array range.collect { |i| results_from(applicable_processors(i), i) } end end
No comments:
Post a Comment