貸出システムのロジック
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 64/70。
チャレンジ
簡単コアとなる貸出ロジックを実装して、図書館システムを完成させましょう!本とユーザーの間を調整し、貸出制限などの図書館のルールを適用し、本が利用可能な場合にのみ貸し出せるようにする集中管理システムを作成します。
既存の4つのファイル構造を引き続き使用します:
Book.cs:Id、Title、Author、IsAvailableプロパティ、および前のレッスンで作成したBorrow()とReturn()メソッドを持つ Book クラスを保持します。User.cs:Name、MemberId、BorrowedCount、および貸出中の本を管理するメソッドを持つ User クラスを保持します。ユーザーが一度に借りることができる最大冊数を表す定数MaxBooksを 3 に設定して追加します。ユーザーが借りている本がMaxBooks未満の場合にのみ true を返すCanBorrow()メソッドを追加します。Library.cs: ここで貸出システムのロジックをまとめます。Library クラスは本とユーザーのコレクションを持ち、それらを追加するメソッドを持つ必要があります。2つの主要なメソッドを実装してください:BorrowBook(string bookId, int memberId)- 貸出プロセスを調整します。本が存在するか、ユーザーが存在するか、本が利用可能か、ユーザーがさらに本を借りられるかを確認する必要があります。失敗した場合や成功した場合に応じて、適切なメッセージを返します。ReturnBook(string bookId, int memberId)- 返却を処理する前に、ユーザーが実際にその本を持っているかを確認して返却を処理します。
Program.cs: 図書館の操作を処理し、結果を表示します。
BorrowBook メソッドは、状況に応じて以下のメッセージを返す必要があります:
Book not found- 本の ID が存在しない場合User not found- メンバー ID が存在しない場合{Title} is not available- 本がすでに貸し出されている場合{Name} has reached the borrowing limit- ユーザーがすでに3冊の本を借りている場合{Name} borrowed {Title}- 貸出が成功した場合
ReturnBook メソッドは以下を返す必要があります:
Book not foundまたはUser not found- 無効な ID の場合{Name} did not borrow {Title}- ユーザーが持っていない本を返却しようとした場合{Name} returned {Title}- 返却が成功した場合
以下の入力を受け取ります:
- 図書館の名前
- 本の数、次に各本を
id|title|authorの形式で - ユーザーの数、次に各ユーザーを
name|memberIdの形式で - 操作の数、次に各操作を
action|bookId|memberIdの形式で
各操作の結果をそれぞれの行に出力してください。
例えば、入力が以下の場合:
Central Library
4
B001|The Hobbit|Tolkien
B002|1984|Orwell
B003|Dune|Herbert
B004|Foundation|Asimov
2
Alice|101
Bob|102
6
borrow|B001|101
borrow|B002|101
borrow|B003|101
borrow|B004|101
borrow|B001|102
return|B002|101出力は以下のようになります:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984Library クラスがコーディネーターとして機能し、操作を許可する前にすべての条件を検証し、Book クラスと User クラスがそれぞれの責任に集中できるようにしていることに注目してください。この分離により、コードの保守とテストが容易になります!
自分で試してみよう
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// 図書館名を読み込む
string libraryName = Console.ReadLine();
// 図書館名を使用して Library インスタンスを作成する
Library library = new Library(libraryName);
// 本の数を読み込む
int numBooks = Convert.ToInt32(Console.ReadLine());
// 本を読み込んで追加する
for (int i = 0; i < numBooks; i++)
{
string bookInput = Console.ReadLine();
string[] bookParts = bookInput.Split('|');
string bookId = bookParts[0];
string bookTitle = bookParts[1];
string bookAuthor = bookParts[2];
Book book = new Book(bookId, bookTitle, bookAuthor);
library.AddBook(book);
}
// ユーザーの数を読み込む
int numUsers = Convert.ToInt32(Console.ReadLine());
// ユーザーを読み込んで登録する
for (int i = 0; i < numUsers; i++)
{
string userInput = Console.ReadLine();
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
User user = new User(userName, memberId);
library.RegisterUser(user);
}
// 操作の数を読み込む
int numOperations = Convert.ToInt32(Console.ReadLine());
// 操作を処理する
for (int i = 0; i < numOperations; i++)
{
string operationInput = Console.ReadLine();
string[] opParts = operationInput.Split('|');
string action = opParts[0];
string bookId = opParts[1];
int memberId = Convert.ToInt32(opParts[2]);
if (action == "borrow")
{
string result = library.BorrowBook(bookId, memberId);
Console.WriteLine(result);
}
else if (action == "return")
{
string result = library.ReturnBook(bookId, memberId);
Console.WriteLine(result);
}
}
}
}
}