Menu
CoddyTech

Layanan Penyewaan Kendaraan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 70 dari 70.

challenge icon

Tantangan

Mudah

Mari buat layanan penyewaan kendaraan yang memadukan pewarisan, antarmuka, dan pola Strategy! Kamu akan membuat sistem untuk menyewakan berbagai jenis kendaraan dengan strategi penetapan harga yang fleksibel, sekaligus menunjukkan bagaimana OOP memungkinkan logika bisnis yang mudah dipelihara dan dikembangkan.

Kamu akan mengatur kodemu dalam enam file:

  • Vehicle.cs: Buat hierarki kendaraanmu dalam namespace Rental.Models. class dasar Vehicle harus memiliki property LicensePlate dan Brand yang hanya bisa dibaca, DailyRate (decimal), serta property IsAvailable dengan setter privat yang nilainya dikendalikan melalui method MarkAsRented() dan MarkAsReturned(). Lalu buat tiga class turunan: Car dengan property Seats, Motorcycle dengan property EngineCC, dan Truck dengan property CargoCapacity (decimal). Setiap class turunan harus memanggil konstruktor dasar dan mengatur property uniknya.
  • IPricingStrategy.cs: Definisikan antarmuka IPricingStrategy dalam namespace Rental.Pricing dengan satu method CalculatePrice(Vehicle vehicle, int days) yang mengembalikan nilai decimal.
  • PricingStrategies.cs: Terapkan dua strategi penetapan harga dalam namespace Rental.Pricing. StandardPricing mengalikan tarif harian kendaraan dengan jumlah hari. WeekendDiscountPricing memberikan diskon 10% (kalikan dengan 0.9) jika penyewaan berlangsung selama 2 hari atau lebih. Jika tidak, gunakan perhitungan standar.
  • RentalRecord.cs: Buat class Rental dalam namespace Rental.Models untuk mencatat penyewaan. Class ini harus memiliki property yang hanya bisa dibaca untuk CustomerName (string), Vehicle (Vehicle), Days (int), dan TotalPrice (decimal). Atur semuanya melalui konstruktor.
  • RentalService.cs: Buat class RentalService dalam namespace Rental.Services untuk mengelola armada dan memproses penyewaan. Class ini menerima IPricingStrategy melalui konstruktor (injeksi dependensi). Terapkan:
    • AddVehicle(Vehicle vehicle) - menambahkan kendaraan ke armada
    • RentVehicle(string customerName, string licensePlate, int days) - mengembalikan object Rental jika kendaraan tersedia, atau mengembalikan null jika tidak. Ingat untuk menandai kendaraan sebagai disewa dan menghitung harga menggunakan strategi yang diinjeksi.
    • ReturnVehicle(string licensePlate) - menandai kendaraan sebagai tersedia, lalu mengembalikan true jika berhasil
    • GetAvailableVehicles() - mengembalikan list semua kendaraan yang tersedia
  • Program.cs: Satukan semuanya dengan membuat kendaraan, menyiapkan layanan dengan strategi penetapan harga, dan memproses operasi penyewaan berdasarkan input.

Kamu akan menerima input berikut:

  • Strategi penetapan harga yang digunakan (standard atau weekend)
  • Jumlah kendaraan yang akan ditambahkan
  • Untuk setiap kendaraan: jenis (car, motorcycle, atau truck), nomor pelat, merek, tarif harian, dan nilai khusus jenis kendaraan (jumlah kursi, engineCC, atau kapasitas kargo)
  • Jumlah operasi yang akan dilakukan
  • Untuk setiap operasi: tindakan yang diikuti data terkait

Format operasi:

rent
{customerName}
{licensePlate}
{days}

return
{licensePlate}

available

Format output:

  • Penyewaan berhasil: Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}
  • Penyewaan gagal: Rental failed: {licensePlate}
  • Pengembalian berhasil: Returned: {licensePlate}
  • Pengembalian gagal: Return failed: {licensePlate}
  • Kendaraan tersedia: Cetak setiap kendaraan yang tersedia dengan format {Type}: {Brand} ({LicensePlate}) - {DailyRate}/day, dengan Type berupa "Car", "Motorcycle", atau "Truck"

Contohnya, jika inputnya adalah:

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

Outputnya adalah:

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

Perhatikan bahwa strategi penetapan harga diinjeksi ke dalam layanan. Kamu bisa dengan mudah mengganti StandardPricing dengan WeekendDiscountPricing tanpa mengubah kode RentalService sama sekali. Inilah keunggulan pola Strategy yang dipadukan dengan injeksi dependensi!

Coba sendiri

using System;
using System.Collections.Generic;
using Rental.Models;
using Rental.Pricing;
using Rental.Services;

class Program
{
    public static void Main(string[] args)
    {
        // Baca tipe strategi harga
        string strategyType = Console.ReadLine();
        
        // TODO: Buat strategi harga yang sesuai berdasarkan input
        // "standard" -> StandardPricing
        // "weekend" -> WeekendDiscountPricing
        IPricingStrategy strategy = null; // TODO: Inisialisasi berdasarkan strategyType
        
        // TODO: Buat RentalService dengan strategi harga
        
        // Baca jumlah kendaraan
        int vehicleCount = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Baca dan tambahkan setiap kendaraan ke layanan
        // Untuk setiap kendaraan, baca:
        // - tipe (mobil, sepeda motor, truk)
        // - pelat nomor
        // - merek
        // - tarif harian
        // - nilai khusus tiap tipe (jumlah kursi, engineCC, atau kapasitas muatan)
        
        // Baca jumlah operasi
        int operationCount = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Proses setiap operasi
        // Operasi: rent, return, available
        // 
        // Untuk "rent":
        //   Baca customerName, licensePlate, days
        //   Output: "Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}"
        //   Atau: "Rental failed: {licensePlate}"
        //
        // Untuk "return":
        //   Baca licensePlate
        //   Output: "Returned: {licensePlate}" atau "Return failed: {licensePlate}"
        //
        // Untuk "available":
        //   Tampilkan setiap kendaraan yang tersedia dengan format:
        //   "{Type}: {Brand} ({LicensePlate}) - {DailyRate}/day"
    }
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C# online