logo

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ő.

Parkoló-tervezés az objektumorientált elvek használatával' title=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

AVehicleosztá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 plBus CarésMotorcycle.

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

tavaszi csizma
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

AParkingSpotosztá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. 
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. Parkolási szintű osztály

ALevelosztá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.

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. Parkoló osztály

AParkingLotosztá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.

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. Jegy- és fizetési szolgáltatás osztályok

A jegyértékesítés és a fizetések kezeléséhez hozzáadjuk aTicketésPaymentServiceosztá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`=