שירות השכרת כלי רכב
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 70 מתוך 70.
אתגר
קלבואו נבנה שירות להשכרת כלי רכב המשלב ירושה, ממשקים ותבנית 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"
}
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין