C#中級

中級 C#で学ぶオブジェクト指向設計|アンチパターン編

導入

オブジェクト指向設計は、プログラムの複雑性を管理するための強力な手法ですが、誤った実装や設計がもたらす問題も少なくありません。特に中級者にとっては、理論を実践に落とし込む際に陥りやすい「アンチパターン」が存在します。本記事では、C#を用いた具体的なシチュエーションを通じて、よくある失敗例とその改善策を探ります。

教科書レベルの解説(オブジェクト指向設計)

重要な概念の整理

オブジェクト指向設計においては、カプセル化、継承、ポリモーフィズムといった基本概念が重要です。これらの概念を正しく適用することで、コードの再利用性や可読性が向上します。しかし、これらを誤用すると、逆にコードが難解になり、メンテナンスが困難になることがあります。

コード例(C#)


public class User {
    public string Name { get; set; }
    public string Email { get; set; }

    public void Notify(string message) {
        // メール通知のロジック
    }
}

public class Admin : User {
    public void DeleteUser(User user) {
        // ユーザー削除のロジック
    }
}

コードの行ごとの解説

  1. public class User { – ユーザークラスの定義。
  2. public string Name { get; set; } – ユーザー名のプロパティ。
  3. public void Notify(string message) { – 通知メソッドの定義。
  4. public class Admin : User { – Userクラスを継承したAdminクラス。
  5. public void DeleteUser(User user) { – ユーザー削除メソッドの定義。

アンチパターン編

上記のコードは一見シンプルに見えますが、いくつかの問題点を抱えています。まず、NotifyメソッドがUserクラスに定義されているため、全てのユーザーが通知機能を持つことになります。この設計は、特定のユーザータイプ(例えば、管理者)にのみ必要な機能を持たせるという観点から見ると、過剰な責任を与えています。このような設計は「責任の分散」が不十分な状態を示しています。

改善策としては、通知機能を別のクラスに分離し、必要なユーザーにのみそのクラスを利用させる方法が考えられます。これにより、各クラスが持つべき責任が明確になり、可読性や保守性が向上します。

まとめ

  • オブジェクト指向設計では、各クラスが持つべき責任を明確にすることが重要。
  • 不要な機能を持つクラスは、メンテナンスや拡張を困難にする。
  • 責任の分散を意識し、関連する機能を適切なクラスに分けることで、より良い設計が実現できる。