כיצד לעצב חניה באמצעות עקרונות מוכווני עצמים?

כיצד לעצב חניה באמצעות עקרונות מוכווני עצמים?

עיצוב מגרש חניה באמצעות עקרונות מונחה עצמים כרוך בפירוק המערכת לתכונות ושיטות מחלקות המשקפות ישויות בעולם האמיתי. ניתן לעצב רכיבים מרכזיים כמו כלי רכב ומקומות חניה כאובייקטים בעוד שניתן לטפל באינטראקציות כגון חניה באמצעות שיטות. גישה זו מקדמת שימוש חוזר ותחזוקה מודולריות מה שהופך את המערכת לקלה להרחבה ולניהול.

איך-לעצב-מגרש-חניה-באמצעות-עקרונות-מוכווני-אובייקטכיצד לעצב חניה באמצעות עקרונות מכווני עצמים?

הנחות

למטרותינו כרגע, נניח את ההנחות הבאות. הנחנו את ההנחות הספציפיות האלה כדי להוסיף קצת מורכבות לבעיה מבלי להוסיף יותר מדי.

  • לחניון מספר מפלסים. לכל רמה יש מספר שורות של נקודות.
  • החניון יכול להחנות אופנועים מכוניות ואוטובוסים.
  • בחניון יש ספוטים לאופנועים ספוטים קומפקטיים וספוטים גדולים.
  • אופנוע יכול להחנות בכל מקום.
  • מכונית יכולה לחנות במקום קומפקטי בודד או במקום גדול אחד.
  • אוטובוס יכול לחנות בחמישה מקומות גדולים שהם עוקבים ובתוך אותה שורה. הוא לא יכול לחנות במקומות קטנים. ביישום שלהלן יצרנו רכב בכיתה אבסטרקטית שממנו יורשים אוטובוס רכב ואופנוע.

עיצוב מונחה עצמים

אנו מתחילים ביצירת השיעורים הדרושים ומבטיחים שלכל כיתה תהיה אחריות יחידה ברורה. בואו נפרק את העיצוב תוך התמקדות באינטראקציה בין כל מחלקה ושיטה.

1. מחלקת רכב

ה Vehicle מחלקה מגדירה תכונות והתנהגויות נפוצות עבור כל סוגי הרכבים. זה ישמש כמחלקה בסיס לסוגי רכב ספציפיים יותר כמו Bus Car ו 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. חוגי בטון לרכב

אוֹטוֹבּוּס : אוטובוס דורש 5 מקומות גדולים רצופים.

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

מְכוֹנִית : מכונית יכולה לחנות במקומות קומפקטיים או גדולים.

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

אוֹפנוֹעַ : אופנוע יכול לחנות בכל מקום

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

ה ParkingSpot מחלקה מייצגת מקום חניה בודד בחניון. היא אחראית לניהול זמינותו ולוודא האם רכב ספציפי יכול להתאים במקום.

  • יכולנו ליישם את זה על ידי קיום מחלקות עבור LargeSpot CompactSpot ו-MotorcycleSpot שיורשים מ-ParkingSpot אבל זה כנראה מוגזם.
  • לכתמים כנראה אין התנהגויות שונות מלבד הגדלים שלהם. 
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. כיתה ברמת חנייה

ה Level כיתה מייצגת רמה בחניון. הוא מנהל אוסף של מקומות חניה ומספק שיטות לחנייה והסרה של כלי רכב.

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. כיתת חניה

ה ParkingLot הכיתה מייצגת את כל החניון. הוא מנהל מספר רמות ומספק שיטות לחנייה והסרה של כלי רכב מהחניון.

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 ו PaymentService שיעורים.

כיתת כרטיסים : מייצג את הכרטיס שהופק כאשר רכב חונה. הוא מתעד את הזמן שבו הרכב נכנס ויוצא מהחנייה.

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

מחלקת שירותי תשלום : אחראי על חישוב אגרת החניה ועיבוד התשלומים.

Java
   פּוּמְבֵּי     מַחלָקָה   שירות תשלום     {      פּוּמְבֵּי     לְהַכפִּיל     לחשב עמלה  (  כַּרְטִיס     כַּרְטִיס  )     {      אָרוֹך     מֶשֶׁך     =     כַּרְטִיס  .  getDuration  ();      // מודל עמלות פשוט: `טקסט`=