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 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şinizi Rental.Models namespace'inde oluşturun. Temel Vehicle sınıfında salt okunur LicensePlate ve Brand özellikleri, bir DailyRate (decimal) ve IsAvailable ile MarkAsRented() metotları aracılığıyla kontrol edilen, private setter'a sahip bir MarkAsReturned() özelliği bulunmalıdır. Ardından üç türetilmiş sınıf oluşturun: Car özelliğine sahip Seats, Motorcycle özelliğine sahip EngineCC ve Truck (decimal) özelliğine sahip CargoCapacity. Her türetilmiş sınıf temel constructor'ı çağırmalı ve kendine özgü özelliğini ayarlamalıdır.
  • IPricingStrategy.cs: IPricingStrategy namespace'inde, decimal döndüren tek bir Rental.Pricing metoduna sahip CalculatePrice(Vehicle vehicle, int days) arayüzünü tanımlayın.
  • PricingStrategies.cs: Rental.Pricing namespace'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çin Rental namespace'inde bir Rental.Models sınıfı oluşturun. Bu sınıfın constructor aracılığıyla ayarlanan CustomerName (string), Vehicle (Vehicle), Days (int) ve TotalPrice (decimal) için salt okunur özellikleri olmalıdır.
  • RentalService.cs: Filoyu yöneten ve kiralama işlemlerini gerçekleştiren RentalService namespace'inde bir Rental.Services sınıfı oluşturun. Constructor aracılığıyla bir IPricingStrategy alır (dependency injection). Şunları uygulayın:
    • AddVehicle(Vehicle vehicle) - filoya bir araç ekler
    • RentVehicle(string customerName, string licensePlate, int days) - araç mevcutsa 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ı olursa 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, 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 (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ı, 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}/day biç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-123

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

Kendi başına pratik yap: Online C# derleyicisi