貸出システム
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 84/91。
チャレンジ
簡単すべての貸出操作をオーケストレートする Library クラスを作成して、図書館管理システムを完成させましょう。この中心となるコーディネーターは、蔵書を管理し、図書館を円滑に運営するためのルールを適用します。
コードは以下の4つのファイルに分けて構成します:
Book.php— 前回のレッスンで作成したBookクラスです。読み取り専用プロパティ(isbn、title、author)、初期値がtrueのプライベートな$isAvailableプロパティ、およびメソッド:isAvailable()、markAsBorrowed()、markAsReturned()を持ちます。User.php— Book ファイルをインクルードします。読み取り専用プロパティ(id、name)、プライベートな$borrowedBooks配列、値が3のMAX_BOOKS定数、およびメソッド:getBorrowedBooks()、canBorrow()、addBook(Book $book)、removeBook(string $isbn)を持つUserクラスです。Library.php— User ファイルをインクルードします。蔵書を管理するLibraryクラスを作成します。このライブラリには以下を含める必要があります:- ISBNをキーとして本を格納するプライベートな
$books配列 addBook(Book $book): void— 蔵書に本を追加しますfindBook(string $isbn): ?Book— 本を返すか、見つからない場合は null を返しますborrowBook(User $user, string $isbn): string— 貸出を検証・処理し、適切なメッセージを返しますreturnBook(User $user, string $isbn): string— 返却を処理し、本とユーザーの両方の状態を更新します
borrowBookメソッドは、以下の3つの条件を順番にチェックし、これらの正確なメッセージを返す必要があります:"Book not found"— 本が存在しない場合"Book is not available"— すでに貸出中の場合"Borrowing limit reached"— ユーザーがすでに3冊の本を借りている場合"Successfully borrowed: [title]"— 成功した場合
returnBookメソッドは、本が存在しない場合は"Book not found"を、成功した場合は"Successfully returned: [title]"を返す必要があります。- ISBNをキーとして本を格納するプライベートな
main.php— Library ファイルをインクルードします。ISBNと本のタイトルの2つの入力を受け取ります。Libraryインスタンス、IDが1で名前が"Alice"のUser、および提供されたISBN、タイトル、著者名"Unknown"を持つBookを作成します。本をライブラリに追加し、次の操作を実行して各結果を新しい行に出力してください:- 本を借りる
- 同じ本をもう一度借りようとする
- 本を返却する
- もう一度本を借りる
このチャレンジでは、Library クラスがどのようにビジネスロジックを一元化するかを示します。条件を検証し、Book オブジェクトと User オブジェクト間の状態変化を調整し、各操作に対して意味のあるフィードバックを返します。
自分で試してみよう
<?php
require_once 'Library.php';
// 入力を読み込む
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Library インスタンスを作成する
// TODO: ID 1、名前 "Alice" の User を作成する
// TODO: 提供された ISBN、タイトル、著者 "Unknown" で Book を作成する
// TODO: 本をライブラリに追加する
// TODO: 以下の操作を実行し、各結果を新しい行に出力する:
// 1. 本を借りる
// 2. 同じ本をもう一度借りてみる
// 3. 本を返却する
// 4. もう一度本を借りる
?>