DRY 原則とは

DRY とは

アサヒ スーパードライ 500ml×6缶パック

原材料:麦芽、ホップ、米、コーン、スターチ アルコール度数: 5% 洗練されたクリアな味、辛口。さらりとした口当たり、シャープなのどごし。キレ味さえる、いわば辛口ビールです。

Amazonで詳細を見る

こっちじゃなくて、

「Don’t repeat yourself」 の略で、

同じコードを何度も書かない という意味です。

プロジェクトは変化、拡大するもの

これは当たり前のように見えて、案外難しいことです。

それは、プロジェクトは日々変化し、拡大するためです。

歴史が積み重なるに従って、 ほとんど同じだけど、ちょっとだけ違いがあるコードを が増えていきます。

忙しくて脳死で対処していると、そんな「あっちでも見た処理」があっという間に増えていってしまいます。

DRY 原則を意識し、同じコードは共通化するという、手間を掛けることで、コードベース全体が簡潔に保たれます。

コードで知る DRY

以下は重複がある Java コードです

 1public void hoge(Integer skillId) {
 2  Skill skill = SkillDao.selectOne(skillId);
 3  if (skill.getType() == ATTACK) {
 4    :
 5    :
 6  }
 7}
 8
 9public void fuga(Integer skillId) {
10  Skill skill = SkillDao.selectOne(skillId);
11
12  int effect = skill.getEffectValue();
13}

上記サンプルコード中の Skill.selectOne()は 「スキルテーブルを PK 指定で 1件 SELECT する」関数です。

この関数は ID に一致するデータが登録されていない場合、Null が返却されます。


このコードはとても悪い見本です。
運用フェーズで新しいデータを追加、検証する際にしばしば NullPointerException が発生し、テストが止まることがあります。

さらに、 どこでエラーが出ているかを確認し、例外の原因となった未登録の ID を調査しなくてはならない という手作業が発生していた、とてもコストが高かったのです。


上記のコードで Null チェックを追加し、エラーメッセージを適切に出力することでコストを下げましょう。

 1public void hoge(Integer skillId) {
 2  Skill skill = SkillDao.selectOne(skillId);
 3  if (skill == null) {
 4     logger("skill id not found");
 5     throw new Exception("");
 6  }
 7  if (skill.getType() == ATTACK) {
 8    :
 9    :
10  }
11}
12
13public void fuga(Integer skillId) {
14  Skill skill = SkillDao.selectOne(skillId);
15  if (skill == null) {
16     logger("skill id not found");
17     throw new Exception("");
18  }
19
20  int effect = skill.getEffectValue();
21}

このような対応はうまくありませんね。
それは、同じコードがいろいろな所に散らばっているからです。

SkillDao.selectOne() の返り値が null かどうかのチェックを呼び出し先で毎回行っています。

2 箇所なら良いですが、あるプロジェクトが成長し、 SkillDao.selectOne() を使うところが増えれば増えるほど、同じように null チェックを足さなければなりません。

この場合は「呼び出し先」ではなく「呼び出し元」で null チェックを行えば、コードの重複を排除できますね。


この例は雑ですが、似たようなことが実際にたくさん起こっています。

この例のように、修正箇所が連続していれば把握も容易ですが、

  • 1,000 行離れていたり
  • 別のクラスにあったり

すると、「それぞれに同じ処理」を案外書いてしまうものです。

IDE を駆使して対処したいものです。

そして、できるだけシンプルに、かつ美しいコードを書きたいですね !

オブジェクト指向でなぜつくるのか 第2版

平澤 章
出版社:日経BP  発売日:2011-04-07

Amazonで詳細を見る