Menu
Coddy logo textTech

Araç Kiralama Servisi

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 70 / 70.

challenge icon

Görev

Kolay

Kalı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şinizi Rental.Models ad alanı (namespace) içinde oluşturun. Temel Vehicle sınıfı salt okunur LicensePlate ve Brand özelliklerine, bir DailyRate (decimal) değerine ve MarkAsRented() ile MarkAsReturned() metotları aracılığıyla kontrol edilen özel bir ayarlayıcıya (private setter) sahip IsAvailable özelliğine sahip olmalıdır. Ardından üç türetilmiş sınıf oluşturun: Seats özelliğine sahip Car, EngineCC özelliğine sahip Motorcycle ve CargoCapacity (decimal) özelliğine sahip Truck. Her türetilmiş sınıf temel kurucuyu (base constructor) çağırmalı ve kendine özgü özelliğini ayarlamalıdır.
  • IPricingStrategy.cs: Rental.Pricing ad alanında, ondalık (decimal) değer döndüren tek bir CalculatePrice(Vehicle vehicle, int days) metoduna sahip IPricingStrategy arayüzünü tanımlayın.
  • PricingStrategies.cs: Rental.Pricing ad 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çin Rental.Models ad alanında bir Rental sınıfı oluşturun. Bu sınıf, tamamı kurucu (constructor) aracılığıyla ayarlanan CustomerName (string), Vehicle (Vehicle), Days (int) ve TotalPrice (decimal) için salt okunur özelliklere sahip olmalıdır.
  • RentalService.cs: Rental.Services ad alanında filoyu yöneten ve kiralama işlemlerini gerçekleştiren bir RentalService sınıfı oluşturun. Bu sınıf, kurucusu aracılığıyla bir IPricingStrategy alır (bağımlılık enjeksiyonu - dependency injection). Şunları uygulayın:
    • AddVehicle(Vehicle vehicle) - filoya bir araç ekler
    • RentVehicle(string customerName, string licensePlate, int days) - araç mevcut ve müsaitse bir Rental nesnesi döndürür, aksi takdirde null dö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ıysa true döndürür
    • GetAvailableVehicles() - 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 (standard veya weekend)
  • Eklenecek araç sayısı
  • Her araç için: tür (car, motorcycle veya truck), 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-123

Fiyatlandı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