昨日、Rubyのプログラムを書いていて、次のようなコードを書いた。
numbers = [1, 2, 4, 8]
n_divisors = Array.new(numbers.size, -1)
for i in 0...numbers.size
for j in 0...numbers.size
n_divisors[i] += 1 if numbers[i] % numbers[j] == 0
end
end
※html上でインデントさせるために全角スペースを入力しています。そのため、このままコピーして実行してもエラーが出ると思います。
プログラムの内容としては、配列に納められた「1, 2, 4, 8」のそれぞれについて、自分以外の3要素のうち自分の約数であるものの数を数え、n_divisorsという別の配列に納めている。
で、後半の2重ループの部分が「如何にも『手続き型プログラミング』」のように思ったので、次のように書き換えてみた。何となく「オブジェクト指向」風に!
0.upto(numbers.size - 1){|i|
0.upto(numbers.size - 1){|j|
n_divisors[i] += 1 if numbers[i] % numbers[j] == 0
}
}
しかしこれでは逆に「numbers」という配列の要素のそれぞれについて1つずつ処理しているというニュアンスが感じられなくなったように思ったので、更に書き換えた。
numbers.each_with_index{|number, i|
0.upto(numbers.size - 1){|j|
n_divisors[i] += 1 if number % numbers[j] == 0
}
}
それで最終的にこういう形になったのだが…。
最初のが一番分かり易い(笑)。僕にとっては、最初に書いた「如何にも『手続き型プログラミング』」のコードが一番わかり易いのである。
やはり僕は根っからの「非『オブジェクト指向』プログラマ」なんだと思う。頭の中がそうなっている。

0