C#上級

上級 C#で学ぶオブジェクト指向設計|練習問題編

導入

オブジェクト指向設計は、ソフトウェア開発において非常に重要な役割を果たしています。特にC#のようなオブジェクト指向言語では、設計パターンや原則を適切に適用することが、コードの保守性や再利用性を高める鍵となります。今回は、現場でよく遭遇する「ユーザー管理システム」を題材に、具体的なシチュエーションを通じてオブジェクト指向設計の重要性を理解します。

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

重要な概念の整理

ユーザー管理システムでは、ユーザーの情報を管理するために、クラスやオブジェクトを使って設計を行います。主に以下の概念が重要です。

  • カプセル化: ユーザーの属性をクラス内に隠蔽し、外部からの直接アクセスを制限します。
  • 継承: 基本的なユーザー情報を持つクラスから、管理者や一般ユーザーといった特定のユーザータイプを派生させることで、コードの重複を避けます。
  • ポリモーフィズム: 同じメソッド名で異なる動作を実現することで、柔軟な設計を可能にします。

コード例(C#)


public abstract class User
{
    public string Username { get; set; }
    public string Email { get; set; }

    public abstract void DisplayInfo();
}

public class AdminUser : User
{
    public override void DisplayInfo()
    {
        Console.WriteLine($"Admin: {Username}, Email: {Email}");
    }
}

public class RegularUser : User
{
    public override void DisplayInfo()
    {
        Console.WriteLine($"User: {Username}, Email: {Email}");
    }
}

public class UserManager
{
    private List users = new List();

    public void AddUser(User user)
    {
        users.Add(user);
    }

    public void ShowUsers()
    {
        foreach (var user in users)
        {
            user.DisplayInfo();
        }
    }
}

コードの行ごとの解説

  1. クラスUserは、ユーザーに関する基本的な情報を持つ抽象クラスです。
  2. プロパティUsernameEmailは、ユーザーの基本情報を格納します。
  3. メソッドDisplayInfoは、ユーザー情報を表示するための抽象メソッドです。
  4. AdminUserクラスは、Userクラスを継承し、管理者用の表示方法を実装します。
  5. RegularUserクラスも同様に、一般ユーザー用の表示方法を実装します。
  6. UserManagerクラスは、ユーザーを管理するための機能を提供します。
  7. AddUserメソッドは、ユーザーをリストに追加します。
  8. ShowUsersメソッドは、全ユーザーの情報を表示します。

練習問題編

以下の練習問題に取り組んでみてください。各問題に対する解説も用意しています。

  1. 問題1: 上記のコードに新たに「ゲストユーザー」クラスを追加し、DisplayInfoメソッドを実装してください。
  2. 問題2: ユーザーを削除するRemoveUserメソッドをUserManagerクラスに追加してください。
  3. 問題3: ユーザーのメールアドレスを更新するUpdateEmailメソッドを実装してください。

模範解答と解説

問題1の解答:


public class GuestUser : User
{
    public override void DisplayInfo()
    {
        Console.WriteLine($"Guest: {Username}");
    }
}

ゲストユーザーはメールアドレスを持たないため、DisplayInfoメソッドではUsernameのみを表示します。

問題2の解答:


public void RemoveUser(User user)
{
    users.Remove(user);
}

リストから指定されたユーザーを削除します。

問題3の解答:


public void UpdateEmail(User user, string newEmail)
{
    user.Email = newEmail;
}

指定されたユーザーのメールアドレスを更新します。

まとめ

  • オブジェクト指向設計の原則を実務に応用することで、コードの可読性と保守性が向上します。
  • 具体的なシチュエーションを通じて、設計の落とし穴や改善ポイントを考慮することが重要です。
  • 練習問題を通じて、実際の業務に役立つスキルを磨くことができます。