基礎から学ぶC#入門 90日コース | クラス・インスタンス・設計 - Day 40:第4章総合演習

Web APP 90日で身につけるC#
スポンサーリンク
スポンサーリンク

Day 40 のゴールと全体像

Day 40 は 第4章の総合演習。 ここまで学んできた「クラス」「インスタンス」「カプセル化」「static」「複数クラスの連携」をすべて使って、 商品管理アプリを作るミニプロジェクトに挑戦します。

機能は次の 5 つです。

  • 商品登録
  • 商品一覧
  • 商品検索
  • 商品削除
  • 在庫変更

雑誌記事を読むような気持ちで、 「どうやって複数クラスを連携させてアプリを作るか」を ステップバイステップで整理していきます。

アプリ全体の構造をまずイメージする

Day 39 で学んだ役割分担を使います。

  • Program:アプリの入口。流れを決める。
  • Service:商品に関する処理をまとめる。
  • Model:商品データの形を表す。

この 3 層構造を使うことで、 コードがスッキリ整理され、後から機能追加しやすくなります。

Model:商品データを表す Product クラス

まずは 商品というデータの形を作ります。 ここがアプリの「土台」です。

using System;

class Product
{
    public int Id { get; }
    public string Name { get; }
    public int Price { get; private set; }
    public int Stock { get; private set; }
    public string Category { get; }

    public Product(int id, string name, int price, int stock, string category)
    {
        Id = id;
        Name = name;
        Category = category;

        // 価格の整合性チェック
        Price = price < 0 ? 0 : price;

        // 在庫の整合性チェック
        Stock = stock < 0 ? 0 : stock;
    }

    // 在庫を増やす
    public void AddStock(int amount)
    {
        if (amount <= 0)
        {
            Console.WriteLine("入荷数は正の値でなければなりません。");
            return;
        }
        Stock += amount;
    }

    // 在庫を減らす
    public void ReduceStock(int amount)
    {
        if (amount <= 0)
        {
            Console.WriteLine("販売数は正の値でなければなりません。");
            return;
        }
        if (amount > Stock)
        {
            Console.WriteLine("在庫不足です。");
            return;
        }
        Stock -= amount;
    }

    public void PrintInfo()
    {
        Console.WriteLine($"ID: {Id}, 名前: {Name}, 価格: {Price} 円, 在庫: {Stock}, カテゴリ: {Category}");
    }
}
C#

重要ポイント

  • PriceStockprivate set で外部から直接変更させない
  • 在庫変更は必ず AddStock / ReduceStock を通す
  • データの整合性(マイナス値など)をコンストラクタでチェック

Model は「データの形+最低限の振る舞い」を持つクラスです。

Service:商品管理の処理をまとめる ProductService

次に、商品を管理する サービス層 を作ります。 ここがアプリの「頭脳」です。

using System;
using System.Collections.Generic;
using System.Linq;

class ProductService
{
    private readonly List<Product> products = new List<Product>();

    // 商品登録
    public void AddProduct(Product product)
    {
        products.Add(product);
        Console.WriteLine($"商品「{product.Name}」を登録しました。");
    }

    // 商品一覧
    public void PrintAllProducts()
    {
        Console.WriteLine("=== 商品一覧 ===");
        foreach (var p in products)
        {
            p.PrintInfo();
        }
    }

    // 商品検索(ID)
    public Product? FindById(int id)
    {
        return products.FirstOrDefault(p => p.Id == id);
    }

    // 商品削除
    public void DeleteProduct(int id)
    {
        var product = FindById(id);
        if (product == null)
        {
            Console.WriteLine("指定された商品は存在しません。");
            return;
        }

        products.Remove(product);
        Console.WriteLine($"商品「{product.Name}」を削除しました。");
    }

    // 在庫変更
    public void ChangeStock(int id, int amount, bool isAdd)
    {
        var product = FindById(id);
        if (product == null)
        {
            Console.WriteLine("商品が見つかりません。");
            return;
        }

        if (isAdd)
        {
            product.AddStock(amount);
        }
        else
        {
            product.ReduceStock(amount);
        }
    }
}
C#

重要ポイント

  • ProductService は「商品に関する処理」をすべて担当
  • Model(Product)を使って仕事をする
  • Program から呼び出しやすい形にする

Service は「処理のまとまり」を表すクラスです。

Program:アプリの入口と流れを作る

最後に、アプリの流れを作る Program を書きます。 ここがアプリの「司令塔」です。

class Program
{
    static void Main(string[] args)
    {
        ProductService service = new ProductService();

        // 商品登録
        Product p1 = new Product(1, "ノート", 100, 50, "文房具");
        Product p2 = new Product(2, "ボールペン", 150, 30, "文房具");
        Product p3 = new Product(3, "コーヒー", 120, 20, "食品");

        service.AddProduct(p1);
        service.AddProduct(p2);
        service.AddProduct(p3);

        // 商品一覧
        service.PrintAllProducts();

        // 商品検索
        Console.WriteLine("ID 2 の商品を検索します。");
        var found = service.FindById(2);
        if (found != null)
        {
            found.PrintInfo();
        }

        // 在庫変更
        Console.WriteLine("ID 1 の商品を 10 個入荷します。");
        service.ChangeStock(1, 10, isAdd: true);

        Console.WriteLine("ID 3 の商品を 5 個販売します。");
        service.ChangeStock(3, 5, isAdd: false);

        // 商品削除
        Console.WriteLine("ID 2 の商品を削除します。");
        service.DeleteProduct(2);

        // 最終一覧
        service.PrintAllProducts();

        Console.ReadLine();
    }
}
C#

重要ポイント

  • Program は「流れ」を書くだけ
  • 実際の処理は Service に任せる
  • データの形は Model に任せる

この役割分担ができると、 コードが驚くほど読みやすくなります。

ここまでの構造を図でイメージする

コード

Program(司令塔)
   ↓
ProductService(処理のまとまり)
   ↓
Product(データの形)

この「上から下へ」の流れが、 オブジェクト指向の基本的な設計パターンです。

Day 40 のまとめ

Day 40 では、

  • Model(Product)
  • Service(ProductService)
  • Program(Main)

という 3 層構造を使って、 商品管理アプリを作りました。

学んだポイントは次の通りです。

  • クラスは「データ」と「処理」をひとまとめにする
  • カプセル化でデータの整合性を守る
  • Service に処理を集めることで Program がスッキリする
  • Model はデータの形を表すだけに集中する
  • 複数クラスを連携させることでアプリらしい構造になる

ここまで来ると、 「自分でアプリを作れる」という実感が少しずつ湧いてくるはずです。

次のステップに向けて

この商品管理アプリをベースに、

  • 商品の並び替え
  • カテゴリ別検索
  • ファイル保存
  • メニュー操作(コンソール入力)

などを追加していくと、 本格的なアプリに育っていきます。

ぜひ、 「自分だけの機能」を追加して遊んでみてください。

オブジェクト指向は、 自分の頭の中の世界をコードで表現するための道具です。 Day 40 は、その楽しさを感じる最初のステップになります。

タイトルとURLをコピーしました