Hogyan tervezzünk parkolót objektum-orientált elvekkel?
A parkoló objektum-orientált elvek használatával történő tervezése magában foglalja a rendszer lebontását osztályattribútumokra és módszerekre, amelyek a való világ entitásait tükrözik. A kulcsfontosságú komponensek, mint például a járművek és a parkolóhelyek objektumként modellezhetők, míg az interakciók, például a parkolás, módszerekkel kezelhetők. Ez a megközelítés elősegíti a moduláris újrafelhasználhatóságot és karbantarthatóságot, így a rendszer könnyen bővíthető és kezelhető.
Hogyan tervezzünk parkolót objektumorientált elvek alapján? Feltételezések
Jelenlegi céljaink érdekében a következő feltételezéseket tesszük. Ezeket a konkrét feltételezéseket azért tettük, hogy egy kicsit bonyolultabbá tegyük a problémát anélkül, hogy túl sokat tennénk hozzá.
- A parkoló több szintes. Minden szinten több sor folt található.
- A parkolóban motorkerékpárok, autók és buszok is beállhatnak.
- A parkolóban motoros helyek, kompakt helyek és nagy helyek találhatók.
- Egy motorkerékpár bárhol parkolhat.
- Egy autó egyetlen kompakt vagy egyetlen nagy helyen is parkolhat.
- Egy autóbusz öt nagy, egymást követő és ugyanazon a sorban lévő helyen tud parkolni. Kis helyen nem tud parkolni. Az alábbi megvalósításban létrehoztunk egy absztrakt járműosztályt, amelyből az autóbusz és a motorkerékpár örököl.
Objektum-orientált tervezés
Kezdjük a szükséges osztályok létrehozásával, és biztosítjuk, hogy minden osztálynak egyértelmű egyetlen felelőssége legyen. Bontsuk fel a tervezést, összpontosítva arra, hogy az egyes osztályok és módszerek hogyan hatnak egymásra.
1. Járműosztály
A Vehicle osztály meghatározza az összes járműtípus közös jellemzőit és viselkedését. Alaposztályként szolgál majd a speciálisabb járműtípusokhoz, mint pl Bus Car és Motorcycle .
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. Betonjármű osztályok
Busz : Egy buszhoz 5 egymást követő nagy hely szükséges.
Java public class Bus extends Vehicle { public Bus ( String licensePlate ) { super ( licensePlate VehicleSize . Large ); } public boolean canFitInSpot ( ParkingSpot spot ) { return spot . getSpotSize () == VehicleSize . Large ; } }
Autó : Egy autó kompakt vagy nagy helyen is parkolhat.
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 ; } }
Motorkerékpár : Egy motorkerékpár bárhol parkolhat
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 osztály
A ParkingSpot osztály egyéni parkolóhelyet jelent a parkolóban. Feladata a rendelkezésre állás kezelése és annak ellenőrzése, hogy egy adott jármű elfér-e a helyszínen.
- Megvalósíthattuk volna ezt a LargeSpot CompactSpot és MotorcycleSpot osztályokkal, amelyek a ParkingSpottól öröklik, de ez valószínűleg túlzás.
- A foltok valószínűleg a méretükön kívül más viselkedést mutatnak.
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. Parkolási szintű osztály
A Level osztály szintet képvisel a parkolóban. Parkolóhelyek gyűjteményét kezeli, és módszereket biztosít a járművek parkolására és eltávolítására.
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. Parkoló osztály
A ParkingLot osztály a teljes parkolót képviseli. Több szintet kezel, és módszereket biztosít a járművek parkolására és a parkolóból való eltávolítására.
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. Jegy- és fizetési szolgáltatás osztályok
A jegyértékesítés és a fizetések kezeléséhez hozzáadjuk a Ticket és PaymentService osztályok.
Jegyosztály : A jármű parkolásakor kiállított jegyet jelöli. Rögzíti azt az időt, amikor a jármű be- és kiszáll a parkolóba.
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 } }
Fizetési szolgáltatás osztály : Felelős a parkolási díj kiszámításáért és a befizetések lebonyolításáért.
Jáva nyilvános osztály Fizetési Szolgáltatás { nyilvános kettős Díj kiszámítása ( Jegy jegy ) { hosszú időtartama = jegy . getDuration (); // Egyszerű díjmodell: `text`=