C#上級

上級 C#で学ぶオブジェクト指向設計|ケーススタディ編

導入

ある企業が新しいプロジェクトとして、オンライン書籍販売システムを開発することになりました。このシステムでは、書籍の管理、ユーザーアカウントの管理、購入履歴の追跡など、多くの機能が求められます。プロジェクトの初期段階で、オブジェクト指向設計を適用することで、将来的なメンテナンス性や拡張性を考慮したアーキテクチャを構築する必要があります。

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

重要な概念の整理

オブジェクト指向設計の基本的な概念には、カプセル化、継承、ポリモーフィズムが含まれます。これらの概念を適切に利用することで、コードの再利用性や可読性を向上させることが可能です。また、デザインパターンを取り入れることで、より洗練された設計が実現できます。例えば、ファクトリーパターンを用いることで、オブジェクトの生成ロジックを集中管理し、将来的な変更を容易にすることができます。

コード例(C#)


public abstract class Book
{
    public string Title { get; set; }
    public string Author { get; set; }

    public abstract void DisplayInfo();
}

public class EBook : Book
{
    public string FileFormat { get; set; }

    public override void DisplayInfo()
    {
        Console.WriteLine($"E-Book: {Title} by {Author}, Format: {FileFormat}");
    }
}

public class PrintedBook : Book
{
    public int PageCount { get; set; }

    public override void DisplayInfo()
    {
        Console.WriteLine($"Printed Book: {Title} by {Author}, Pages: {PageCount}");
    }
}

public class BookFactory
{
    public static Book CreateBook(string type, string title, string author, string additionalInfo)
    {
        return type switch
        {
            "EBook" => new EBook { Title = title, Author = author, FileFormat = additionalInfo },
            "PrintedBook" => new PrintedBook { Title = title, Author = author, PageCount = int.Parse(additionalInfo) },
            _ => throw new ArgumentException("Invalid book type")
        };
    }
}

コードの行ごとの解説

  1. Bookクラスは書籍の基本情報を持つ抽象クラスで、DisplayInfoメソッドを定義しています。
  2. EBookクラスはBookクラスを継承し、電子書籍特有の情報(ファイル形式)を持ち、DisplayInfoをオーバーライドして情報を表示します。
  3. PrintedBookクラスも同様に、印刷された書籍特有の情報(ページ数)を持ち、DisplayInfoをオーバーライドします。
  4. BookFactoryクラスでは、書籍の種類に応じて適切なオブジェクトを生成するための静的メソッドを提供します。

ケーススタディ編

オンライン書籍販売システムの開発において、オブジェクト指向設計を適用した結果、開発チームは以下のような利点を享受しました。まず、書籍の種類が増えた際に、新しいクラスを追加するだけで対応可能となり、既存のコードに影響を与えずに機能を拡張できます。しかし、注意が必要な点として、クラスの責任が増えすぎないようにすることが挙げられます。例えば、Bookクラスが過度に多くの機能を持つと、メンテナンスが難しくなります。これを避けるために、責任を明確に分けることが重要です。

まとめ

  • オブジェクト指向設計を適用することで、将来的な拡張性を考慮したアーキテクチャが実現できる。
  • ファクトリーパターンを用いることで、オブジェクト生成のロジックを集中管理し、コードの可読性を向上させる。
  • クラスの責任を明確に分けることで、メンテナンス性を高めることができる。