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!
Görev
KolayOOP 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,RENTEDveMAINTENANCEdeğerlerini ekleyin. Bir private alandescription(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:Exceptionsınıfını genişleten özel bir istisna oluşturun. Constructor bir plaka (license plate) kabul etmeli veVehicle 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ürenrent(), boolean döndürenreturnVehicle()ve double döndürencalculateCost(int days)metotlarını tanımlayın.Vehicle.java: Tüm araçlar için soyut bir temel sınıf oluşturun.licensePlate(String),brand(String),dailyRate(double) vestatus(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'ı ekleyin. String döndüren soyut birgetVehicleType()metodu tanımlayın. dailyRate değeri 2 ondalık basamakla formatlanmış şekilde"[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]"döndüren birgetDetails()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 alanseats(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 yapın ve true döndürün; aksi takdirde false döndürün.returnVehicle()için, status RENTED ise, onu AVAILABLE yapı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 alanengineCC(int) 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, ancakcalculateCost()%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 metotları ekleyin:addVehicle(Vehicle vehicle)- filoya bir araç eklerfindVehicle(String licensePlate)- Vehicle nesnesini veya null döndürürrentVehicle(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ürseVehicleNotAvailableExceptionfırlatınreturnVehicle(String licensePlate)- aracı bulur ve iade eder, başarı durumunda true döndürürgetAvailableVehicles()- 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:seatsADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCCRENT:licensePlate:daysRETURN:licensePlateAVAILABLE
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ı), veyaError: [exception message] - RETURN:
Returned: [licensePlate]veyaReturn failed: [licensePlate] - AVAILABLE:
Available vehicles:yazdırın ve ardından her bir uygun 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ı yazdırın.
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 rentBu 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ştiriyor!
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
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı