Het ontwerpen van een parkeerplaats met behulp van objectgeoriënteerde principes houdt in dat het systeem wordt opgedeeld in klassenattributen en methoden die entiteiten uit de echte wereld weerspiegelen. Belangrijke componenten zoals voertuigen en parkeerplaatsen kunnen als objecten worden gemodelleerd, terwijl interacties zoals parkeren via methoden kunnen worden afgehandeld. Deze aanpak bevordert de modulariteit, herbruikbaarheid en onderhoudbaarheid, waardoor het systeem eenvoudig uit te breiden en te beheren is.
Hoe ontwerp je een parkeerplaats volgens objectgeoriënteerde principes?Aannames
Voor onze doeleinden op dit moment maken we de volgende aannames. We hebben deze specifieke aannames gemaakt om een beetje complexiteit aan het probleem toe te voegen, zonder al te veel toe te voegen.
- De parkeerplaats heeft meerdere niveaus. Elk niveau heeft meerdere rijen plekken.
- Op de parkeerplaats kunnen motorfietsen, auto's en bussen geparkeerd worden.
- De parkeerplaats beschikt over motorplekken, compacte plekken en grote plekken.
- Een motorfiets kan op elke plek geparkeerd worden.
- Een auto kan op één compacte plek of op één grote plek parkeren.
- Een bus kan op vijf grote plekken achter elkaar en binnen dezelfde rij parkeren. Op kleine plekken kan hij niet parkeren. In de onderstaande implementatie hebben we een abstracte klasse Voertuig gecreëerd waarvan Auto, Bus en Motor overerven.
Objectgericht ontwerp
We beginnen met het creëren van de noodzakelijke klassen en zorgen ervoor dat elke klas een duidelijke verantwoordelijkheid heeft. Laten we het ontwerp afbreken met de nadruk op de interactie tussen elke klasse en methode.
1. Voertuigklasse
DeVehicleklasse definieert gemeenschappelijke kenmerken en gedrag voor alle soorten voertuigen. Het zal dienen als basisklasse voor meer specifieke voertuigtypen zoalsBus CarEnMotorcycle.
centos versus rhelJava
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. Concrete voertuigklassen
Bus : Een bus heeft 5 aaneengesloten grote plekken nodig.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
Auto : Een auto kan op compacte of grote plekken parkeren.
Javapublic 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; } }
Motorfiets : Een motorfiets kan op elke plek parkeren
Javapublic 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-klasse
DeParkingSpotklasse vertegenwoordigt een individuele parkeerplaats op de parkeerplaats. Het is verantwoordelijk voor het beheer van de beschikbaarheid en het verifiëren of een specifiek voertuig op de plek past.
- We hadden dit kunnen implementeren door klassen te hebben voor LargeSpot CompactSpot en MotorcycleSpot die overerven van ParkingSpot, maar dit is waarschijnlijk overdreven.
- De vlekken vertonen waarschijnlijk geen ander gedrag dan hun afmetingen.
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. Parkeerniveauklasse
DeLevelklasse vertegenwoordigt een niveau op de parkeerplaats. Het beheert een verzameling parkeerplaatsen en biedt methoden om voertuigen te parkeren en te verwijderen.
nieuwe regel in pythonJava
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. Parkeerplaatsklasse
DeParkingLotklasse vertegenwoordigt de gehele parkeerplaats. Het beheert meerdere niveaus en biedt methoden om voertuigen van de parkeerplaats te parkeren en te verwijderen.
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- en betalingsserviceklassen
Om ticketing en betalingen te beheren, voegen we deTicketEnPaymentServiceklassen.
Ticketklasse : Vertegenwoordigt het ticket dat wordt uitgegeven wanneer een voertuig parkeert. Het registreert het tijdstip waarop het voertuig de parkeerplaats binnenkomt en verlaat.
Javapublic 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 } }
Betaalserviceklasse : Verantwoordelijk voor het berekenen van het parkeergeld en het verwerken van betalingen.
Javapubliek klas Betaalservice { publiek dubbele berekenenVergoeding(Ticket ticket) { lang duur = ticket.getDuur(); // Eenvoudig vergoedingsmodel: `text`=