Menu
Coddy logo textTech

Araç Kiralama Servisi

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

Bu son meydan okuma için, bu kurs boyunca ustalaştığınız tüm OOP kavramlarını bir araya getiren bir Araç Kiralama Servisi sistemi inşa edeceksiniz.

Sisteminiz farklı araç türlerinden oluşan bir filoyu modellemelidir. Plaka, marka ve günlük kiralama ücreti gibi ortak özelliklere sahip temel bir Vehicle sınıfı düşünün. Car, Motorcycle ve Truck gibi alt sınıflar, bunu koltuk sayısı, motor hacmi veya kargo kapasitesi gibi belirli niteliklerle genişletebilir.

Arayüzler kiralama davranışlarını tanımlayabilir: bir Rentable arayüzü rent(), returnVehicle() ve calculateCost(int days) gibi metotlar bildirebilir. Farklı araç türleri fiyatlandırma stratejilerini farklı şekilde uygulayabilir, bu da bunu polimorfizm için mükemmel bir kullanım durumu haline getirir.

Bir RentalAgency sınıfının kompozisyon kullanarak filoyu nasıl yönettiğini düşünün.

VehicleNotAvailableException gibi özel istisnalar uç durumları ele alabilir.

Araçlar oluşturmak için Factory desenini uygulayabilir veya araç kategorileri ve kiralama durumu için enum'ları kullanabilirsiniz.

Bu meydan okuma, eksiksiz ve iyi yapılandırılmış bir OOP sistemi tasarlama yeteneğinizi test eder. Başarılar!

challenge icon

Görev

Kolay

OOP hakkında öğrendiğiniz her şeyi bir araya getiren eksiksiz bir Araç Kiralama Hizmeti oluşturalım! Farklı araç türlerinden oluşan bir filoyu yöneten, uygun doğrulamayla kiralama işlemlerini gerçekleştiren ve araç oluşturmak için factory pattern kullanan bir sistem oluşturacaksınız.

