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.
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ượngVehicleStatexá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ượngString getStatus()vàbool canRent(). Sau đó tạo ba trạng thái cụ thể:AvailableState- trả vềAvailablevà cho phép thuê xeRentedState- trả vềRentedvà không cho phép thuê xeMaintenanceState- trả vềIn Maintenancevà không cho phép thuê xe
vehicle.dart: Tạo lớp trừu tượngVehiclevới idfinal(String), modelfinal(String),_dailyRateriêng tư (double) có getter và_stateriêng tư (VehicleState) được khởi tạo bằngAvailableState. Thêm:- Getter
statustrả 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ôngvoid 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
toString()để trả về[Type] model (id) - status, trong đó Type là kiểu lúc chạy.- Getter
vehicles.dart: Tạo ba loại xe kế thừaVehicle: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 licenseMotorcycle- 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ớpVehicleFactoryvới phương thức tĩnhVehicle create(String type, String id, String model, double dailyRate)trả về loại xe phù hợp dựa trên type (car,motorcyclehoặctruck). Nếu type không xác định, mặc định tạo một Car.customer.dart: Tạo lớpCustomervớ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ê xegetRentalCount()- 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
toString()để trả vềCustomer: name (id) - X rentals.rental_service.dart: Tạo lớpRentalServicesử dụng kiểu tổng quát, vớiList<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 raAdded: vehicle.toString()registerCustomer(Customer customer)- thêm khách hàngrentVehicle(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 racustomerId 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 foundhoặcVehicle not availablereturnVehicle(String vehicleId)- đặt trạng thái xe thành Available, in ravehicleId returnedsendToMaintenance(String vehicleId)- đặt trạng thái xe thành Maintenance, in ravehicleId sent to maintenancegetAvailableVehicles()- 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ộtRentalServicevà 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
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ạngAvailable vehicles: X. Trả ô tô. In số xe sẵn sàng cuối cùng.- Một ô tô:
Đầ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: 2Tự 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
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiThư viện và câu lệnh importGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcBiến thể hiệnKiến thức cơ bản về hàm khởi tạoÔn tập: Máy tính đơn giản4An toàn với giá trị null
Giới thiệu về an toàn với giá trị nullCó thể null và không thể nullToán tử ? và !Từ khóa late và an toàn với giá trị nullToán tử xử lý nullAn toàn với giá trị null trong lớpÔn tập: hệ thống hồ sơ người dùng7Lớp trừu tượng và interface
Lớp trừu tượngPhương thức trừu tượngInterface trong DartInterface ngầm địnhTriển khai và kế thừaNhiều interfaceÔn tập: Máy tính hình10Bộ sưu tập và kiểu tổng quát
Tổng quan về List, Set và MapBộ sưu tập an toàn về kiểuLớp tổng quátPhương thức tổng quátRàng buộc kiểu tổng quátIterable và IteratorÔn tập: Lưu trữ tổng quát2Hàm khởi tạo trong Dart
Hàm khởi tạo mặc địnhHàm khởi tạo có tênDanh sách khởi tạoHàm khởi tạo hằng sốHàm khởi tạo nhà máyHàm khởi tạo chuyển hướngÔn tập: Trình tạo hình dạng5Đóng gói
Thành viên công khai và riêng tưQuy ước tiền tố _Tính riêng tư ở cấp thư việnTìm hiểu sâu về getter và setterChe giấu thông tinÔn tập: hồ sơ học sinh8Mixin
Giới thiệu về MixinTạo MixinSử dụng nhiều MixinTừ khóa on trong MixinMixin và kế thừaMixin và giao diệnÔn tập: hệ thống động vật11Phương thức đặc biệt
Ghi đè toString()Ghi đè hashCode và ==Giao diện ComparablePhương thức call()Ghi đè noSuchMethodÔn tập: bộ sưu tập tùy chỉnh17Thử thách cuối cùng
Nền tảng học trực tuyếnHệ thống ngân hàngHệ thống nhân vật trò chơiDịch vụ cho thuê phương tiện3Thuộc tính của lớp
Thành viên instance và thành viên tĩnhTrường final và constBiến latePhương thức và trường tĩnhGetter và setterÔn tập: trình quản lý tài khoản ngân hàng6Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChú thích @overrideTừ khóa lớp finalHàm khởi tạo và kế thừaÔn tập: phân cấp nhân viên9Đa hình
Khái niệm cơ bản về đa hìnhĐa hình qua giao diệnKiểm tra kiểu lúc chạyToán tử is và asTừ khóa hiệp biếnÔn tập: Bộ xử lý thanh toánTự luyện tập: Trình biên dịch Dart online