Menu
Coddy logo textTech

שירות השכרת כלי רכב

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 70 מתוך 70.

challenge icon

אתגר

קל

בואו נבנה שירות להשכרת כלי רכב המשלב ירושה, ממשקים ותבנית Strategy! תיצרו מערכת שבה אפשר לשכור סוגים שונים של כלי רכב באמצעות אסטרטגיות תמחור גמישות — וכך תדגימו כיצד OOP מאפשר לכתוב לוגיקה עסקית שקל לתחזק ולהרחיב.

תארגנו את הקוד שלכם בשישה קבצים:

  • Vehicle.cs: צרו את היררכיית כלי הרכב במרחב השמות Rental.Models. למחלקת הבסיס Vehicle צריכות להיות המאפיינים לקריאה בלבד LicensePlate ו-Brand, מאפיין DailyRate מסוג decimal, ומאפיין IsAvailable עם setter פרטי, הנשלט באמצעות המתודות MarkAsRented() ו-MarkAsReturned(). לאחר מכן צרו שלוש מחלקות נגזרות: Car עם המאפיין Seats, ‏Motorcycle עם המאפיין EngineCC, ו-Truck עם המאפיין CargoCapacity מסוג decimal. כל מחלקה נגזרת צריכה לקרוא לבנאי של מחלקת הבסיס ולהגדיר את המאפיין הייחודי שלה.
  • IPricingStrategy.cs: הגדירו את הממשק IPricingStrategy במרחב השמות Rental.Pricing, עם מתודה יחידה CalculatePrice(Vehicle vehicle, int days) שמחזירה ערך מסוג decimal.
  • PricingStrategies.cs: ממשו שתי אסטרטגיות תמחור במרחב השמות Rental.Pricing. ‏StandardPricing פשוט מכפילה את התעריף היומי של כלי הרכב במספר הימים. ‏WeekendDiscountPricing מעניקה הנחה של 10% (כפל ב-0.9) אם ההשכרה היא ל-2 ימים או יותר; אחרת היא משתמשת בחישוב הרגיל.
  • RentalRecord.cs: צרו מחלקה בשם Rental במרחב השמות Rental.Models כדי לעקוב אחר השכרות. צריכים להיות לה המאפיינים לקריאה בלבד CustomerName (string), ‏Vehicle (Vehicle), ‏Days (int) ו-TotalPrice (decimal), וכולם יוגדרו באמצעות הבנאי.
  • RentalService.cs: צרו מחלקה בשם RentalService במרחב השמות Rental.Services, שמנהלת את צי כלי הרכב ומעבדת השכרות. היא מקבלת IPricingStrategy דרך הבנאי שלה (הזרקת תלות). ממשו את הפעולות הבאות:
    • AddVehicle(Vehicle vehicle) — מוסיפה כלי רכב לצי
    • RentVehicle(string customerName, string licensePlate, int days) — מחזירה אובייקט Rental אם כלי הרכב קיים וזמין; אחרת, מחזירה null. זכרו לסמן את כלי הרכב כשכור ולחשב את המחיר באמצעות האסטרטגיה שהוזרקה.
    • ReturnVehicle(string licensePlate) — מסמנת את כלי הרכב כזמין ומחזירה true אם הפעולה הצליחה
    • GetAvailableVehicles() — מחזירה רשימה של כל כלי הרכב הזמינים
  • Program.cs: חברו את כל החלקים יחד באמצעות יצירת כלי רכב, הגדרת השירות עם אסטרטגיית תמחור ועיבוד פעולות השכרה בהתאם לקלט.

הקלט יכלול את הפריטים הבאים:

  • אסטרטגיית התמחור לשימוש (standard או weekend)
  • מספר כלי הרכב להוספה
  • עבור כל כלי רכב: סוג (car, ‏motorcycle או truck), מספר רישוי, מותג, תעריף יומי וערך ייחודי לסוג (מספר מושבים, engineCC או קיבולת מטען)
  • מספר הפעולות לביצוע
  • עבור כל פעולה: הפעולה ולאחריה הנתונים הרלוונטיים

תבניות הפעולות:

rent
{customerName}
{licensePlate}
{days}

return
{licensePlate}

available

תבניות הפלט:

  • השכרה הצליחה: Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}
  • השכרה נכשלה: Rental failed: {licensePlate}
  • החזרה הצליחה: Returned: {licensePlate}
  • החזרה נכשלה: Return failed: {licensePlate}
  • זמינות: הדפיסו כל כלי רכב זמין בפורמט {Type}: {Brand} ({LicensePlate}) - {DailyRate}/day כאשר Type הוא "Car", "Motorcycle" או "Truck"

לדוגמה, אם הקלט הוא:

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

הפלט אמור להיות:

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

שימו לב שאסטרטגיית התמחור מוזרקת לשירות — תוכלו להחליף בקלות את StandardPricing ב-WeekendDiscountPricing בלי לשנות כלל את הקוד של RentalService. זה הכוח של תבנית Strategy בשילוב עם הזרקת תלות!

נסו בעצמכם

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

class Program
{
    public static void Main(string[] args)
    {
        // קרא את סוג אסטרטגיית התמחור
        string strategyType = Console.ReadLine();
        
        // TODO: צור את אסטרטגיית התמחור המתאימה בהתאם לקלט
        // "standard" -> StandardPricing
        // "weekend" -> WeekendDiscountPricing
        IPricingStrategy strategy = null; // TODO: אתחל בהתאם ל-strategyType
        
        // TODO: צור RentalService עם אסטרטגיית התמחור
        
        // קרא את מספר כלי הרכב
        int vehicleCount = Convert.ToInt32(Console.ReadLine());
        
        // TODO: קרא והוסף כל כלי רכב לשירות
        // עבור כל כלי רכב, קרא:
        // - סוג (מכונית, אופנוע, משאית)
        // - לוחית רישוי
        // - מותג
        // - תעריף יומי
        // - ערך ייחודי לסוג הרכב (מספר מושבים, engineCC או קיבולת מטען)
        
        // קרא את מספר הפעולות
        int operationCount = Convert.ToInt32(Console.ReadLine());
        
        // TODO: טפל בכל פעולה
        // פעולות: rent, return, available
        // 
        // עבור "rent":
        //   קרא את customerName, licensePlate, days
        //   פלט: "Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}"
        //   או: "Rental failed: {licensePlate}"
        //
        // עבור "return":
        //   קרא את licensePlate
        //   פלט: "Returned: {licensePlate}" או "Return failed: {licensePlate}"
        //
        // עבור "available":
        //   הצג כל רכב זמין כך:
        //   "{Type}: {Brand} ({LicensePlate}) - {DailyRate}/day"
    }
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C# אונליין