Menu
Coddy logo textTech

Araç Kiralama Hizmeti

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 91 / 91.

challenge icon

Görev

Kolay

Araç Kiralama Hizmeti sistemini oluşturalım; bu sistem bir araç filosunu yönetir, müşteri kiralamalarını takip eder ve araç türüne göre fiyatlandırma yapar. Bu kapsamlı görev, gerçekçi bir kiralama işletmesi uygulaması oluşturmak için kalıtım, arayüzler, kapsülleme ve State desenini bir araya getirir.

Kodunuzu yedi dosyaya ayıracaksınız:

  • VehicleState.php: Bir aracın bulunabileceği farklı durumları temsil eden bir VehicleState arayüzü tanımlayın. İki yöntem ekleyin: getStatus(): string ve canRent(): bool. Ardından bu arayüzü uygulayan üç sınıf oluşturun:
    • AvailableState: "Available" ve true döndürür
    • RentedState: "Rented" ve false döndürür
    • MaintenanceState: "Maintenance" ve false döndürür
  • Vehicle.php: Vehicle dosyasını dahil edin. Vehicle (string, public readonly), licensePlate (string, public readonly) ve brand (float, protected) için kurucu destekli, soyut bir dailyRate sınıfı oluşturun. Mevcut durumu, varsayılan olarak AvailableState olacak şekilde özel bir özellikte saklayın. Şunları uygulayın:
    • getState(): VehicleState: mevcut durumu döndürür
    • setState(VehicleState $state): void: durumu değiştirir
    • getStatus(): string: durumun getStatus() yöntemine yönlendirir
    • canRent(): bool: durumun canRent() yöntemine yönlendirir
    • abstract calculateCost(int $days): float: her araç türü farklı şekilde hesaplama yapar
    • getType(): string: static::class kullanarak sınıf adını döndürür
  • Vehicles.php: Vehicle dosyasını dahil edin. Üç somut araç sınıfı oluşturun:
    • Car: Vehicle sınıfını genişletir; calculateCost(), dailyRate * days döndürür
    • Motorcycle: Vehicle sınıfını genişletir; calculateCost(), dailyRate * days * 0.8 döndürür (%20 indirim)
    • Van: Ek bir $mileageRate (float) parametresiyle Vehicle sınıfını genişletir; calculateCost(int $days, int $miles = 0), (dailyRate * days) + (mileageRate * miles) döndürür
  • Customer.php: Customer (int, public readonly) ve id (string, public readonly) için kurucu destekli bir name sınıfı oluşturun. Kiralama geçmişini özel bir dizide takip edin. Şunları uygulayın:
    • addRental(string $vehiclePlate, float $cost): void: geçmişe ekler
    • getRentalCount(): int: kiralama sayısını döndürür
    • getTotalSpent(): float: tüm kiralama maliyetlerinin toplamını döndürür
  • Rental.php: Vehicle ve Customer dosyalarını dahil edin. Bir müşteriyi bir araca bağlayan bir Rental sınıfı oluşturun. customer (Customer, public readonly), vehicle (Vehicle, public readonly), days (int, private) ve isteğe bağlı olarak miles (int, private, varsayılan değer 0) için kurucu desteğini kullanın. Şunları uygulayın:
    • calculateTotal(): float: araç bir Van ise calculateCost() yöntemine miles değerini gönderir; aksi takdirde yalnızca days değerini gönderir
    • complete(): string: toplamı hesaplar, müşteri geçmişine ekler, aracı AvailableState durumuna getirir ve "Rental completed: $[total]" döndürür (2 ondalık basamak)
  • RentalService.php: Rental ve Vehicles dosyalarını dahil edin. Filoyu yöneten bir RentalService sınıfı oluşturun. Araçları license plate ile indekslenmiş özel bir dizide saklayın. Şunları uygulayın:
    • addVehicle(Vehicle $vehicle): void: filoya ekler
    • findVehicle(string $plate): ?Vehicle: aracı veya null değerini döndürür
    • getAvailableVehicles(): array: canRent() değeri true olan araçları döndürür
    • rentVehicle(Customer $customer, string $plate, int $days, int $miles = 0): string|Rental: araç bulunamazsa "Vehicle not found" döndürür; kullanılabilir değilse "Vehicle is not available" döndürür; aksi takdirde aracı RentedState durumuna getirir ve yeni bir Rental nesnesi döndürür
    • setMaintenance(string $plate): string: aracı MaintenanceState durumuna getirir; "[plate] set to maintenance" veya "Vehicle not found" döndürür
  • main.php: RentalService ve Customer dosyalarını dahil edin. Üç girdi alacaksınız: filo verileri (JSON), müşteri verileri (JSON) ve işlemler (JSON).

    Filo JSON biçimi:

    [{"type": "car", "plate": "CAR-001", "brand": "Toyota", "rate": 50}, {"type": "van", "plate": "VAN-001", "brand": "Ford", "rate": 80, "mileage_rate": 0.25}]

    Müşteri JSON biçimi:

    {"id": 1, "name": "Alice"}

    İşlemler JSON biçimi:

    [{"op": "available"}, {"op": "rent", "plate": "CAR-001", "days": 3}, {"op": "complete", "plate": "CAR-001"}, {"op": "maintenance", "plate": "VAN-001"}, {"op": "customer_stats"}]

    Kiralama hizmetini oluşturun, tüm araçları filoya ekleyin ve müşteriyi oluşturun. Aktif kiralamaları plate değerine göre takip edin. Her işlemi işleyin:

    • "available": "Available vehicles: [count]" yazdırın
    • "rent": Aracı kiralayın; başarılı olursa Rental nesnesini saklayın ve "Rented [plate] for [days] days" yazdırın; araç Van ise işlemden miles değerini dahil edin; aksi takdirde hata mesajını yazdırın
    • "complete": O plate değeri için saklanan kiralamayı tamamlayın; sonucu yazdırın
    • "maintenance": setMaintenance() sonucunu yazdırın
    • "status": Verilen plate değeri için "[plate]: [status]" yazdırın
    • "customer_stats": "[name]: [count] rentals, $[total] spent" yazdırın (2 ondalık basamak)

    Her sonucu yeni bir satıra yazdırın.

Bu sistem, State deseninin karmaşık koşullu ifadeler olmadan araç kullanılabilirliğini nasıl zarif bir şekilde yönettiğini, kalıtımın polimorfik fiyatlandırmaya sahip temiz bir araç hiyerarşisini nasıl oluşturduğunu ve kapsüllemenin iş akışı boyunca kiralama verilerinin bütünlüğünü nasıl koruduğunu gösterir.

Kendin dene

<?php

require_once 'RentalService.php';
require_once 'Customer.php';

// Girdileri oku
$fleetJson = trim(fgets(STDIN));
$customerJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));

// JSON verilerini ayrıştır
$fleetData = (array)json_decode($fleetJson, true);
$customerData = (array)json_decode($customerJson, true);
$operations = (array)json_decode($operationsJson, true);

// TODO: RentalService örneği oluştur

// TODO: Türe göre tüm araçları filoya ekle:
// - "car" -> new Car(plate, brand, rate)
// - "motorcycle" -> new Motorcycle(plate, brand, rate)
// - "van" -> new Van(plate, brand, rate, mileage_rate)

// TODO: customerData'dan Customer örneği oluştur

// TODO: Aktif kiralamaları plakaya göre takip etmek için dizi oluştur
$activeRentals = [];

// TODO: Her işlemi işle ve sonuçları yazdır:
// - "available": Print "Available vehicles: [count]"
// - "rent": Aracı kirala, başarılıysa Rental'ı sakla, sonucu yazdır
// - "complete": Kiralamayı tamamla, sonucu yazdır
// - "maintenance": Bakım ayarla, sonucu yazdır
// - "status": "[plate]: [status]" yazdır
// - "customer_stats": "[name]: [count] rentals, $[total] spent" yazdır

foreach ($operations as $op) {
    $operation = (array)$op;
    $opType = $operation['op'];
    
    // TODO: Her işlem türünü işle
    switch ($opType) {
        case 'available':
            // TODO: Print available vehicle count
            break;
        case 'rent':
            // TODO: Aracı kirala ve sonucu yazdır
            break;
        case 'complete':
            // TODO: Kiralamayı tamamla ve sonucu yazdır
            break;
        case 'maintenance':
            // TODO: Bakım ayarla ve sonucu yazdır
            break;
        case 'status':
            // TODO: Araç durumunu yazdır
            break;
        case 'customer_stats':
            // TODO: Müşteri istatistiklerini yazdır
            break;
    }
}

?>

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online PHP derleyicisi