Java上級

上級 Javaで学ぶオブジェクト指向設計|ケーススタディ編

導入

オブジェクト指向設計は、ソフトウェア開発において重要な役割を果たします。特に、実務で直面する複雑なシステムの設計においては、その効果を最大限に引き出すことが求められます。ここでは、具体的なプロジェクトを通じて、オブジェクト指向設計の実践的なアプローチを探ります。

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

重要な概念の整理

オブジェクト指向設計の基本概念には、カプセル化、継承、ポリモーフィズム、そして抽象化があります。これらの概念は、コードの再利用性や可読性を向上させ、メンテナンスの負担を軽減します。特に、プロジェクトの規模が大きくなるにつれて、これらの設計原則を適切に適用することが成功の鍵となります。

コード例(Java)


class Vehicle {
    protected String model;
    protected int year;

    public Vehicle(String model, int year) {
        this.model = model;
        this.year = year;
    }

    public void displayInfo() {
        System.out.println("Model: " + model + ", Year: " + year);
    }
}

class Car extends Vehicle {
    private int doors;

    public Car(String model, int year, int doors) {
        super(model, year);
        this.doors = doors;
    }

    @Override
    public void displayInfo() {
        super.displayInfo();
        System.out.println("Doors: " + doors);
    }
}

class Bike extends Vehicle {
    private boolean hasCarrier;

    public Bike(String model, int year, boolean hasCarrier) {
        super(model, year);
        this.hasCarrier = hasCarrier;
    }

    @Override
    public void displayInfo() {
        super.displayInfo();
        System.out.println("Has Carrier: " + hasCarrier);
    }
}

コードの行ごとの解説

  1. class Vehicle { – Vehicleクラスを定義します。これは基本的な車両の情報を持つクラスです。
  2. protected String model; – モデル名を保持するフィールド。protectedにすることで、サブクラスからアクセス可能になります。
  3. public Vehicle(String model, int year) { – コンストラクタでモデル名と年を初期化します。
  4. public void displayInfo() { – 車両情報を表示するメソッドです。
  5. class Car extends Vehicle { – Vehicleクラスを継承したCarクラスを定義します。
  6. private int doors; – ドアの数を保持するフィールド。
  7. public void displayInfo() { – 親クラスのメソッドをオーバーライドして、ドアの情報も表示します。
  8. class Bike extends Vehicle { – Vehicleクラスを継承したBikeクラスを定義します。
  9. private boolean hasCarrier; – キャリアの有無を保持するフィールド。
  10. public void displayInfo() { – 親クラスのメソッドをオーバーライドして、キャリアの情報も表示します。

ケーススタディ編

架空のプロジェクトとして、自動車とバイクの管理システムを考えます。このシステムでは、車両の情報を管理し、特定の条件に基づいて車両の情報を表示する機能が求められます。最初は、Vehicleクラスを基にCarクラスとBikeクラスを作成しました。しかし、プロジェクトが進むにつれて、新たな車両タイプが追加されることになりました。

ここでの落とし穴は、継承の深さが増すことによる複雑性の増加です。たとえば、もしTruckクラスを追加した場合、CarクラスとBikeクラスの共通の機能をTruckクラスにも持たせる必要があります。これにより、コードが冗長になり、メンテナンスが困難になる可能性があります。

改善ポイントとしては、共通の機能を持つインターフェースを作成し、それを各クラスに実装することで、コードの再利用性を高めることが挙げられます。これにより、車両タイプが増えても、柔軟に対応できる設計が実現できます。

まとめ

  • オブジェクト指向設計の原則を適用することで、コードの再利用性が向上します。
  • 継承の深さを意識し、インターフェースを活用することで、システムの柔軟性が増します。