C#中級

中級 C#で学ぶドメイン駆動設計|練習問題編

導入

ドメイン駆動設計(DDD)は、ビジネスの複雑さを管理するための強力なアプローチです。特に中級のC#プログラマーにとって、実際の業務において直面する課題を解決するための手法を理解することは重要です。本記事では、特定のビジネスシナリオに基づいたドメイン駆動設計の実践を通じて、設計の考え方や落とし穴を探ります。

教科書レベルの解説(ドメイン駆動設計)

重要な概念の整理

ドメイン駆動設計では、ビジネスの本質を捉えたモデルを作成することが求められます。ここでの「ドメイン」とは、ビジネスが提供する価値やサービスの領域を指し、これを正確に理解することで、システム全体の設計が効果的になります。たとえば、eコマースサイトのドメインでは、商品、注文、顧客などが主要な要素となります。

コード例(C#)


public class Product
{
    public string Name { get; private set; }
    public decimal Price { get; private set; }

    public Product(string name, decimal price)
    {
        if (string.IsNullOrWhiteSpace(name)) throw new ArgumentException("Product name cannot be empty.");
        if (price <= 0) throw new ArgumentException("Price must be greater than zero.");
        Name = name;
        Price = price;
    }
}

public class Order
{
    private readonly List _products = new List();
    
    public void AddProduct(Product product)
    {
        if (product == null) throw new ArgumentNullException(nameof(product));
        _products.Add(product);
    }

    public decimal CalculateTotal()
    {
        return _products.Sum(product => product.Price);
    }
}

コードの行ごとの解説

  1. public class Product: 商品を表すクラスの定義。
  2. public string Name { get; private set; }: 商品名のプロパティ。外部からの直接変更を防ぐ。
  3. public decimal Price { get; private set; }: 価格のプロパティ。こちらも外部からの変更を禁止。
  4. public Product(string name, decimal price): コンストラクタで、商品名と価格を受け取り、バリデーションを行う。
  5. public class Order: 注文を表すクラスの定義。
  6. private readonly List _products = new List();: 注文に含まれる商品を管理するリスト。
  7. public void AddProduct(Product product): 商品を注文に追加するメソッド。商品がnullでないことを確認。
  8. public decimal CalculateTotal(): 注文の合計金額を計算するメソッド。

練習問題編

以下の練習問題を解いて、ドメイン駆動設計の理解を深めましょう。

  1. 問題1: 商品クラスに在庫数を追加し、在庫が足りない場合には商品を追加できないように変更してください。
  2. 問題2: 注文クラスに、特定の商品を削除するメソッドを追加してください。
  3. 問題3: 複数の商品の合計金額を計算する際、割引率を考慮した計算を行うメソッドを実装してください。

まとめ

  • ドメイン駆動設計は、ビジネスの要件を正確に反映したモデルを作成することが中心です。
  • 具体的なビジネスシナリオに基づいて設計を行うことで、実践的なスキルが身に付きます。
  • 練習問題を通じて、設計の改善点や落とし穴を意識することが重要です。