Araç Kiralama Servisi
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 70 / 70.
Görev
KolayKalıtım, arayüzler ve Strategy pattern'ı bir araya getiren bir araç kiralama hizmeti oluşturalım! Esnek fiyatlandırma stratejileri kullanılarak farklı araç türlerinin kiralanabildiği bir sistem oluşturacaksınız. Bu, OOP'nin sürdürülebilir ve genişletilebilir iş mantığı oluşturmayı nasıl mümkün kıldığını gösterir.
Kodunuzu altı dosya boyunca düzenleyeceksiniz:
Vehicle.cs: Araç hiyerarşiniziRental.Modelsnamespace'inde oluşturun. TemelVehiclesınıfında salt okunurLicensePlateveBrandözellikleri, birDailyRate(decimal) veIsAvailableileMarkAsRented()metotları aracılığıyla kontrol edilen, private setter'a sahip birMarkAsReturned()özelliği bulunmalıdır. Ardından üç türetilmiş sınıf oluşturun:Carözelliğine sahipSeats,Motorcycleözelliğine sahipEngineCCveTruck(decimal) özelliğine sahipCargoCapacity. Her türetilmiş sınıf temel constructor'ı çağırmalı ve kendine özgü özelliğini ayarlamalıdır.IPricingStrategy.cs:IPricingStrategynamespace'inde, decimal döndüren tek birRental.Pricingmetoduna sahipCalculatePrice(Vehicle vehicle, int days)arayüzünü tanımlayın.PricingStrategies.cs:Rental.Pricingnamespace'inde iki fiyatlandırma stratejisi uygulayın.StandardPricing, aracın günlük ücretini gün sayısıyla çarpar.WeekendDiscountPricing, kiralama 2 veya daha fazla gün içinse %10 indirim uygular (0.9 ile çarpar); aksi takdirde standart hesaplamayı kullanır.RentalRecord.cs: Kiralamaları takip etmek içinRentalnamespace'inde birRental.Modelssınıfı oluşturun. Bu sınıfın constructor aracılığıyla ayarlananCustomerName(string),Vehicle(Vehicle),Days(int) veTotalPrice(decimal) için salt okunur özellikleri olmalıdır.RentalService.cs: Filoyu yöneten ve kiralama işlemlerini gerçekleştirenRentalServicenamespace'inde birRental.Servicessınıfı oluşturun. Constructor aracılığıyla birIPricingStrategyalır (dependency injection). Şunları uygulayın:AddVehicle(Vehicle vehicle)- filoya bir araç eklerRentVehicle(string customerName, string licensePlate, int days)- araç mevcutsa ve müsaitse birRentalnesnesi döndürür; aksi takdirdenulldöndürür. Aracı kiralanmış olarak işaretlemeyi ve enjekte edilen stratejiyi kullanarak fiyatı hesaplamayı unutmayın.ReturnVehicle(string licensePlate)- aracı müsait olarak işaretler, başarılı olursatruedöndürürGetAvailableVehicles()- tüm müsait araçların bir listesini döndürür
Program.cs: Araçları oluşturarak, fiyatlandırma stratejisine sahip hizmeti kurarak ve girdiye dayalı kiralama işlemlerini gerçekleştirerek her şeyi bir araya getirin.
Aşağıdaki girdileri alacaksınız:
- Kullanılacak fiyatlandırma stratejisi (
standardveyaweekend) - Eklenecek araç sayısı
- Her araç için: tür (
car,motorcycleveyatruck), plaka, marka, günlük ücret ve türe özgü değer (koltuk sayısı, engineCC veya kargo kapasitesi) - Gerçekleştirilecek işlem sayısı
- Her işlem için: ilgili verilerin izlediği eylem
İşlem biçimleri:
rent
{customerName}
{licensePlate}
{days}
return
{licensePlate}
availableÇıktı biçimleri:
- Kiralama başarılı:
Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice} - Kiralama başarısız:
Rental failed: {licensePlate} - İade başarılı:
Returned: {licensePlate} - İade başarısız:
Return failed: {licensePlate} - Müsait: Her müsait aracı
{Type}: {Brand} ({LicensePlate}) - {DailyRate}/daybiçiminde yazdırın; Type değeri "Car", "Motorcycle" veya "Truck" olur.
Örneğin, girdiler şöyleyse:
weekend
3
car
ABC-123
Toyota
50
5
motorcycle
XYZ-789
Honda
30
600
truck
TRK-001
Ford
80
2000
5
available
rent
Alice
ABC-123
3
rent
Bob
ABC-123
2
available
return
ABC-123Çıktı şöyle olmalıdır:
Car: Toyota (ABC-123) - 50/day
Motorcycle: Honda (XYZ-789) - 30/day
Truck: Ford (TRK-001) - 80/day
Rented: Toyota (ABC-123) to Alice for 3 days - Total: 135.0
Rental failed: ABC-123
Motorcycle: Honda (XYZ-789) - 30/day
Truck: Ford (TRK-001) - 80/day
Returned: ABC-123Fiyatlandırma stratejisinin hizmete nasıl enjekte edildiğine dikkat edin. StandardPricing kodunu hiç değiştirmeden WeekendDiscountPricing yerine kolayca RentalService kullanabilirsiniz. Dependency injection ile birleştirilmiş Strategy pattern'ın gücü budur!
Kendin dene
using System;
using System.Collections.Generic;
using Rental.Models;
using Rental.Pricing;
using Rental.Services;
class Program
{
public static void Main(string[] args)
{
// Fiyatlandırma stratejisi türünü oku
string strategyType = Console.ReadLine();
// TODO: Girdiye göre uygun fiyatlandırma stratejisini oluştur
// "standard" -> StandardPricing
// "weekend" -> WeekendDiscountPricing
IPricingStrategy strategy = null; // TODO: strategyType değerine göre başlat
// TODO: Fiyatlandırma stratejisi ile RentalService oluştur
// Araç sayısını oku
int vehicleCount = Convert.ToInt32(Console.ReadLine());
// TODO: Her bir aracı oku ve servise ekle
// Her araç için şunları oku:
// - type (car, motorcycle, truck)
// - license plate
// - brand
// - günlük ücret
// - türe özgü değer (seats, engineCC veya cargo capacity)
// İşlem sayısını oku
int operationCount = Convert.ToInt32(Console.ReadLine());
// TODO: Her bir işlemi işle
// İşlemler: rent, return, available
//
// "rent" için:
// customerName, licensePlate, days oku
// Çıktı: "Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}"
// Veya: "Rental failed: {licensePlate}"
//
// "return" için:
// licensePlate oku
// Çıktı: "Returned: {licensePlate}" veya "Return failed: {licensePlate}"
//
// "available" için:
// Her bir müsait aracı şu şekilde yazdır:
// "{Type}: {Brand} ({LicensePlate}) - {DailyRate}/day"
}
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarı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ı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi