Menu
Coddy logo textTech

Araç Kiralama Servisi

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 110 / 110.

challenge icon

Görev

Kolay

OOP kursunun final görevine ulaştığınız için tebrikler! Öğrendiğiniz her şeyi — soyut sınıflar, kalıtım, kapsülleme, State deseni, Factory deseni ve generic yapıları — bir araya getiren kapsamlı bir Araç Kiralama Servisi inşa edelim.

Kiralama servisiniz farklı araç türlerini yönetecek, müsaitlik durumlarını takip edecek, kiralamaları gerçekleştirecek ve müşteri kayıtlarını tutacaktır. Bu yapıyı yedi dosya halinde organize edeceksiniz:

  • vehicle_state.dart: Araçların farklı durumlarda nasıl davranacağını tanımlayan bir VehicleState soyut sınıfı oluşturun. String getStatus() ve bool canRent() soyut metotlarını ekleyin. Ardından üç somut durum oluşturun:
    • AvailableState - Available değerini döndürür ve kiralamaya izin verir
    • RentedState - Rented değerini döndürür ve kiralamaya izin vermez
    • MaintenanceState - In Maintenance değerini döndürür ve kiralamaya izin vermez
  • vehicle.dart: final id (String), final model (String), getter'ı olan özel bir _dailyRate (double) ve başlangıç değeri AvailableState olan özel bir _state (VehicleState) içeren soyut bir Vehicle sınıfı oluşturun. Şunları ekleyin:
    • Durumun statüsünü döndüren bir status getter'ı
    • bool isAvailable() - mevcut durumun kiralamaya izin verip vermediğini kontrol eder
    • void setState(VehicleState state) - aracın durumunu değiştirir
    • Soyut bir metot: double calculateRentalCost(int days)
    • Soyut bir metot: String getRequirements() - özel gereksinimleri döndürür
    toString() metodunu, [Type] model (id) - status (burada Type, çalışma zamanı türüdür) döndürecek şekilde geçersiz kılın (override).
  • vehicles.dart: Vehicle sınıfını genişleten üç araç türü oluşturun:
    • Car - standart kiralama maliyeti, günlük ücret çarpı gün sayısıdır. Gereksinimler: Valid driver's license
    • Motorcycle - kiralama maliyeti, günlük ücret çarpı gün sayısı üzerinden %10 indirimli halidir. Gereksinimler: Motorcycle license, Age 21+
    • Truck - kiralama maliyeti, günlük ücret çarpı gün sayısı artı 50$ sabit ücrettir. Gereksinimler: Commercial license, Deposit required
  • vehicle_factory.dart: Türüne (car, motorcycle veya truck) göre uygun aracı döndüren statik bir Vehicle create(String type, String id, String model, double dailyRate) metoduna sahip bir VehicleFactory sınıfı oluşturun. Bilinmeyen türler için varsayılan olarak bir Car oluşturun.
  • customer.dart: Bir id (String), name (String) ve kiralama kayıtlarından oluşan özel bir listeye (String listesi) sahip bir Customer sınıfı oluşturun. Şunları ekleyin:
    • addRental(String vehicleInfo) - bir kiralama kaydı ekler
    • getRentalCount() - kiralama sayısını döndürür
    • bool isEligible() - müşterinin 3'ten az aktif kiralaması varsa true döndürür
    toString() metodunu Customer: name (id) - X rentals döndürecek şekilde geçersiz kılın.
  • rental_service.dart: Filo için List<Vehicle> ve müşteriler için List<Customer> içeren, generic yapılar kullanan bir RentalService sınıfı oluşturun. Şunları ekleyin:
    • addVehicle(Vehicle vehicle) - filoya ekler, Added: vehicle.toString() yazdırır
    • registerCustomer(Customer customer) - müşteriyi kaydeder
    • rentVehicle(String customerId, String vehicleId, int days) - müşteri mevcutsa, uygunsa ve araç müsaitse: araç durumunu Rented olarak değiştirir, müşteriye kiralamayı ekler, customerId rented vehicleId for X days. Cost: $Y (Y, 2 ondalık basamaklı) yazdırır. Aksi takdirde uygun mesajı yazdırır: Customer not found, Customer not eligible, Vehicle not found veya Vehicle not available
    • returnVehicle(String vehicleId) - araç durumunu Available yapar, vehicleId returned yazdırır
    • sendToMaintenance(String vehicleId) - araç durumunu Maintenance yapar, vehicleId sent to maintenance yazdırır
    • getAvailableVehicles() - müsait araçların listesini döndürür
  • main.dart: Kiralama servisinizi gösterin. Bir RentalService oluşturun ve factory kullanarak üç araç ekleyin:
    • Bir araba: V001, Toyota Camry, günlük 45$
    • Bir motosiklet: V002, Honda CBR, günlük 35$
    • Bir kamyon: V003, Ford F-150, günlük 75$
    Bir müşteri kaydedin (C001, Alice Johnson) ve müşteriyi yazdırın. Kamyonun gereksinimlerini yazdırın. Arabayı Alice'e 3 günlüğüne kiralayın. Arabayı tekrar kiralamayı deneyin (başarısız olmalı). Motosikleti bakıma gönderin. Kaç aracın müsait olduğunu Available vehicles: X şeklinde yazdırın. Arabayı iade edin. Son müsaitlik sayısını yazdırın.

Beklenen çıktı:

Added: [Car] Toyota Camry (V001) - Available
Added: [Motorcycle] Honda CBR (V002) - Available
Added: [Truck] Ford F-150 (V003) - Available
Customer: Alice Johnson (C001) - 0 rentals
Commercial license, Deposit required
C001 rented V001 for 3 days. Cost: $135.00
Vehicle not available
V002 sent to maintenance
Available vehicles: 1
V001 returned
Available vehicles: 2

Kendin dene

import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';

void main() {
  // TODO: Bir RentalService örneği oluşturun
  
  // TODO: Üç araç oluşturmak ve eklemek için VehicleFactory kullanın:
  // - Car: V001, Toyota Camry, $45/gün
  // - Motorcycle: V002, Honda CBR, $35/gün
  // - Truck: V003, Ford F-150, $75/gün
  
  // TODO: Bir müşteri kaydedin (C001, Alice Johnson)
  
  // TODO: Müşteriyi yazdırın
  
  // TODO: Kamyonun gereksinimlerini yazdırın (kamyonu bulun ve getRequirements() metodunu çağırın)
  
  // TODO: Arabayı (V001) Alice'e (C001) 3 günlüğüne kiralayın
  
  // TODO: Arabayı tekrar kiralamayı deneyin (başarısız olmalı - müsait değil)
  
  // TODO: Motosikleti (V002) bakıma gönderin
  
  // TODO: Mevcut araç sayısını 'Available vehicles: X' olarak yazdırın
  
  // TODO: Arabayı (V001) iade edin
  
  // TODO: Nihai mevcut araç sayısını yazdırın
}

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