DRY (Don't Repeat Yourself)
ひとつのことを一ヶ所のみで記述し、冗長性を除去する。
ライブラリの API でも、同じことを何度も指定させる冗長性が発生することがある。 そのような API には改善の余地がある。
手間の節約
- プログラムを変更する時に、同じ変更を何回も行わなくて済む
思考の節約
- 複数の記述が整合性を持っているか考慮しなくて済む
例
Ruby の setrlimit
Ruby 1.8 において、C の setrlimit 関数を用いて core を生成しないように制限するには以下の記述が必要であった。 この記述では、process が 2回、rlimit が 2回出てきており冗長である。
Ruby 1.8:
Process.setrlimit(Process::RLIMIT_CORE, 0)
この冗長性は C における定数の RLIMIT_CORE が、C のマクロの名前空間がグローバルであることから RLIMIT_ というプリフィクスが必要であること、また、 Ruby において C の定数を関係するモジュール・クラスの下に整理するという都合から発生している。
プログラマが、core を防ぐために、core の最大値を 0 に制限したいという意図を持っているとき、 Process::RLIMIT_ というプリフィクスが必要であることを思い出すためには、C や Ruby の都合を思い出さなければならない。 つまり異なるレイヤに移らなければならない。
Ruby 1.9 では、以下のように冗長性を排した記述が可能になった。
Ruby 1.9:
Process.setrlimit(:CORE, 0)
注意点
冗長性を除去すると間違いを検出できなくなる。 ひとつのことを2回書いてあれば、それらの矛盾を間違いとして検出できる。 しかし、1回しか書いていなければ検出できない。
冗長性の除去と間違いの検出の利点をある程度両方得る折衷案としては、 ある記述に対し、その一部を抽象化した記述を別に行うことが考えられる。 たとえば、変数の型宣言は、(自動的な型変換を考えなければ) その変数への個々の代入を抽象化し、 代入であり得る値の集合を記述したものとみなせる。 正しいプログラムであれば型宣言はなくても動くが、 型宣言があることにより間違ったプログラムを検出することが出来る。