logo

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 amb principis orientats a objectes' title=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

ElVehicleclasse 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 comBus CariMotorcycle.

travessa d'arbres
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. 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

què és rom
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

ElParkingSpotclasse 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. 
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. Classe d'aparcament

ElLevelclasse representa un nivell a l'aparcament. Gestiona una col·lecció de places d'aparcament i ofereix mètodes per aparcar i retirar vehicles.

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. Classe d'aparcament

ElParkingLotclasse representa tot l'aparcament. Gestiona diversos nivells i proporciona mètodes per aparcar i treure vehicles de l'aparcament.

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. Classes de serveis de pagament i entrades

Per gestionar les entrades i els pagaments afegim elTicketiPaymentServiceclasses.

formes normals

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`=