Hvordan designe en parkeringsplass ved hjelp av objektorienterte prinsipper?

Hvordan designe en parkeringsplass ved hjelp av objektorienterte prinsipper?

Å designe en parkeringsplass ved å bruke objektorienterte prinsipper innebærer å bryte ned systemet i klasseattributter og metoder som gjenspeiler virkelige enheter. Nøkkelkomponenter som kjøretøy og parkeringsplasser kan modelleres som objekter mens interaksjoner som parkering kan håndteres gjennom metoder. Denne tilnærmingen fremmer modularitet gjenbrukbarhet og vedlikeholdsmuligheter, noe som gjør systemet enkelt å utvide og administrere.

Hvordan-designe-en-parkeringsplass-ved hjelp av-objektorienterte-prinsipperHvordan designe en parkeringsplass ved hjelp av objektorienterte prinsipper?

Forutsetninger

For våre formål akkurat nå vil vi gjøre følgende forutsetninger. Vi gjorde disse spesifikke forutsetningene for å legge til litt kompleksitet til problemet uten å legge til for mye.

  • Parkeringsplassen har flere nivåer. Hvert nivå har flere rader med flekker.
  • Parkeringsplassen kan parkere motorsykler biler og busser.
  • Parkeringsplassen har motorsykkelplasser kompakte flekker og store flekker.
  • En motorsykkel kan parkere hvor som helst.
  • En bil kan parkere enten på et enkelt kompakt sted eller et enkelt stort sted.
  • En buss kan parkere på fem store plasser som er påfølgende og innenfor samme rad. Den kan ikke parkere på små flekker. I implementeringen nedenfor har vi laget en abstrakt klasse kjøretøy som bilbuss og motorsykkel arver fra.

Objektorientert design

Vi begynner med å lage de nødvendige klassene og sørge for at hver klasse har et enkelt ansvar. La oss bryte ned designet med fokus på hvordan hver klasse og metode samhandler.

1. Kjøretøysklasse

De Vehicle klasse definerer vanlige egenskaper og atferd for alle typer kjøretøy. Den vil fungere som en basisklasse for mer spesifikke kjøretøytyper som Bus Car og 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. Betongkjøretøyklasser

Buss : En buss krever 5 store plasser på rad.

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

Bil : En bil kan parkere enten på kompakte eller store steder.

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

Motorsykkel : En motorsykkel kan parkere hvor som helst

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 klasse

De ParkingSpot klasse representerer en individuell parkeringsplass på parkeringsplassen. Det er ansvarlig for å administrere tilgjengeligheten og verifisere om et spesifikt kjøretøy kan passe på stedet.

  • Vi kunne ha implementert dette ved å ha klasser for LargeSpot CompactSpot og MotorcycleSpot som arver fra ParkingSpot, men dette er sannsynligvis overkill.
  • Flekkene har sannsynligvis ikke annen oppførsel enn størrelsen. 
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. Parkeringsnivå klasse

De Level klasse representerer et nivå på parkeringsplassen. Den administrerer en samling parkeringsplasser og tilbyr metoder for å parkere og fjerne kjøretøy.

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. Parkeringsplass klasse

De ParkingLot klasse representerer hele parkeringsplassen. Den administrerer flere nivåer og gir metoder for å parkere og fjerne kjøretøy fra parkeringsplassen.

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. Billett- og betalingstjenesteklasser

For å administrere billettering og betalinger legger vi til Ticket og PaymentService klasser.

Billettklasse : Representerer billetten som utstedes når et kjøretøy parkerer. Den registrerer tiden kjøretøyet går inn og ut av parkeringsplassen.

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

Betalingstjenesteklasse : Ansvarlig for beregning av parkeringsavgift og behandling av innbetalinger.

Java
   offentlig     klasse   Betalingstjeneste     {      offentlig     dobbelt     beregneGebyr  (  Billett     billett  )     {      lang     varighet     =     billett  .  getDuration  ();      // Enkel avgiftsmodell: `tekst`=