객체지향 원리를 사용하여 주차장을 설계하는 방법은 무엇입니까?

객체지향 원리를 사용하여 주차장을 설계하는 방법은 무엇입니까?

객체지향 원칙을 사용하여 주차장을 설계하려면 시스템을 실제 엔터티를 반영하는 클래스 속성과 메서드로 분해해야 합니다. 차량 및 주차 공간과 같은 주요 구성 요소는 객체로 모델링될 수 있으며 주차와 같은 상호 작용은 메서드를 통해 처리될 수 있습니다. 이 접근 방식은 모듈성 재사용성과 유지 관리성을 촉진하여 시스템을 쉽게 확장하고 관리할 수 있게 해줍니다.

객체 지향 원칙을 사용하여 주차장을 설계하는 방법객체 지향 원칙을 사용하여 주차장을 설계하는 방법은 무엇입니까?

가정

지금은 우리의 목적을 위해 다음과 같은 가정을 할 것입니다. 우리는 너무 많은 것을 추가하지 않고도 문제에 약간의 복잡성을 추가하기 위해 이러한 구체적인 가정을 세웠습니다.

  • 주차장은 여러 층으로 이루어져 있습니다. 각 레벨에는 여러 줄의 지점이 있습니다.
  • 주차장에는 오토바이, 자동차, 버스를 주차할 수 있습니다.
  • 주차장에는 오토바이 주차공간이 소형 주차공간과 대형 주차공간이 있습니다.
  • 오토바이는 어느 곳에나 주차할 수 있습니다.
  • 자동차는 하나의 작은 공간이나 하나의 넓은 공간에 주차할 수 있습니다.
  • 버스는 같은 줄에 연속적으로 있는 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 클래스는 주차장의 개별 주차 공간을 나타냅니다. 가용성을 관리하고 특정 차량이 그 자리에 들어갈 수 있는지 확인하는 역할을 담당합니다.

  • 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. ParkingLevel 클래스

그만큼 Level 클래스는 주차장의 레벨을 나타냅니다. 주차 공간 모음을 관리하고 차량을 주차하고 제거하는 방법을 제공합니다.

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 클래스

그만큼 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. 티켓 및 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 클래스 : 주차요금 정산 및 결제 처리를 담당합니다.

자바
   공공의     수업   결제서비스     {      공공의     더블     계산수수료  (       )     {          지속     =      .  getDuration  ();      // 단순 수수료 모델: `text`=