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 (inheritance), arayüzler (interfaces) ve Strateji (Strategy) desenini bir araya getiren bir araç kiralama servisi oluşturalım! Farklı araç türlerinin esnek fiyatlandırma stratejileri kullanılarak kiralanabildiği bir sistem oluşturacaksınız; bu, OOP'nin nasıl sürdürülebilir ve genişletilebilir iş mantığı sağladığını gösterecektir.
Kodunuzu altı dosya halinde düzenleyeceksiniz:
Vehicle.cs: Araç hiyerarşiniziRental.Modelsad alanı (namespace) içinde oluşturun. TemelVehiclesınıfı salt okunurLicensePlateveBrandözelliklerine, birDailyRate(decimal) değerine veMarkAsRented()ileMarkAsReturned()metotları aracılığıyla kontrol edilen özel bir ayarlayıcıya (private setter) sahipIsAvailableözelliğine sahip olmalıdır. Ardından üç türetilmiş sınıf oluşturun:Seatsözelliğine sahipCar,EngineCCözelliğine sahipMotorcycleveCargoCapacity(decimal) özelliğine sahipTruck. Her türetilmiş sınıf temel kurucuyu (base constructor) çağırmalı ve kendine özgü özelliğini ayarlamalıdır.IPricingStrategy.cs:Rental.Pricingad alanında, ondalık (decimal) değer döndüren tek birCalculatePrice(Vehicle vehicle, int days)metoduna sahipIPricingStrategyarayüzünü tanımlayın.PricingStrategies.cs:Rental.Pricingad alanında iki fiyatlandırma stratejisi uygulayın.StandardPricing, aracın günlük ücretini gün sayısıyla çarpar.WeekendDiscountPricing, kiralama 2 gün veya daha fazlaysa %10 indirim uygular (0.9 ile çarpar), aksi takdirde standart hesaplamayı kullanır.RentalRecord.cs: Kiralamaları takip etmek içinRental.Modelsad alanında birRentalsınıfı oluşturun. Bu sınıf, tamamı kurucu (constructor) aracılığıyla ayarlananCustomerName(string),Vehicle(Vehicle),Days(int) veTotalPrice(decimal) için salt okunur özelliklere sahip olmalıdır.RentalService.cs:Rental.Servicesad alanında filoyu yöneten ve kiralama işlemlerini gerçekleştiren birRentalServicesınıfı oluşturun. Bu sınıf, kurucusu aracılığıyla birIPricingStrategyalır (bağımlılık enjeksiyonu - dependency injection). Şunları uygulayın:AddVehicle(Vehicle vehicle)- filoya bir araç eklerRentVehicle(string customerName, string licensePlate, int days)- araç mevcut ve müsaitse birRentalnesnesi döndürür, aksi takdirdenulldöndürür. Aracı kiralandı olarak işaretlemeyi ve enjekte edilen stratejiyi kullanarak fiyatı hesaplamayı unutmayın.ReturnVehicle(string licensePlate)- aracı müsait olarak işaretler, başarılıysatruedöndürürGetAvailableVehicles()- tüm müsait araçların bir listesini döndürür
Program.cs: Araçlar oluşturarak, servisi bir fiyatlandırma stratejisiyle kurarak ve girişe dayalı kiralama işlemlerini işleyerek her şeyi bir araya getirin.
Aşağıdaki girişleri 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ı, motor hacmi veya kargo kapasitesi) - Gerçekleştirilecek işlem sayısı
- Her işlem için: eylem ve ardından ilgili veriler
İşlem formatları:
rent
{customerName}
{licensePlate}
{days}
return
{licensePlate}
availableÇıktı formatları:
- 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 araçlar: Her müsait aracı
{Type}: {Brand} ({LicensePlate}) - {DailyRate}/dayşeklinde yazdırın; burada Type "Car", "Motorcycle" veya "Truck" olmalıdır.
Örneğin, girişler şunlarsa:
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ı şu şekilde 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
Rental failed: ABC-123
Motorcycle: Honda (XYZ-789) - 30/day
Truck: Ford (TRK-001) - 80/day
Returned: ABC-123Fiyatlandırma stratejisinin servise nasıl enjekte edildiğine dikkat edin; RentalService kodunu hiç değiştirmeden StandardPricing yerine kolayca WeekendDiscountPricing kullanabilirsiniz. Bu, Strateji deseninin bağımlılık enjeksiyonu ile birleşen gücüdür!
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şturun
// "standard" -> StandardPricing
// "weekend" -> WeekendDiscountPricing
IPricingStrategy strategy = null; // TODO: strategyType'a göre başlatın
// TODO: Fiyatlandırma stratejisi ile RentalService oluşturun
// Araç sayısını oku
int vehicleCount = Convert.ToInt32(Console.ReadLine());
// TODO: Her bir aracı okuyun ve servise ekleyin
// Her araç için şunları okuyun:
// - tür (car, motorcycle, truck)
// - plaka
// - marka
// - günlük ücret
// - türe özgü değer (koltuk sayısı, motor hacmi veya kargo kapasitesi)
// İşlem sayısını oku
int operationCount = Convert.ToInt32(Console.ReadLine());
// TODO: Her bir işlemi işleyin
// İşlemler: rent, return, available
//
// "rent" için:
// customerName, licensePlate, days bilgilerini oku
// Çıktı: "Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}"
// Veya: "Rental failed: {licensePlate}"
//
// "return" için:
// licensePlate bilgisini oku
// Çıktı: "Returned: {licensePlate}" veya "Return failed: {licensePlate}"
//
// "available" için:
// Mevcut her 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ı