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