Kodunuzu yedi dosya arasında düzenleyeceksiniz:

  • RentalStatus.java: Bir aracın kiralama durumunu temsil eden bir enum oluşturun. AVAILABLE, RENTED ve MAINTENANCE değerlerini ekleyin. Özel bir description (String) alanı, bir constructor ve bir getter ekleyin. Available için description "ready to rent", rented için "currently in use" ve maintenance için "under service" olmalıdır.
  • VehicleNotAvailableException.java: Exception sınıfını genişleten özel bir exception oluşturun. Constructor bir license plate kabul etmeli ve Vehicle not available: [licensePlate] biçiminde bir mesaj oluşturmalıdır.
  • Rentable.java: Kiralama işlemlerini tanımlayan bir interface oluşturun. Boolean döndüren rent(), boolean döndüren returnVehicle() ve double döndüren calculateCost(int days) metotlarını tanımlayın.
  • Vehicle.java: Tüm araçlar için abstract bir temel sınıf oluşturun. licensePlate (String), brand (String), dailyRate (double) ve AVAILABLE olarak başlatılan status (RentalStatus) için private alanlar ekleyin. Constructor licensePlate, brand ve dailyRate alır. Uygun getter'ları ve status için bir setter ekleyin. String döndüren abstract bir getVehicleType() metodu tanımlayın. Günlük ücret 2 ondalık basamağa biçimlendirilerek getDetails() döndüren bir "[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]" metodu uygulayın.
  • Car.java: Vehicle sınıfını genişleten ve Rentable uygulayan bir sınıf oluşturun. seats (int) için private bir alan ekleyin. Constructor licensePlate, brand, dailyRate ve seats alır. getVehicleType() metodunu "Car" döndürecek şekilde uygulayın. rent() için status AVAILABLE ise bunu RENTED olarak ayarlayın ve true döndürün; aksi durumda false döndürün. returnVehicle() için status RENTED ise bunu AVAILABLE olarak ayarlayın ve true döndürün; aksi durumda false döndürün. calculateCost(int days) için dailyRate ile days değerinin çarpımını döndürün.
  • Motorcycle.java: Vehicle sınıfını genişleten ve Rentable uygulayan bir sınıf oluşturun. engineCC (int) için private bir alan ekleyin. Constructor licensePlate, brand, dailyRate ve engineCC alır. getVehicleType() metodunu "Motorcycle" döndürecek şekilde uygulayın. Rentable metotlarını Car ile aynı şekilde uygulayın, ancak calculateCost() %10 indirim uygulamalıdır (0.9 ile çarpın).
  • RentalAgency.java: ArrayList kullanarak araç filosunu yöneten bir sınıf oluşturun. Şu metotları ekleyin:
    • addVehicle(Vehicle vehicle) - filoya bir araç ekler
    • findVehicle(String licensePlate) - Vehicle veya null döndürür
    • rentVehicle(String licensePlate, int days) - aracı bulur, kiralamayı dener (Rentable'a cast ederek) ve kiralama ücretini döndürür. Araç bulunamazsa veya rent() false döndürürse VehicleNotAvailableException fırlatın
    • returnVehicle(String licensePlate) - aracı bulur ve iade eder, başarı durumunda true döndürür
    • getAvailableVehicles() - AVAILABLE durumundaki araçlardan oluşan bir ArrayList döndürür
  • Main.java: Kiralama hizmetinizi oluşturun! Virgülle ayrılmış bir komut dizesi alacaksınız:
    • ADD_CAR:licensePlate:brand:dailyRate:seats
    • ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC
    • RENT:licensePlate:days
    • RETURN:licensePlate
    • AVAILABLE

    Her komutu işleyin ve şunları yazdırın:

    • ADD_CAR/ADD_MOTORCYCLE: Added: [brand] ([vehicleType])
    • RENT: Rented [licensePlate] for [days] days - Total: $[cost] (cost 2 ondalık basamakla) veya Error: [exception message]
    • RETURN: Returned: [licensePlate] veya Return failed: [licensePlate]
    • AVAILABLE: Available vehicles: ifadesini, ardından her mevcut aracın ayrıntılarını ayrı satırlarda yazdırın

    Tüm komutlardan sonra --- Fleet Summary --- ifadesini, ardından her aracın ayrıntılarını yazdırın.

Tek bir girdi alacaksınız: virgülle ayrılmış komut dizesi.

Örneğin, girdi ADD_CAR:ABC-123:Toyota:50.00:5,ADD_MOTORCYCLE:XYZ-789:Honda:40.00:600,RENT:ABC-123:3,RENT:ABC-123:2,AVAILABLE,RETURN:ABC-123 olduğunda çıktınız şöyle olur:

Added: Toyota (Car)
Added: Honda (Motorcycle)
Rented ABC-123 for 3 days - Total: $150.00
Error: Vehicle not available: ABC-123
Available vehicles:
XYZ-789 Honda (Motorcycle) - $40.00/day - ready to rent
Returned: ABC-123
--- Fleet Summary ---
ABC-123 Toyota (Car) - $50.00/day - ready to rent
XYZ-789 Honda (Motorcycle) - $40.00/day - ready to rent

Bu challenge, kalıtım (Vehicle hiyerarşisi), interface'ler (Rentable), enum'lar (RentalStatus), özel exception'lar, polymorphism (farklı araç türlerini aynı şekilde ele alma) ve composition (araçları yöneten RentalAgency) kavramlarını eksiksiz bir kiralama hizmeti sisteminde bir araya getirir!

Kendin dene

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: Bir RentalAgency örneği oluşturun
        
        // TODO: Bireysel komutları almak için girişi virgüle göre ayırın
        
        // TODO: Her komutu işleyin:
        // ADD_CAR:licensePlate:brand:dailyRate:seats -> "Added: [brand] ([vehicleType])" yazdırın
        // ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC -> "Added: [brand] ([vehicleType])" yazdırın
        // RENT:licensePlate:days -> print "Rented [licensePlate] for [days] days - Total: $[cost]" (2 decimals)
        //                           veya istisna fırlatılırsa "Error: [exception message]" yazdırın
        // RETURN:licensePlate -> "Returned: [licensePlate]" veya "Return failed: [licensePlate]" yazdırın
        // AVAILABLE -> "Available vehicles:" yazdırın ve ardından her bir uygun aracın detaylarını listeleyin
        
        // TODO: Tüm komutlardan sonra "--- Fleet Summary ---" yazdırın
        // ardından her bir aracın detaylarını listeleyin
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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

Kendi başına pratik yap: Online Java derleyicisi