Menu
Coddy logo textTech

車両レンタルサービス

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 110/110。

challenge icon

チャレンジ

簡単

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 license
    • Motorcycle - レンタル料金は「1日あたりの料金 × 日数」から10%割引した額です。要件:Motorcycle license, Age 21+
    • Truck - レンタル料金は「1日あたりの料金 × 日数」に一律 $50 の手数料を加えた額です。要件:Commercial license, Deposit required
  • vehicle_factory.dart: VehicleFactory クラスを作成します。タイプ(carmotorcycle、または 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 foundCustomer not eligibleVehicle not found、または Vehicle not available
    • returnVehicle(String vehicleId) - 車両の状態を Available に設定し、vehicleId returned を出力します。
    • sendToMaintenance(String vehicleId) - 車両の状態を Maintenance に設定し、vehicleId sent to maintenance を出力します。
    • getAvailableVehicles() - 利用可能な車両のリストを返します。
  • main.dart: レンタルサービスのデモンストレーションを行います。RentalService を作成し、ファクトリを使用して3つの車両を追加します。
    • 車:V001Toyota Camry、$45/日
    • バイク:V002Honda CBR、$35/日
    • トラック:V003Ford F-150、$75/日
    顧客(C001Alice 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: 最終的な利用可能な車両数を出力する
}

オブジェクト指向プログラミングのすべてのレッスン