Java中級

中級 Javaで学ぶオブジェクト指向設計|練習問題編

導入

オブジェクト指向設計は、ソフトウェア開発において非常に重要な役割を果たします。特に、実務においては、設計の良し悪しがプロジェクトの成功に直結します。今回は、実際の業務でよく遭遇する「商品管理システム」を例に取り、オブジェクト指向設計の考え方を掘り下げていきます。このシステムでは、商品情報を管理するためのクラス設計が求められます。

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

重要な概念の整理

オブジェクト指向設計においては、クラスとオブジェクトの関係、カプセル化、継承、ポリモーフィズムが基本的な概念です。特に商品管理システムでは、以下の点に注意が必要です。

  • カプセル化: 商品の属性(価格、在庫など)を隠蔽し、必要な操作だけを公開する。
  • 継承: 基本的な商品クラスを作成し、特定の商品のクラスをそのサブクラスとして定義する。
  • ポリモーフィズム: 同じメソッド名で異なる動作を持たせることで、柔軟な設計を実現する。

コード例(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;
    }
}

コードの行ごとの解説

  1. クラス`Product`の定義。商品情報を保持するための基本クラス。
  2. 商品名、価格、在庫をプライベートフィールドとして定義し、カプセル化を実現。
  3. コンストラクタで商品情報を初期化。
  4. `sell`メソッドで商品の販売処理を実装。在庫が不足している場合のエラーメッセージも考慮。
  5. `restock`メソッドで在庫を補充する処理。
  6. `getDetails`メソッドで商品情報を文字列として返す。
  7. `DigitalProduct`クラスを`Product`クラスから継承し、ダウンロードリンクを追加。
  8. オーバーライドした`getDetails`メソッドで、デジタル商品の詳細情報を表示。

練習問題編

以下の練習問題に挑戦し、オブジェクト指向設計の理解を深めてください。

  1. 商品クラスに「割引」機能を追加してください。割引率を引数として受け取り、価格を更新するメソッドを実装してください。
  2. 
    public void applyDiscount(double discountRate) {
        price -= price * discountRate;
    }
    
  3. デジタル商品に「使用期限」を追加し、期限を過ぎた場合に警告を出すメソッドを実装してください。
  4. 
    private LocalDate expirationDate;
    
    public void checkExpiration() {
        if (LocalDate.now().isAfter(expirationDate)) {
            System.out.println("この商品は使用期限が過ぎています。");
        }
    }
    
  5. 異なる種類の商品の情報を一括で管理するための`ProductManager`クラスを作成し、商品の追加・削除機能を実装してください。
  6. 
    class ProductManager {
        private List products = new ArrayList<>();
    
        public void addProduct(Product product) {
            products.add(product);
        }
    
        public void removeProduct(Product product) {
            products.remove(product);
        }
    }
    

まとめ

  • オブジェクト指向設計の基本概念を理解し、実務に応用する。
  • 商品管理システムを通じて、カプセル化や継承、ポリモーフィズムの重要性を学ぶ。
  • 練習問題を通じて、実際の業務で役立つ設計スキルを身につける。