ちょっとした重複コード対策

一般的なプログラミングの世界では、DRY(Don't repeat yourself)の原則やらOAOO(Once and Only Once)の原則やらで言われているように、コードの重複は避けるべきという考え方が主流です。


例えば、変数「a」と変数「b」の内容を出力したいとしましょう。その場合、通常は


puts a
puts b
と書くと思います。


・・が、よく見てみると「puts」という部分が重複してしまっています。これはプログラムの保守という観点から見ると、あまりよいことではありません。理由としては
  • データ追加の際、本質的でない記述が増える
  • 仕様変更(例:puts→print)の際、修正箇所が増える
という点が考えられます。これらは、作業量の増加や修正忘れによるバグの発生などの温床となります。


どうすればよいかというと、次のように書きます。

[a, b].each do |x|
puts x
end
aとbを配列として扱い、ループさせて処理しています。この書き方は、重複は避けたいけど配列の変数を新たに作るまでもないという状況で重宝します。


また、このような使い方もできます。

["あ", "い"].each do |x|
puts x
end
これは、変数すら使わず、文字列を直接処理しています。

.
.

そうは言っても、「puts a; puts b」と「[a, b].each do |x| puts x end」では、明らかに後者のほうが記述量が増えていますし、可読性が落ちるうえに処理が遅くバグも発生しやすいでしょう。(※putsの場合「puts a, b」という書き方もできる。しかし引数が2つ以上のメソッド呼び出しの括弧を省略すると少し気持ち悪いので、「puts(a, b)」のほうがわかりやすいかも)


結局は時と場合によるということなので、まずはirbで試してみてはいかがでしょうか。