MENU

DRY原則について

DRY原則とは?プログラムを美しく保つための実践ガイド

ソフトウェア開発において「同じコードを繰り返し書いている」と感じることはないだろうか?
それはDRY(Don’t Repeat Yourself)原則に違反している可能性がある。

DRY原則とは、「コードの重複をなくし、一つの知識(情報)は一箇所にのみ存在するべき」という考え方だ。
この記事では、DRY原則のメリット、重複が生まれる原因、そしてC#を使った具体的なリファクタリングの方法を解説する。


目次

1. DRY原則とは?

DRY(Don’t Repeat Yourself)原則は、プログラムの重複を避け、メンテナンスしやすいコードを書くための指針である。
「同じロジックやデータを複数箇所に書かず、一つの場所にまとめるべき」という考え方に基づいている。

❌ DRY違反のコード(コードの重複例)

public double CalculateFinalPrice(double price)
{
    double tax = price * 0.1;
    double discount = price * 0.05;
    return price + tax - discount;
}

public double CalculateFinalPriceForPremium(double price)
{
    double tax = price * 0.1;
    double discount = price * 0.1; // プレミアムユーザーは割引が大きい
    return price + tax - discount;
}

問題点:

  • tax(税金計算)のロジックが繰り返し書かれている
  • discount の計算もほぼ同じで、値が異なるだけ

2. DRY違反のデメリット

DRY違反があると、以下のような問題が発生する。

❌ ① 修正コストが増える

  • 例えば、税率を 0.1 から 0.08 に変更する場合、すべての重複部分を修正する必要がある。
  • 修正漏れが発生し、バグにつながる可能性がある。

❌ ② 可読性が下がる

  • 同じコードが複数箇所にあると、「どの部分を修正すればいいのか?」が分かりにくくなる。
  • 変更が重なると、コードが煩雑になり、理解しにくくなる。

❌ ③ テストが複雑になる

  • 同じロジックが複数箇所に存在すると、すべてのパターンをテストする必要がある。
  • 一箇所にまとめれば、一度のテストで済むので、メンテナンスが楽になる。

3. DRY原則を守るためのリファクタリング方法

それでは、DRY原則を適用し、コードの重複を解消する方法を紹介する。

✅ 方法① 共通メソッドの抽出(Extract Method)

重複するロジックを一つのメソッドにまとめる。

public double CalculateTax(double price)
{
    return price * 0.1;
}

public double CalculateDiscount(double price, double rate)
{
    return price * rate;
}

public double CalculateFinalPrice(double price, double discountRate)
{
    double tax = CalculateTax(price);
    double discount = CalculateDiscount(price, discountRate);
    return price + tax - discount;
}

メリット:

  • 税計算割引計算を共通化し、変更があったときに一箇所だけ修正すれば済む

✅ 方法② クラスや構造体を活用する(Encapsulation)

共通の計算ロジックをクラスとしてまとめることで、より再利用しやすくなる。

public class PriceCalculator
{
    private const double TaxRate = 0.1;

    public static double CalculateTax(double price)
    {
        return price * TaxRate;
    }

    public static double CalculateDiscount(double price, double rate)
    {
        return price * rate;
    }

    public static double CalculateFinalPrice(double price, double discountRate)
    {
        double tax = CalculateTax(price);
        double discount = CalculateDiscount(price, discountRate);
        return price + tax - discount;
    }
}

メリット:

  • PriceCalculator クラスを作ることで、税計算や割引計算をどこでも再利用できる
  • ビジネスロジックをカプセル化することで、コードの見通しが良くなる。

4. DRY原則とYAGNI原則のバランス

DRY原則を適用する際は、「過剰な共通化」に注意する必要がある。
「将来使うかもしれないから」と不要な抽象化を行うと、逆に複雑で読みにくいコードになってしまうことがある。

そこで重要なのが、YAGNI(You Ain’t Gonna Need It)原則である。

  • 「今、必要なものだけ実装する」
  • 「将来使うかもしれない」は信じない

つまり、DRY原則を適用する際は、「本当に必要な共通化か?」 を意識することが重要だ。


5. まとめ

DRYのポイント内容
DRY原則とは?「同じロジックを複数回書かず、一箇所にまとめる」
DRY違反のデメリット修正コスト増、可読性低下、テストが複雑化
DRYを適用する方法メソッド抽出、クラス化、継承やインターフェース活用
過剰な共通化に注意必要以上に抽象化しすぎると逆効果(YAGNIを意識)

DRY原則を意識することで、メンテナンスしやすく、分かりやすいコードを作ることができる。
ただし、過剰な共通化を避け、バランスを取ることも重要である。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次