Hvordan designes en parkeringsplads ved hjælp af objektorienterede principper?

Hvordan designes en parkeringsplads ved hjælp af objektorienterede principper?

At designe en parkeringsplads ved hjælp af objektorienterede principper involverer at nedbryde systemet i klasser attributter og metoder, der afspejler den virkelige verden enheder. Nøglekomponenter som køretøjer og parkeringspladser kan modelleres som objekter, mens interaktioner såsom parkering kan håndteres gennem metoder. Denne tilgang fremmer modularitets genanvendelighed og vedligeholdelse, hvilket gør systemet nemt at udvide og administrere.

Hvordan-man-designer-en-parkeringsplads-ved hjælp af-objekt-orienterede-principperHvordan designer man en parkeringsplads ved hjælp af objektorienterede principper?

Forudsætninger

Til vores formål lige nu vil vi gøre følgende antagelser. Vi lavede disse specifikke antagelser for at tilføje en smule kompleksitet til problemet uden at tilføje for meget.

  • Parkeringspladsen har flere niveauer. Hvert niveau har flere rækker af pletter.
  • Parkeringspladsen kan parkere motorcykler biler og busser.
  • Parkeringspladsen har motorcykelspots kompakte spots og store spots.
  • En motorcykel kan parkere hvor som helst.
  • En bil kan parkere enten på et enkelt kompakt sted eller et enkelt stort sted.
  • En bus kan parkere på fem store pladser, der er på hinanden følgende og inden for samme række. Den kan ikke parkere på små steder. I nedenstående implementering har vi skabt et abstrakt klassekøretøj, som bilbus og motorcykel arver.

Objektorienteret design

Vi begynder med at oprette de nødvendige klasser og sikre, at hver klasse har et klart enkelt ansvar. Lad os nedbryde designet med fokus på, hvordan hver klasse og metode interagerer.

1. Køretøjsklasse

De Vehicle klasse definerer fælles egenskaber og adfærd for alle typer køretøjer. Det vil fungere som en basisklasse for mere specifikke køretøjstyper som f.eks 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. Betonkøretøjsklasser

Bus : En bus kræver 5 på hinanden følgende store pladser.

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 på enten kompakte eller store pladser.

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

Motorcykel : En motorcykel 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. Parkeringsplads klasse

De ParkingSpot klasse repræsenterer en individuel parkeringsplads på parkeringspladsen. Det er ansvarligt for at styre dets tilgængelighed og verificere, om et specifikt køretøj kan passe på stedet.

  • Vi kunne have implementeret dette ved at have klasser for LargeSpot CompactSpot og MotorcycleSpot, som arver fra ParkingSpot, men dette er sandsynligvis overdøvet.
  • Pletterne har sandsynligvis ikke anden adfærd udover deres størrelse. 
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. Parkeringsniveau klasse

De Level klasse repræsenterer et niveau på parkeringspladsen. Det administrerer en samling af parkeringspladser og giver metoder til at parkere og fjerne køretøjer.

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

De ParkingLot klasse repræsenterer hele parkeringspladsen. Det administrerer flere niveauer og giver metoder til at parkere og fjerne køretøjer fra parkeringspladsen.

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. Billet- og betalingsserviceklasser

For at administrere billetsalg og betalinger tilføjer vi Ticket og PaymentService klasser.

Billetklasse : Repræsenterer den billet, der udstedes, når et køretøj parkerer. Den registrerer det tidspunkt, hvor køretøjet kører ind og ud af parkeringspladsen.

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

Betalingsserviceklasse : Ansvarlig for beregning af parkeringsafgift og behandling af betalinger.

Java
   offentlig     klasse   Betalingsservice     {      offentlig     dobbelt     beregne gebyr  (  Billet     billet  )     {      lang     varighed     =     billet  .  getDuration  ();      // Simpel gebyrmodel: `tekst`=