Nesneye Yönelik Prensipleri Kullanarak Otopark Nasıl Tasarlanır?

Nesneye Yönelik Prensipleri Kullanarak Otopark Nasıl Tasarlanır?

Nesne yönelimli ilkeleri kullanarak bir otopark tasarlamak, sistemi gerçek dünyadaki varlıkları yansıtan sınıf niteliklerine ve yöntemlerine ayırmayı içerir. Araçlar ve park alanları gibi temel bileşenler nesneler olarak modellenebilirken, park etme gibi etkileşimler de yöntemlerle ele alınabilir. Bu yaklaşım, modülerliğin yeniden kullanılabilirliğini ve sürdürülebilirliğini teşvik ederek sistemin genişletilmesini ve yönetilmesini kolaylaştırır.

Nesne yönelimli ilkeleri kullanarak bir park yeri nasıl tasarlanırNesneye yönelik ilkeleri kullanarak bir otopark nasıl tasarlanır?

Varsayımlar

Şu anki amaçlarımız doğrultusunda aşağıdaki varsayımları yapacağız. Bu özel varsayımları, soruna çok fazla eklemeden biraz karmaşıklık katmak için yaptık.

  • Otoparkta birden fazla seviye bulunmaktadır. Her seviyede birden fazla nokta sırası bulunur.
  • Otoparka motosiklet, araba ve otobüs park edilebilir.
  • Otoparkta motosiklet park yerleri kompakt alanlar ve büyük alanlar bulunmaktadır.
  • Bir motosiklet her yere park edebilir.
  • Bir araba tek bir kompakt alana veya tek bir büyük noktaya park edebilir.
  • Bir otobüs ardışık ve aynı sıra içerisinde beş büyük noktaya park edebilir. Küçük yerlere park edilemez. Aşağıdaki uygulamada, Araba Otobüsü ve Motosikletin miras aldığı soyut bir Araç sınıfı oluşturduk.

Nesneye Yönelik Tasarım

Gerekli sınıfları oluşturarak ve her sınıfın net ve tek bir sorumluluğa sahip olmasını sağlayarak başlıyoruz. Her sınıfın ve yöntemin nasıl etkileşim kurduğuna odaklanarak tasarımı parçalara ayıralım.

1. Araç Sınıfı

Vehicle sınıf, tüm araç türleri için ortak özellikleri ve davranışları tanımlar. Daha spesifik araç türleri için temel sınıf görevi görecek Bus Car Ve 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. Beton Araç Sınıfları

Otobüs : Bir otobüs ardışık 5 büyük noktaya ihtiyaç duyar.

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

Araba : Bir araba hem kompakt hem de geniş alanlara park edilebilir.

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

Motosiklet : Bir motosiklet herhangi bir yere park edebilir

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 Sınıfı

ParkingSpot sınıf, otoparktaki bireysel bir park yerini temsil eder. Kullanılabilirliğini yönetmek ve belirli bir aracın oraya sığıp sığamayacağını doğrulamaktan sorumludur.

  • Bunu, ParkingSpot'tan miras alan LargeSpot CompactSpot ve MotorcycleSpot sınıflarına sahip olarak uygulayabilirdik, ancak bu muhtemelen abartılıyor.
  • Lekelerin boyutları dışında muhtemelen farklı davranışları yoktur. 
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. Park Seviyesi Sınıfı

Level sınıf otoparktaki bir seviyeyi temsil eder. Bir dizi park yerini yönetir ve araçları park etmek ve kaldırmak için yöntemler sağlar.

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. Otopark Sınıfı

ParkingLot sınıf tüm otoparkı temsil eder. Birden fazla seviyeyi yönetir ve araçları park yerine park etmek ve park yerinden çıkarmak için yöntemler sağlar.

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. Bilet ve Ödeme Hizmeti Sınıfları

Biletleme ve ödemeleri yönetmek için şunu ekleriz: Ticket Ve PaymentService sınıflar.

Bilet Sınıfı : Araç park ettiğinde kesilen bileti ifade eder. Aracın otoparka giriş ve çıkış saatlerini kaydeder.

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

ÖdemeHizmet Sınıfı : Otopark ücretinin hesaplanması ve ödemelerin işlenmesinden sorumludur.

Java
   halk     sınıf   Ödeme Hizmeti     {      halk     çift     hesaplaÜcret  (  Bilet     bilet  )     {      uzun     süre     =     bilet  .  getSüre  ();      // Basit ücret modeli: `text`=