Nesne yönelimli ilkeleri kullanarak bir otopark tasarlamak, sistemi gerçek dünyadaki varlıkları yansıtan sınıf niteliklerine ve yöntemlerine ayırmayı içerir. Araçlar ve park alanları gibi temel bileşenler nesneler olarak modellenebilirken, park etme gibi etkileşimler de yöntemlerle ele alınabilir. Bu yaklaşım, modülerliğin yeniden kullanılabilirliğini ve sürdürülebilirliğini teşvik ederek sistemin genişletilmesini ve yönetilmesini kolaylaştırır.
Nesneye yönelik ilkeleri kullanarak bir otopark nasıl tasarlanır?Varsayımlar
Şu anki amaçlarımız doğrultusunda aşağıdaki varsayımları yapacağız. Bu özel varsayımları, soruna çok fazla eklemeden biraz karmaşıklık katmak için yaptık.
- Otoparkta birden fazla seviye bulunmaktadır. Her seviyede birden fazla nokta sırası bulunur.
- Otoparka motosiklet, araba ve otobüs park edilebilir.
- Otoparkta motosiklet park yerleri kompakt alanlar ve büyük alanlar bulunmaktadır.
- Bir motosiklet her yere park edebilir.
- Bir araba tek bir kompakt alana veya tek bir büyük noktaya park edebilir.
- Bir otobüs ardışık ve aynı sıra içerisinde beş büyük noktaya park edebilir. Küçük yerlere park edilemez. Aşağıdaki uygulamada, Araba Otobüsü ve Motosikletin miras aldığı soyut bir Araç sınıfı oluşturduk.
Nesneye Yönelik Tasarım
Gerekli sınıfları oluşturarak ve her sınıfın net ve tek bir sorumluluğa sahip olmasını sağlayarak başlıyoruz. Her sınıfın ve yöntemin nasıl etkileşim kurduğuna odaklanarak tasarımı parçalara ayıralım.
1. Araç Sınıfı
Vehiclesınıf, tüm araç türleri için ortak özellikleri ve davranışları tanımlar. Daha spesifik araç türleri için temel sınıf görevi görecekBus CarVeMotorcycle.
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. Beton Araç Sınıfları
Otobüs : Bir otobüs ardışık 5 büyük noktaya ihtiyaç duyar.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
Araba : Bir araba hem kompakt hem de geniş alanlara park edilebilir.
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; } }
Motosiklet : Bir motosiklet herhangi bir yere park edebilir
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 Sınıfı
ParkingSpotsınıf, otoparktaki bireysel bir park yerini temsil eder. Kullanılabilirliğini yönetmek ve belirli bir aracın oraya sığıp sığamayacağını doğrulamaktan sorumludur.
- Bunu, ParkingSpot'tan miras alan LargeSpot CompactSpot ve MotorcycleSpot sınıflarına sahip olarak uygulayabilirdik, ancak bu muhtemelen abartılıyor.
- Lekelerin boyutları dışında muhtemelen farklı davranışları yoktur.
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. Park Seviyesi Sınıfı
Levelsınıf otoparktaki bir seviyeyi temsil eder. Bir dizi park yerini yönetir ve araçları park etmek ve kaldırmak için yöntemler sağlar.
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. Otopark Sınıfı
ParkingLotsınıf tüm otoparkı temsil eder. Birden fazla seviyeyi yönetir ve araçları park yerine park etmek ve park yerinden çıkarmak için yöntemler sağlar.
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. Bilet ve Ödeme Hizmeti Sınıfları
Biletleme ve ödemeleri yönetmek için şunu ekleriz:TicketVePaymentServicesınıflar.
Bilet Sınıfı : Araç park ettiğinde kesilen bileti ifade eder. Aracın otoparka giriş ve çıkış saatlerini kaydeder.
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 } }
ÖdemeHizmet Sınıfı : Otopark ücretinin hesaplanması ve ödemelerin işlenmesinden sorumludur.
Javahalk sınıf Ödeme Hizmeti { halk çift hesaplaÜcret(Bilet bilet) { uzun süre = bilet.getSüre(); // Basit ücret modeli: `text`=