Com dissenyar un aparcament utilitzant principis orientats a objectes?
Dissenyar un aparcament utilitzant principis orientats a objectes implica desglossar el sistema en classes d'atributs i mètodes que reflecteixen entitats del món real. Els components clau com els vehicles i les places d'aparcament es poden modelar com a objectes, mentre que les interaccions com l'aparcament es poden gestionar mitjançant mètodes. Aquest enfocament promou la reutilització i el manteniment de la modularitat fent que el sistema sigui fàcil d'estendre i gestionar.
Com dissenyar un aparcament utilitzant principis orientats a objectes? Hipòtesis
Per als nostres propòsits ara mateix farem les suposicions següents. Hem fet aquestes suposicions específiques per afegir una mica de complexitat al problema sense afegir-hi massa.
- L'aparcament té diversos nivells. Cada nivell té diverses files de punts.
- L'aparcament pot aparcar motos, cotxes i autobusos.
- El pàrquing disposa de places de motos, places compactes i espais grans.
- Una moto pot aparcar a qualsevol lloc.
- Un cotxe pot aparcar en un sol lloc compacte o en un sol gran lloc.
- Un autobús pot aparcar en cinc espais grans consecutius i dins de la mateixa fila. No es pot aparcar en llocs petits. A la implementació següent, hem creat una classe abstracta Vehicle de la qual hereten Car Bus i Motocicleta.
Disseny Orientat a Objectes
Comencem creant les classes necessàries i assegurant que cada classe té una responsabilitat única clara. Desglossem el disseny centrant-nos en com interactuen cada classe i mètode.
1. Classe de vehicles
El Vehicle classe defineix atributs i comportaments comuns per a tot tipus de vehicles. Servirà com a classe base per a tipus de vehicles més específics com Bus Car i 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. Classes de vehicles de formigó
Autobús : Un autobús requereix 5 espais grans consecutius.
Java public class Bus extends Vehicle { public Bus ( String licensePlate ) { super ( licensePlate VehicleSize . Large ); } public boolean canFitInSpot ( ParkingSpot spot ) { return spot . getSpotSize () == VehicleSize . Large ; } }
Cotxe : Un cotxe pot aparcar en llocs compactes o grans.
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 ; } }
Motocicleta : Una moto pot aparcar a qualsevol lloc
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. Classe ParkSpot
El ParkingSpot classe representa una plaça d'aparcament individual a l'aparcament. S'encarrega de gestionar la seva disponibilitat i verificar si un vehicle concret pot cabre al lloc.
- Podríem haver implementat això tenint classes per a LargeSpot CompactSpot i MotorcycleSpot que hereten de ParkingSpot, però això probablement està exagerat.
- Les taques probablement no tenen comportaments diferents a part de les seves mides.
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. Classe d'aparcament
El Level classe representa un nivell a l'aparcament. Gestiona una col·lecció de places d'aparcament i ofereix mètodes per aparcar i retirar vehicles.
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. Classe d'aparcament
El ParkingLot classe representa tot l'aparcament. Gestiona diversos nivells i proporciona mètodes per aparcar i treure vehicles de l'aparcament.
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. Classes de serveis de pagament i entrades
Per gestionar les entrades i els pagaments afegim el Ticket i PaymentService classes.
Classe d'entrades : Representa el tiquet emès quan un vehicle estaciona. Registra l'hora en què el vehicle entra i surt de l'aparcament.
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 } }
Classe PaymentService : Responsable del càlcul de la tarifa d'aparcament i de la tramitació dels pagaments.
Java públic classe Servei de pagament { públic doble calcula la tarifa ( Bitllet bitllet ) { llarg durada = bitllet . getDuration (); // Model de tarifa simple: `text`=