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 final görevi için, bu kurs boyunca ustalaştığınız tüm OOP kavramlarını bir araya getiren bir Araç Kiralama Servisi sistemi oluşturacaksınız.

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. İyi şanslar!

challenge icon

Görev

Kolay

OOP hakkında öğrendiğiniz her şeyi bir araya getiren eksiksiz bir Araç Kiralama Servisi oluşturalım! Farklı araç türlerinden oluşan bir filoyu yöneten, kiralamaları uygun doğrulama ile gerçekleştiren ve araç oluşturmak için bir fabrika deseni kullanan bir sistem oluşturacaksınız.

Kodunuzu yedi dosya halinde düzenleyeceksiniz:

  • RentalStatus.java: Bir aracın kiralama durumunu temsil eden bir enum oluşturun. AVAILABLE, RENTED ve MAINTENANCE değerlerini içermelidir. Bir private alan description (String), bir constructor ve bir getter ekleyin. Available "ready to rent", rented "currently in use" ve maintenance "under service" açıklamasına sahip olmalıdır.
  • VehicleNotAvailableException.java: Exception sınıfını genişleten özel bir istisna oluşturun. Constructor bir plaka (license plate) kabul etmeli ve Vehicle not available: [licensePlate] formatında bir mesaj oluşturmalıdır.
  • Rentable.java: Kiralama işlemlerini tanımlayan bir arayüz (interface) oluşturun. Boolean döndüren rent(), boolean döndüren returnVehicle() ve double döndüren calculateCost(int days) metodlarını tanımlayın.
  • Vehicle.java: Tüm araçlar için soyut (abstract) bir temel sınıf oluşturun. licensePlate (String), brand (String), dailyRate (double) ve status (RentalStatus, AVAILABLE olarak başlatılmış) için private alanlar ekleyin. Constructor licensePlate, brand ve dailyRate alır. Uygun getter'ları ve status için bir setter'ı dahil edin. String döndüren soyut bir getVehicleType() metodu tanımlayın. dailyRate 2 ondalık basamağa göre formatlanmış şekilde "[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]" döndüren bir getDetails() metodu uygulayın.
  • Car.java: Vehicle sınıfını genişleten ve Rentable arayüzünü uygulayan bir sınıf oluşturun. Bir private alan seats (int) ekleyin. Constructor licensePlate, brand, dailyRate ve seats alır. getVehicleType() metodunu "Car" döndürecek şekilde uygulayın. rent() için, status AVAILABLE ise, onu RENTED olarak ayarlayın ve true döndürün; aksi takdirde false döndürün. returnVehicle() için, status RENTED ise, onu AVAILABLE olarak ayarlayın ve true döndürün; aksi takdirde false döndürün. calculateCost(int days) için, dailyRate çarpı days döndürün.
  • Motorcycle.java: Vehicle sınıfını genişleten ve Rentable arayüzünü uygulayan bir sınıf oluşturun. Bir private alan engineCC (int) ekleyin. Constructor licensePlate, brand, dailyRate ve engineCC alır. getVehicleType() metodunu "Motorcycle" döndürecek şekilde uygulayın. Rentable metodlarını Car ile aynı şekilde uygulayın, ancak calculateCost() %10 indirim uygulamalıdır (0.9 ile çarpın).
  • RentalAgency.java: Bir ArrayList kullanarak araç filosunu yöneten bir sınıf oluşturun. Şu metodları içermelidir:
    • addVehicle(Vehicle vehicle) - filoya bir araç ekler
    • findVehicle(String licensePlate) - Vehicle nesnesini veya null döndürür
    • rentVehicle(String licensePlate, int days) - aracı bulur, kiralamaya çalışır (Rentable'a cast ederek) ve kiralama maliyetini 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çların bir ArrayList'ini döndürür
  • Main.java: Kiralama servisinizi oluşturun! Virgülle ayrılmış bir komut dizisi 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] (maliyet 2 ondalık basamaklı), veya Error: [exception message]
    • RETURN: Returned: [licensePlate] veya Return failed: [licensePlate]
    • AVAILABLE: Available vehicles: yazdırın ve ardından her bir müsait aracın detaylarını ayrı satırlarda yazdırın

    Tüm komutlardan sonra, --- Fleet Summary --- yazdırın ve ardından her aracın detaylarını listeleyin.

Bir girdi alacaksınız: virgülle ayrılmış komut dizisi.

Örneğin, 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 girdisi ile çıktınız şöyle olacaktır:

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 meydan okuma; kalıtım (Vehicle hiyerarşisi), arayüzler (Rentable), enumlar (RentalStatus), özel istisnalar, polimorfizm (farklı araç türlerine tek tip davranma) ve kompozisyonu (araçları yöneten RentalAgency) eksiksiz bir kiralama servisi sisteminde birleştirir!

Kopya kağıdı

Bu final görevi, birden fazla OOP kavramını eksiksiz bir sistemde birleştirir. İşte temel desenler ve teknikler:

Alanlı Enum'lar

Enum'lar alanlara, yapıcılara ve metotlara sahip olabilir:

public enum RentalStatus {
    AVAILABLE("ready to rent"),
    RENTED("currently in use");
    
    private String description;
    
    private RentalStatus(String description) {
        this.description = description;
    }
    
    public String getDescription() {
        return description;
    }
}

Özel İstisnalar

Exception sınıfını genişleterek alana özgü istisnalar oluşturun:

public class VehicleNotAvailableException extends Exception {
    public VehicleNotAvailableException(String licensePlate) {
        super("Vehicle not available: " + licensePlate);
    }
}

Arayüzlerle Birlikte Soyut Temel Sınıflar

Paylaşılan uygulama için soyut sınıfları, davranış sözleşmeleri için arayüzlerle birleştirin:

public abstract class Vehicle {
    private String licensePlate;
    private RentalStatus status;
    
    public abstract String getVehicleType();
    
    public String getDetails() {
        return licensePlate + " " + getVehicleType() + " - " + status.getDescription();
    }
}

public interface Rentable {
    boolean rent();
    boolean returnVehicle();
    double calculateCost(int days);
}

public class Car extends Vehicle implements Rentable {
    public boolean rent() {
        if (getStatus() == RentalStatus.AVAILABLE) {
            setStatus(RentalStatus.RENTED);
            return true;
        }
        return false;
    }
}

Yönetim için Kompozisyon

Nesne koleksiyonlarını yönetmek için kompozisyonu kullanın:

public class RentalAgency {
    private ArrayList<Vehicle> fleet = new ArrayList<>();
    
    public void addVehicle(Vehicle vehicle) {
        fleet.add(vehicle);
    }
    
    public double rentVehicle(String licensePlate, int days) throws VehicleNotAvailableException {
        Vehicle vehicle = findVehicle(licensePlate);
        if (vehicle == null) {
            throw new VehicleNotAvailableException(licensePlate);
        }
        Rentable rentable = (Rentable) vehicle;
        if (!rentable.rent()) {
            throw new VehicleNotAvailableException(licensePlate);
        }
        return rentable.calculateCost(days);
    }
}

Polimorfizm İş Başında

Farklı alt sınıflar, arayüz metotlarını farklı şekilde uygulayabilir:

// Car: standard pricing
public double calculateCost(int days) {
    return dailyRate * days;
}

// Motorcycle: discounted pricing
public double calculateCost(int days) {
    return dailyRate * days * 0.9;
}

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 -> "[licensePlate] plakalı araç [days] günlüğüne kiralandı - Toplam: $[cost]" yazdırın (2 ondalık basamak)
        //                           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