Menu
CoddyTech

Dịch vụ cho thuê phương tiện

Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 110 trên 110.

challenge icon

Thử thách

Dễ

Chúc mừng bạn đã đến với thử thách cuối cùng của khóa học OOP! Hãy xây dựng một Dịch vụ cho thuê xe toàn diện, kết hợp mọi thứ bạn đã học: lớp trừu tượng, kế thừa, đóng gói, mẫu State, mẫu Factory và kiểu tổng quát.

Dịch vụ cho thuê xe của bạn sẽ quản lý các loại xe khác nhau, theo dõi trạng thái sẵn có, xử lý việc cho thuê và lưu hồ sơ khách hàng. Bạn sẽ tổ chức mã trong bảy tệp:

  • vehicle_state.dart: Tạo một lớp trừu tượng VehicleState xác định cách xe hoạt động ở các trạng thái khác nhau. Thêm phương thức trừu tượng String getStatus() và bool canRent(). Sau đó tạo ba trạng thái cụ thể:
    • AvailableState - trả về Available và cho phép thuê xe
    • RentedState - trả về Rented và không cho phép thuê xe
    • MaintenanceState - trả về In Maintenance và không cho phép thuê xe
  • vehicle.dart: Tạo lớp trừu tượng Vehicle với id final (String), model final (String), _dailyRate riêng tư (double) có getter và _state riêng tư (VehicleState) được khởi tạo bằng AvailableState. Thêm:
    • Getter status trả về trạng thái của xe
    • bool isAvailable() - kiểm tra trạng thái hiện tại có cho phép thuê xe hay không
    • void setState(VehicleState state) - thay đổi trạng thái của xe
    • Phương thức trừu tượng double calculateRentalCost(int days)
    • Phương thức trừu tượng String getRequirements() - trả về mọi yêu cầu đặc biệt
    Ghi đè toString() để trả về [Type] model (id) - status, trong đó Type là kiểu lúc chạy.
  • vehicles.dart: Tạo ba loại xe kế thừa Vehicle:
    • Car - chi phí thuê tiêu chuẩn bằng đơn giá hằng ngày nhân với số ngày. Yêu cầu: Valid driver's license
    • Motorcycle - chi phí thuê bằng đơn giá hằng ngày nhân với số ngày, được giảm giá 10%. Yêu cầu: Motorcycle license, Age 21+
    • Truck - chi phí thuê bằng đơn giá hằng ngày nhân với số ngày, cộng thêm phí cố định $50. Yêu cầu: Commercial license, Deposit required
  • vehicle_factory.dart: Tạo lớp VehicleFactory với phương thức tĩnh Vehicle create(String type, String id, String model, double dailyRate) trả về loại xe phù hợp dựa trên type (car, motorcycle hoặc truck). Nếu type không xác định, mặc định tạo một Car.
  • customer.dart: Tạo lớp Customer với id (String), name (String) và danh sách riêng tư các hồ sơ thuê xe (danh sách String). Thêm:
    • addRental(String vehicleInfo) - thêm hồ sơ thuê xe
    • getRentalCount() - trả về số lần thuê
    • bool isEligible() - trả về true nếu khách hàng có ít hơn 3 lượt thuê đang hoạt động
    Ghi đè toString() để trả về Customer: name (id) - X rentals.
  • rental_service.dart: Tạo lớp RentalService sử dụng kiểu tổng quát, với List<Vehicle> cho đội xe và List<Customer> cho khách hàng. Thêm:
    • addVehicle(Vehicle vehicle) - thêm xe vào đội xe, in ra Added: vehicle.toString()
    • registerCustomer(Customer customer) - thêm khách hàng
    • rentVehicle(String customerId, String vehicleId, int days) - nếu khách hàng tồn tại, đủ điều kiện và xe sẵn sàng cho thuê: chuyển trạng thái xe thành Rented, thêm lượt thuê vào hồ sơ khách hàng, in ra customerId rented vehicleId for X days. Cost: $Y (Y được định dạng với 2 chữ số thập phân). Nếu không, in thông báo phù hợp: Customer not found, Customer not eligible, Vehicle not found hoặc Vehicle not available
    • returnVehicle(String vehicleId) - đặt trạng thái xe thành Available, in ra vehicleId returned
    • sendToMaintenance(String vehicleId) - đặt trạng thái xe thành Maintenance, in ra vehicleId sent to maintenance
    • getAvailableVehicles() - trả về danh sách xe sẵn sàng cho thuê
  • main.dart: Minh họa dịch vụ cho thuê xe. Tạo một RentalService và dùng factory để thêm ba xe:
    • Một ô tô: V001, Toyota Camry, $45/ngày
    • Một xe máy: V002, Honda CBR, $35/ngày
    • Một xe tải: V003, Ford F-150, $75/ngày
    Đăng ký một khách hàng (C001, Alice Johnson) và in thông tin khách hàng. In các yêu cầu của xe tải. Cho Alice thuê ô tô trong 3 ngày. Thử cho thuê ô tô lần nữa (sẽ thất bại). Đưa xe máy đi bảo dưỡng. In số xe sẵn sàng cho thuê theo định dạng Available vehicles: X. Trả ô tô. In số xe sẵn sàng cuối cùng.

Đầu ra mong đợi:

Added: [Car] Toyota Camry (V001) - Available
Added: [Motorcycle] Honda CBR (V002) - Available
Added: [Truck] Ford F-150 (V003) - Available
Customer: Alice Johnson (C001) - 0 rentals
Commercial license, Deposit required
C001 rented V001 for 3 days. Cost: $135.00
Vehicle not available
V002 sent to maintenance
Available vehicles: 1
V001 returned
Available vehicles: 2

Tự làm thử

import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';

void main() {
  // TODO: Tạo một instance của RentalService
  
  // TODO: Dùng VehicleFactory để tạo và thêm ba xe:
  // - Ô tô: V001, Toyota Camry, $45/ngày
  // - Xe máy: V002, Honda CBR, $35/ngày
  // - Xe tải: V003, Ford F-150, $75/ngày
  
  // TODO: Đăng ký khách hàng (C001, Alice Johnson)
  
  // TODO: In ra thông tin khách hàng
  
  // TODO: In ra các yêu cầu đối với xe tải (tìm xe tải và gọi getRequirements())
  
  // TODO: Cho Alice (C001) thuê ô tô (V001) trong 3 ngày
  
  // TODO: Thử cho thuê ô tô lần nữa (phải thất bại vì xe không còn sẵn để thuê)
  
  // TODO: Đưa xe máy (V002) đi bảo dưỡng
  
  // TODO: In ra số xe còn sẵn để thuê theo dạng 'Available vehicles: X'
  
  // TODO: Trả lại ô tô (V001)
  
  // TODO: In ra số lượng xe còn cho thuê cuối cùng
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Dart online