車両レンタルサービス
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 110/110。
チャレンジ
簡単OOPコースの最終チャレンジに到達したことをお祝いします!これまで学んだこと(抽象クラス、継承、カプセル化、Stateパターン、Factoryパターン、ジェネリクス)をすべて詰め込んだ、包括的な車両レンタルサービス(Vehicle Rental Service)を構築しましょう。
このレンタルサービスでは、さまざまな車両タイプの管理、空き状況の追跡、レンタルの処理、および顧客記録の保持を行います。これらを以下の7つのファイルに整理して作成します。
vehicle_state.dart: 車両が異なる状態でどのように振る舞うかを定義するVehicleState抽象クラスを作成します。抽象メソッドString getStatus()とbool canRent()を含めてください。その後、3つの具体的な状態クラスを作成します。AvailableState-Availableを返し、レンタルを許可します。RentedState-Rentedを返し、レンタルを許可しません。MaintenanceState-In Maintenanceを返し、レンタルを許可しません。
vehicle.dart: 抽象クラスVehicleを作成します。finalな id (String)、finalな model (String)、ゲッターを持つプライベートな_dailyRate(double)、およびAvailableStateで初期化されたプライベートな_state(VehicleState) を持たせます。以下を含めてください。- 状態のステータスを返すゲッター
status bool isAvailable()- 現在の状態がレンタル可能かどうかをチェックします。void setState(VehicleState state)- 車両の状態を変更します。- 抽象メソッド
double calculateRentalCost(int days) - 抽象メソッド
String getRequirements()- 特別な要件があればそれを返します。
toString()をオーバーライドして、[Type] model (id) - statusを返すようにします(Type は実行時の型 runtime type です)。- 状態のステータスを返すゲッター
vehicles.dart:Vehicleを継承する3つの車両タイプを作成します。Car- 標準のレンタル料金は「1日あたりの料金 × 日数」です。要件:Valid driver's licenseMotorcycle- レンタル料金は「1日あたりの料金 × 日数」から10%割引した額です。要件:Motorcycle license, Age 21+Truck- レンタル料金は「1日あたりの料金 × 日数」に一律 $50 の手数料を加えた額です。要件:Commercial license, Deposit required
vehicle_factory.dart:VehicleFactoryクラスを作成します。タイプ(car、motorcycle、またはtruck)に基づいて適切な車両を返す静的メソッドVehicle create(String type, String id, String model, double dailyRate)を持たせます。不明なタイプの場合は、デフォルトで Car を作成するようにします。customer.dart: id (String)、name (String)、およびレンタル記録のプライベートなリスト(String のリスト)を持つCustomerクラスを作成します。以下を含めてください。addRental(String vehicleInfo)- レンタル記録を追加します。getRentalCount()- レンタル回数を返します。bool isEligible()- 顧客の有効なレンタルが3つ未満の場合に true を返します。
toString()をオーバーライドして、Customer: name (id) - X rentalsを返すようにします。rental_service.dart: ジェネリクスを使用し、車両フリート用のList<Vehicle>と顧客用のList<Customer>を持つRentalServiceクラスを作成します。以下を含めてください。addVehicle(Vehicle vehicle)- フリートに追加し、Added: vehicle.toString()を出力します。registerCustomer(Customer customer)- 顧客を登録します。rentVehicle(String customerId, String vehicleId, int days)- 顧客が存在し、資格があり、車両が利用可能な場合:車両の状態を Rented に変更し、顧客にレンタルを追加し、customerId rented vehicleId for X days. Cost: $Y(Yは小数点以下2桁でフォーマット)を出力します。それ以外の場合は、適切なメッセージを出力します:Customer not found、Customer not eligible、Vehicle not found、またはVehicle not available。returnVehicle(String vehicleId)- 車両の状態を Available に設定し、vehicleId returnedを出力します。sendToMaintenance(String vehicleId)- 車両の状態を Maintenance に設定し、vehicleId sent to maintenanceを出力します。getAvailableVehicles()- 利用可能な車両のリストを返します。
main.dart: レンタルサービスのデモンストレーションを行います。RentalServiceを作成し、ファクトリを使用して3つの車両を追加します。- 車:
V001、Toyota Camry、$45/日 - バイク:
V002、Honda CBR、$35/日 - トラック:
V003、Ford F-150、$75/日
C001、Alice Johnson)を登録し、その顧客情報を出力します。トラックの要件を出力します。Alice に車を3日間レンタルします。同じ車をもう一度レンタルしようとします(失敗するはずです)。バイクをメンテナンスに出します。利用可能な車両の数をAvailable vehicles: Xとして出力します。車を返却します。最終的な利用可能台数を出力します。- 車:
期待される出力:
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自分で試してみよう
import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';
void main() {
// TODO: RentalService のインスタンスを作成する
// TODO: VehicleFactory を使用して3台の車両を作成し、追加する:
// - Car: V001, Toyota Camry, $45/day
// - Motorcycle: V002, Honda CBR, $35/day
// - Truck: V003, Ford F-150, $75/day
// TODO: 顧客を登録する (C001, Alice Johnson)
// TODO: 顧客情報を出力する
// TODO: トラックの要件を出力する (トラックを検索し、getRequirements() を呼び出す)
// TODO: 車 (V001) を Alice (C001) に3日間レンタルする
// TODO: 同じ車を再度レンタルしようとする (利用不可のため失敗するはず)
// TODO: オートバイ (V002) をメンテナンスに出す
// TODO: 利用可能な車両数を 'Available vehicles: X' として出力する
// TODO: 車 (V001) を返却する
// TODO: 最終的な利用可能な車両数を出力する
}
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