Ako navrhnúť parkovisko pomocou objektovo orientovaných princípov?

Ako navrhnúť parkovisko pomocou objektovo orientovaných princípov?

Navrhovanie parkoviska pomocou objektovo orientovaných princípov zahŕňa rozdelenie systému na atribúty tried a metódy, ktoré odrážajú entity skutočného sveta. Kľúčové komponenty, ako sú vozidlá a parkovacie miesta, môžu byť modelované ako objekty, zatiaľ čo interakcie, ako je parkovanie, môžu byť riešené pomocou metód. Tento prístup podporuje opätovnú použiteľnosť a udržiavateľnosť modulárnosti, vďaka čomu je systém jednoduchý na rozšírenie a správu.

Ako navrhnúť parkovisko pomocou objektovo orientovaných princípovAko navrhnúť parkovisko pomocou objektovo orientovaných princípov?

Predpoklady

Pre naše účely teraz urobíme nasledujúce predpoklady. Urobili sme tieto špecifické predpoklady, aby sme do problému pridali trochu zložitosti bez toho, aby sme pridali príliš veľa.

  • Parkovisko má viacero úrovní. Každá úroveň má viacero radov škvŕn.
  • Na parkovisku je možné zaparkovať motorky, autá a autobusy.
  • Parkovisko má miesta pre motocykle kompaktné miesta a veľké miesta.
  • Motocykel môže zaparkovať na akomkoľvek mieste.
  • Auto môže zaparkovať na jednom kompaktnom mieste alebo na jednom veľkom mieste.
  • Autobus môže zaparkovať na piatich veľkých miestach, ktoré idú za sebou av rovnakom rade. Nemôže parkovať na malých miestach. V nižšie uvedenej implementácii sme vytvorili abstraktnú triedu Vozidlo, z ktorej dedí autobus a motocykel.

Objektovo orientovaný dizajn

Začneme vytvorením potrebných tried a uistením sa, že každá trieda má jasnú jedinú zodpovednosť. Poďme rozobrať dizajn so zameraním na interakciu jednotlivých tried a metód.

1. Trieda vozidla

The Vehicle trieda definuje spoločné atribúty a správanie pre všetky typy vozidiel. Bude slúžiť ako základná trieda pre špecifickejšie typy vozidiel, ako napr Bus Car a 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. Konkrétne triedy vozidiel

Autobus : Autobus vyžaduje 5 po sebe nasledujúcich veľkých miest.

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

Auto : Auto môže parkovať na kompaktných alebo veľkých miestach.

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

Motocykel : Motocykel môže zaparkovať na akomkoľvek mieste

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. trieda ParkingSpot

The ParkingSpot triedy predstavuje samostatné parkovacie miesto na parkovisku. Je zodpovedný za riadenie jeho dostupnosti a overenie, či sa konkrétne vozidlo zmestí na miesto.

  • Mohli sme to implementovať tak, že by sme mali triedy pre LargeSpot CompactSpot a MotorcycleSpot, ktoré dedia od ParkingSpot, ale toto je pravdepodobne prehnané.
  • Škvrny pravdepodobne nemajú iné správanie okrem ich veľkosti. 
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. Trieda úrovne parkovania

The Level triedy predstavuje úroveň na parkovisku. Spravuje zbierku parkovacích miest a poskytuje spôsoby parkovania a odstraňovania vozidiel.

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. Trieda ParkingLot

The ParkingLot triedy predstavuje celé parkovisko. Spravuje viacero úrovní a poskytuje spôsoby parkovania a odstraňovania vozidiel z parkoviska.

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. Triedy vstupeniek a platobných služieb

Na správu lístkov a platieb pridávame Ticket a PaymentService triedy.

Trieda lístkov : Predstavuje lístok vydaný pri zaparkovaní vozidla. Zaznamenáva čas vjazdu a výjazdu vozidla z parkoviska.

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      }   }   

Trieda platobných služieb : Zodpovedá za výpočet parkovného a spracovanie platieb.

Java
   verejnosti     trieda   Platobná služba     {      verejnosti     dvojitý     vypočítaťPoplatok  (  Lístok     lístok  )     {      dlhý     trvanie     =     lístok  .  getDuration  ();      // Jednoduchý model poplatkov: `text`=