導入
オブジェクト指向設計は、ソフトウェア開発において非常に重要な役割を果たします。特に、実務においては、設計の良し悪しがプロジェクトの成功に直結します。今回は、実際の業務でよく遭遇する「商品管理システム」を例に取り、オブジェクト指向設計の考え方を掘り下げていきます。このシステムでは、商品情報を管理するためのクラス設計が求められます。
教科書レベルの解説(オブジェクト指向設計)
重要な概念の整理
オブジェクト指向設計においては、クラスとオブジェクトの関係、カプセル化、継承、ポリモーフィズムが基本的な概念です。特に商品管理システムでは、以下の点に注意が必要です。
- カプセル化: 商品の属性(価格、在庫など)を隠蔽し、必要な操作だけを公開する。
- 継承: 基本的な商品クラスを作成し、特定の商品のクラスをそのサブクラスとして定義する。
- ポリモーフィズム: 同じメソッド名で異なる動作を持たせることで、柔軟な設計を実現する。
コード例(Java)
class Product {
private String name;
private double price;
private int stock;
public Product(String name, double price, int stock) {
this.name = name;
this.price = price;
this.stock = stock;
}
public void sell(int quantity) {
if (quantity <= stock) {
stock -= quantity;
} else {
System.out.println("在庫不足");
}
}
public void restock(int quantity) {
stock += quantity;
}
public String getDetails() {
return "商品名: " + name + ", 価格: " + price + ", 在庫: " + stock;
}
}
class DigitalProduct extends Product {
private String downloadLink;
public DigitalProduct(String name, double price, int stock, String downloadLink) {
super(name, price, stock);
this.downloadLink = downloadLink;
}
@Override
public String getDetails() {
return super.getDetails() + ", ダウンロードリンク: " + downloadLink;
}
}
コードの行ごとの解説
- クラス`Product`の定義。商品情報を保持するための基本クラス。
- 商品名、価格、在庫をプライベートフィールドとして定義し、カプセル化を実現。
- コンストラクタで商品情報を初期化。
- `sell`メソッドで商品の販売処理を実装。在庫が不足している場合のエラーメッセージも考慮。
- `restock`メソッドで在庫を補充する処理。
- `getDetails`メソッドで商品情報を文字列として返す。
- `DigitalProduct`クラスを`Product`クラスから継承し、ダウンロードリンクを追加。
- オーバーライドした`getDetails`メソッドで、デジタル商品の詳細情報を表示。
練習問題編
以下の練習問題に挑戦し、オブジェクト指向設計の理解を深めてください。
- 商品クラスに「割引」機能を追加してください。割引率を引数として受け取り、価格を更新するメソッドを実装してください。
- デジタル商品に「使用期限」を追加し、期限を過ぎた場合に警告を出すメソッドを実装してください。
- 異なる種類の商品の情報を一括で管理するための`ProductManager`クラスを作成し、商品の追加・削除機能を実装してください。
public void applyDiscount(double discountRate) {
price -= price * discountRate;
}
private LocalDate expirationDate;
public void checkExpiration() {
if (LocalDate.now().isAfter(expirationDate)) {
System.out.println("この商品は使用期限が過ぎています。");
}
}
class ProductManager {
private List products = new ArrayList<>();
public void addProduct(Product product) {
products.add(product);
}
public void removeProduct(Product product) {
products.remove(product);
}
}
まとめ
- オブジェクト指向設計の基本概念を理解し、実務に応用する。
- 商品管理システムを通じて、カプセル化や継承、ポリモーフィズムの重要性を学ぶ。
- 練習問題を通じて、実際の業務で役立つ設計スキルを身につける。