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#重要ポイント
PriceとStockは private 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 は、その楽しさを感じる最初のステップになります。

