オブジェクト指向の原則を使用して駐車場を設計するにはどうすればよいですか?

オブジェクト指向の原則を使用して駐車場を設計するにはどうすればよいですか?

オブジェクト指向の原則を使用して駐車場を設計するには、システムを現実世界のエンティティを反映するクラス属性とメソッドに分割する必要があります。車両や駐車スペースなどの主要コンポーネントはオブジェクトとしてモデル化でき、駐車などのインタラクションはメソッドを通じて処理できます。このアプローチにより、モジュール性の再利用性と保守性が促進され、システムの拡張と管理が容易になります。

オブジェクト指向の原則を使用して駐車場を設計する方法オブジェクト指向の原則を使用して駐車場を設計するにはどうすればよいでしょうか?

仮定

現時点での目的のために、次の仮定を立てます。私たちは、あまり多くを追加せずに問題を少し複雑にするために、これらの特定の仮定を立てました。

  • 駐車場は複数のレベルに分かれています。各レベルには複数のスポットの列があります。
  • 駐車場はバイク・バスも駐車可能です。
  • 駐車場はバイクスポットコンパクトスポットから大型スポットまであります。
  • バイクはどこにでも停められます。
  • 車は 1 つのコンパクトなスペースまたは 1 つの大きなスペースに駐車できます。
  • バスは、同じ列内にある連続した 5 つの大きなスペースに駐車できます。狭い場所には駐車できません。以下の実装では、Car Bus と Motorcycle が継承する抽象クラス Vehicle を作成しました。

オブジェクト指向設計

まず必要なクラスを作成し、各クラスが明確な単一の責任を負うことを保証します。各クラスとメソッドがどのように相互作用するかに焦点を当てて、設計を詳しく見てみましょう。

1. 車両クラス

Vehicle クラスは、すべてのタイプの車両に共通の属性と動作を定義します。これは、次のようなより具体的な車両タイプの基本クラスとして機能します。 Bus Car そして Motorcycle

Java
   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 つの連続した大きなスポットが必要です。

Java
   public     class   Bus     extends     Vehicle     {      public     Bus  (  String     licensePlate  )     {      super  (  licensePlate       VehicleSize  .  Large  );      }      public     boolean     canFitInSpot  (  ParkingSpot     spot  )     {      return     spot  .  getSpotSize  ()     ==     VehicleSize  .  Large  ;      }   }   

:車はコンパクトなスペースから大きなスペースまで駐車できます。

Java
   public     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  ;      }   }   

オートバイ : バイクはどこでも駐車可能

Java
   public     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 のクラスを用意することで実装できますが、これはおそらくやりすぎです。
  • スポットはおそらく、そのサイズ以外に異なる動作はありません。 
Java
   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. 駐車レベルクラス

Level class は駐車場のレベルを表します。駐車スポットの集合を管理し、車両を駐車および撤去する方法を提供します。

Java
   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 クラスは駐車場全体を表します。複数のレベルを管理し、駐車場に車両を駐車したり、駐車場から車両を撤去したりする方法を提供します。

Java
   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 クラス。

チケットクラス :車両を駐車する際に発行されるチケットを表します。車両が駐車場に出入りした時刻を記録します。

Java
   public     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`=