オブジェクト指向の原則を使用して駐車場を設計するには、システムを現実世界のエンティティを反映するクラス属性とメソッドに分割する必要があります。車両や駐車スペースなどの主要コンポーネントはオブジェクトとしてモデル化でき、駐車などのインタラクションはメソッドを通じて処理できます。このアプローチにより、モジュール性の再利用性と保守性が促進され、システムの拡張と管理が容易になります。
オブジェクト指向の原則を使用して駐車場を設計するにはどうすればよいでしょうか?仮定
現時点での目的のために、次の仮定を立てます。私たちは、あまり多くを追加せずに問題を少し複雑にするために、これらの特定の仮定を立てました。
- 駐車場は複数のレベルに分かれています。各レベルには複数のスポットの列があります。
- 駐車場はバイク・バスも駐車可能です。
- 駐車場はバイクスポットコンパクトスポットから大型スポットまであります。
- バイクはどこにでも停められます。
- 車は 1 つのコンパクトなスペースまたは 1 つの大きなスペースに駐車できます。
- バスは、同じ列内にある連続した 5 つの大きなスペースに駐車できます。狭い場所には駐車できません。以下の実装では、Car Bus と Motorcycle が継承する抽象クラス Vehicle を作成しました。
オブジェクト指向設計
まず必要なクラスを作成し、各クラスが明確な単一の責任を負うことを保証します。各クラスとメソッドがどのように相互作用するかに焦点を当てて、設計を詳しく見てみましょう。
1. 車両クラス
のVehicleクラスは、すべてのタイプの車両に共通の属性と動作を定義します。これは、次のようなより具体的な車両タイプの基本クラスとして機能します。Bus CarそしてMotorcycle。
public abstract class Vehicle { protected String licensePlate; protected int spotsNeeded; protected VehicleSize size; public Vehicle(String licensePlate VehicleSize size) { this.licensePlate = licensePlate; this.size = size; this.spotsNeeded = (size == VehicleSize.Large) ? 5 : 1; } public int getSpotsNeeded() { return spotsNeeded; } public VehicleSize getSize() { return size; } public String getLicensePlate() { return licensePlate; } public abstract boolean canFitInSpot(ParkingSpot spot); }
2. コンクリート車両クラス
バス : バスには 5 つの連続した大きなスポットが必要です。
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
車 :車はコンパクトなスペースから大きなスペースまで駐車できます。
Javapublic class Car extends Vehicle { public Car(String licensePlate) { super(licensePlate VehicleSize.Compact); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Compact || spot.getSpotSize() == VehicleSize.Large; } }
オートバイ : バイクはどこでも駐車可能
Javapublic class Motorcycle extends Vehicle { public Motorcycle(String licensePlate) { super(licensePlate VehicleSize.Motorcycle); } public boolean canFitInSpot(ParkingSpot spot) { return true; // Can park in any spot } }
3. パーキングスポットクラス
のParkingSpotクラスは駐車場の個々の駐車スポットを表します。空き状況を管理し、特定の車両がその場に収まるかどうかを確認する責任があります。
- これは、ParkingSpot を継承する LargeSpot CompactSpot と MotorcycleSpot のクラスを用意することで実装できますが、これはおそらくやりすぎです。
- スポットはおそらく、そのサイズ以外に異なる動作はありません。
public class ParkingSpot { private Vehicle vehicle; private VehicleSize spotSize; private int row; private int spotNumber; private Level level; public ParkingSpot(Level level int row int spotNumber VehicleSize spotSize) { this.level = level; this.row = row; this.spotNumber = spotNumber; this.spotSize = spotSize; this.vehicle = null; } public boolean isAvailable() { return vehicle == null; } public boolean canFitVehicle(Vehicle vehicle) { return isAvailable() && vehicle.canFitInSpot(this); } public void parkVehicle(Vehicle vehicle) { if (canFitVehicle(vehicle)) { this.vehicle = vehicle; } } public void removeVehicle() { this.vehicle = null; } public VehicleSize getSpotSize() { return spotSize; } public int getRow() { return row; } public int getSpotNumber() { return spotNumber; } }
4. 駐車レベルクラス
のLevelclass は駐車場のレベルを表します。駐車スポットの集合を管理し、車両を駐車および撤去する方法を提供します。
public class Level { private int levelNumber; private ParkingSpot[] spots; public Level(int levelNumber int numSpots) { this.levelNumber = levelNumber; this.spots = new ParkingSpot[numSpots]; } public boolean parkVehicle(Vehicle vehicle) { for (ParkingSpot spot : spots) { if (spot.canFitVehicle(vehicle)) { spot.parkVehicle(vehicle); return true; } } return false; } public boolean removeVehicle(Vehicle vehicle) { for (ParkingSpot spot : spots) { if (spot.isOccupied() && spot.getVehicle().equals(vehicle)) { spot.removeVehicle(); return true; } } return false; } }
5. 駐車場クラス
のParkingLotクラスは駐車場全体を表します。複数のレベルを管理し、駐車場に車両を駐車したり、駐車場から車両を撤去したりする方法を提供します。
public class ParkingLot { private Level[] levels; public ParkingLot(int numLevels int numSpotsPerLevel) { levels = new Level[numLevels]; for (int i = 0; i < numLevels; i++) { levels[i] = new Level(i numSpotsPerLevel); } } public boolean parkVehicle(Vehicle vehicle) { for (Level level : levels) { if (level.parkVehicle(vehicle)) { return true; } } return false; // Parking failed (no spots available) } public boolean removeVehicle(Vehicle vehicle) { for (Level level : levels) { if (level.removeVehicle(vehicle)) { return true; } } return false; // Removal failed (vehicle not found) } }
6. Ticket および PaymentService クラス
発券と支払いを管理するために、TicketそしてPaymentServiceクラス。
チケットクラス :車両を駐車する際に発行されるチケットを表します。車両が駐車場に出入りした時刻を記録します。
Javapublic class Ticket { private Vehicle vehicle; private Date issueTime; private Date exitTime; public Ticket(Vehicle vehicle) { this.vehicle = vehicle; this.issueTime = new Date(); } public void setExitTime(Date exitTime) { this.exitTime = exitTime; } public long getDuration() { return (exitTime.getTime() - issueTime.getTime()) / 1000; // Time in seconds } }
PaymentService クラス : 駐車料金の計算と支払いの処理を担当します。
ジャワ公共 クラス 支払いサービス { 公共 ダブル 料金を計算する(チケット チケット) { 長さ 間隔 = チケット。取得期間(); // 単純な料金モデル: `text`=