Cum să proiectați o parcare folosind principii orientate pe obiecte?

Cum să proiectați o parcare folosind principii orientate pe obiecte?

Proiectarea unei parcări folosind principii orientate pe obiect implică defalcarea sistemului în clase de atribute și metode care reflectă entitățile din lumea reală. Componentele cheie precum vehiculele și locurile de parcare pot fi modelate ca obiecte, în timp ce interacțiunile precum parcarea pot fi gestionate prin metode. Această abordare promovează modularitatea, reutilizarea și mentenabilitatea, făcând sistemul ușor de extins și gestionat.

Cum să-proiectezi-o-parcare-folosind-principii-orientate-obiectCum să proiectați o parcare folosind principii orientate pe obiecte?

Ipoteze

În scopurile noastre, acum vom face următoarele ipoteze. Am făcut aceste ipoteze specifice pentru a adăuga un pic de complexitate problemei fără a adăuga prea mult.

  • Parcarea are mai multe niveluri. Fiecare nivel are mai multe rânduri de spoturi.
  • Parcarea poate parca motociclete, mașini și autobuze.
  • Parcarea are locuri pentru motociclete locuri compacte și locuri mari.
  • O motocicleta poate parca in orice loc.
  • O mașină poate parca fie într-un singur loc compact, fie într-un singur loc mare.
  • Un autobuz poate parca în cinci locuri mari care sunt consecutive și în același rând. Nu poate parca în locuri mici. În implementarea de mai jos am creat o clasă abstractă Vehicule de la care moștenesc Autobuzul și Motocicleta.

Design orientat pe obiecte

Începem prin a crea clasele necesare și ne asigurăm că fiecare clasă are o responsabilitate unică clară. Să defalcăm designul, concentrându-ne pe modul în care interacționează fiecare clasă și metodă.

1. Clasa de vehicule

The Vehicle clasa definește atribute și comportamente comune pentru toate tipurile de vehicule. Va servi ca o clasă de bază pentru tipuri de vehicule mai specifice, cum ar fi Bus Car şi 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. Clasele de vehicule din beton

Autobuz : Un autobuz necesită 5 locuri mari consecutive.

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

masina : O mașină poate parca fie în locuri compacte, fie în locuri mari.

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

Motocicletă : O motocicletă poate parca în orice loc

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. Clasa ParkSpot

The ParkingSpot clasa reprezintă un loc de parcare individual în parcare. Acesta este responsabil pentru gestionarea disponibilității acestuia și pentru verificarea dacă un anumit vehicul poate încăpea la fața locului.

  • Am fi putut implementa acest lucru având clase pentru LargeSpot CompactSpot și MotorcycleSpot care moștenesc de la ParkingSpot, dar acest lucru este probabil exagerat.
  • Petele probabil nu au comportamente diferite, altele decât dimensiunile lor. 
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. Clasa ParkingLevel

The Level clasa reprezintă un nivel în parcare. Gestionează o colecție de locuri de parcare și oferă metode de parcare și de îndepărtare a vehiculelor.

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. Clasa de parcare

The ParkingLot clasa reprezintă întreaga parcare. Gestionează mai multe niveluri și oferă metode de parcare și de îndepărtare a vehiculelor din parcare.

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. Clasele de servicii de plăți și bilete

Pentru a gestiona biletele și plățile, adăugăm Ticket şi PaymentService clasele.

Clasa de bilete : Reprezintă biletul emis la parcarea unui vehicul. Înregistrează ora la care vehiculul intră și iese din parcare.

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

Clasa PaymentService : Responsabil cu calcularea taxei de parcare și procesarea plăților.

Java
   public     clasă   Serviciu de plată     {      public     dubla     calculateFee  (  Bilet     bilet  )     {      lung     durată     =     bilet  .  getDuration  ();      // Model de taxă simplu: `text`=