Hoe ontwerp je een parkeerplaats met behulp van objectgeoriënteerde principes?

Hoe ontwerp je een parkeerplaats met behulp van objectgeoriënteerde principes?

Het ontwerpen van een parkeerplaats met behulp van objectgeoriënteerde principes houdt in dat het systeem wordt opgedeeld in klassenattributen en methoden die entiteiten uit de echte wereld weerspiegelen. Belangrijke componenten zoals voertuigen en parkeerplaatsen kunnen als objecten worden gemodelleerd, terwijl interacties zoals parkeren via methoden kunnen worden afgehandeld. Deze aanpak bevordert de modulariteit, herbruikbaarheid en onderhoudbaarheid, waardoor het systeem eenvoudig uit te breiden en te beheren is.

Hoe-een-parkeerplaats-ontwerpen met behulp van objectgeoriënteerde principesHoe ontwerp je een parkeerplaats volgens objectgeoriënteerde principes?

Aannames

Voor onze doeleinden op dit moment maken we de volgende aannames. We hebben deze specifieke aannames gemaakt om een ​​beetje complexiteit aan het probleem toe te voegen, zonder al te veel toe te voegen.

  • De parkeerplaats heeft meerdere niveaus. Elk niveau heeft meerdere rijen plekken.
  • Op de parkeerplaats kunnen motorfietsen, auto's en bussen geparkeerd worden.
  • De parkeerplaats beschikt over motorplekken, compacte plekken en grote plekken.
  • Een motorfiets kan op elke plek geparkeerd worden.
  • Een auto kan op één compacte plek of op één grote plek parkeren.
  • Een bus kan op vijf grote plekken achter elkaar en binnen dezelfde rij parkeren. Op kleine plekken kan hij niet parkeren. In de onderstaande implementatie hebben we een abstracte klasse Voertuig gecreëerd waarvan Auto, Bus en Motor overerven.

Objectgericht ontwerp

We beginnen met het creëren van de noodzakelijke klassen en zorgen ervoor dat elke klas een duidelijke verantwoordelijkheid heeft. Laten we het ontwerp afbreken met de nadruk op de interactie tussen elke klasse en methode.

1. Voertuigklasse

De Vehicle klasse definieert gemeenschappelijke kenmerken en gedrag voor alle soorten voertuigen. Het zal dienen als basisklasse voor meer specifieke voertuigtypen zoals Bus Car En 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. Concrete voertuigklassen

Bus : Een bus heeft 5 aaneengesloten grote plekken nodig.

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 : Een auto kan op compacte of grote plekken parkeren.

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

Motorfiets : Een motorfiets kan op elke plek parkeren

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 vertegenwoordigt een individuele parkeerplaats op de parkeerplaats. Het is verantwoordelijk voor het beheer van de beschikbaarheid en het verifiëren of een specifiek voertuig op de plek past.

  • We hadden dit kunnen implementeren door klassen te hebben voor LargeSpot CompactSpot en MotorcycleSpot die overerven van ParkingSpot, maar dit is waarschijnlijk overdreven.
  • De vlekken vertonen waarschijnlijk geen ander gedrag dan hun afmetingen. 
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. Parkeerniveauklasse

De Level klasse vertegenwoordigt een niveau op de parkeerplaats. Het beheert een verzameling parkeerplaatsen en biedt methoden om voertuigen te parkeren en te verwijderen.

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. Parkeerplaatsklasse

De ParkingLot klasse vertegenwoordigt de gehele parkeerplaats. Het beheert meerdere niveaus en biedt methoden om voertuigen van de parkeerplaats te parkeren en te verwijderen.

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- en betalingsserviceklassen

Om ticketing en betalingen te beheren, voegen we de Ticket En PaymentService klassen.

Ticketklasse : Vertegenwoordigt het ticket dat wordt uitgegeven wanneer een voertuig parkeert. Het registreert het tijdstip waarop het voertuig de parkeerplaats binnenkomt en verlaat.

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

Betaalserviceklasse : Verantwoordelijk voor het berekenen van het parkeergeld en het verwerken van betalingen.

Java
   publiek     klas   Betaalservice     {      publiek     dubbele     berekenenVergoeding  (  Ticket     ticket  )     {      lang     duur     =     ticket  .  getDuur  ();      // Eenvoudig vergoedingsmodel: `text`=