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 Strateji (Strategy) desenini bir araya getiren bir araç kiralama hizmeti 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:Rental.Modelsad alanında (namespace) araç hiyerarşinizi oluşturun. TemelVehiclesınıfı salt okunurLicensePlateveBrandözelliklerine, birDailyRate(decimal) değerine veMarkAsRented()ileMarkAsReturned()yöntemleri aracılığıyla kontrol edilen özel bir ayarlayıcıya (private setter) sahip birIsAvailableö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, decimal döndüren tek birCalculatePrice(Vehicle vehicle, int days)yöntemine sahipIPricingStrategyarayüzünü tanımlayın.PricingStrategies.cs:Rental.Pricingad alanında iki fiyatlandırma stratejisi uygulayın.StandardPricingsadece 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 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ı 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ıysatruedöndürürGetAvailableVehicles()- tüm müsait araçların bir listesini döndürür
Program.cs: Araçlar oluşturarak, hizmeti bir fiyatlandırma stratejisiyle kurarak ve girdilere dayalı kiralama işlemlerini işleyerek 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ı, 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, girdiler ş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ı şö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 - RentalService kodunu hiç değiştirmeden StandardPricing yerine kolayca WeekendDiscountPricing koyabilirsiniz. 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ş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ı