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, 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.Models ad alanında (namespace) araç hiyerarşinizi oluşturun. Temel Vehicle sınıfı salt okunur LicensePlate ve Brand özelliklerine, bir DailyRate (decimal) değerine ve MarkAsRented() ile MarkAsReturned() yöntemleri aracılığıyla kontrol edilen özel bir ayarlayıcıya (private setter) sahip bir 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, decimal döndüren tek bir CalculatePrice(Vehicle vehicle, int days) yöntemine sahip IPricingStrategy arayüzünü tanımlayın.
  • PricingStrategies.cs: Rental.Pricing ad alanında iki fiyatlandırma stratejisi uygulayın. StandardPricing sadece 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 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ı 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ı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, 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 (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, 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-123

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