本とユーザーのモデル
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 63/70。
チャレンジ
簡単BookモデルとUserモデルをより充実した機能で構築し、ライブラリシステムを拡張しましょう。本のステータス追跡、ユーザーの貸出機能、そしてデータを安全に保つための適切なカプセル化を追加します。
引き続き、以下の4つのファイル構成で作業を進めます:
Book.cs: Bookクラスを拡張し、一意の識別子とステータス追跡を追加します。各本は、Id(string)、Title(string)、Author(string)、およびIsAvailable(bool、デフォルトは true) を持つ必要があります。可用性ステータスを変更し、成功または失敗を示すメッセージを返すBorrow()メソッドとReturn()メソッドを追加してください。利用不可能な本を借りようとした場合は、"{Title} is not available"を返します。すでに利用可能な本を返そうとした場合は、"{Title} was not borrowed"を返します。操作が成功した場合は、"{Title} has been borrowed"または"{Title} has been returned"を返してください。User.cs: Userクラスを拡張して、借りている本を追跡します。Name(string)、MemberId(int)、および借りている本のIDを保存するためのプライベートリストを含めます。ユーザーが現在持っている本の数を返すBorrowedCount読み取り専用プロパティを追加します。ユーザーの借りている本を管理するために、AddBorrowedBook(string bookId)メソッドとRemoveBorrowedBook(string bookId)メソッドを追加してください。また、ユーザーがその特定の本を借りている場合に true を返すHasBook(string bookId)メソッドも追加します。Library.cs: Libraryクラスは、本とユーザーのコレクションを保持する必要があります。ライブラリにデータを追加するためのAddBook(Book book)メソッドとRegisterUser(User user)メソッドを含めます。そのIDを持つ本を返すGetBookById(string id)メソッド(見つからない場合は null)、およびユーザーに対して同様に機能するGetUserById(int memberId)メソッドを追加します。Program.cs: 入力に基づいてライブラリの操作を処理し、すべてをまとめます。
以下の入力を受け取ります:
- ライブラリ名
- 追加する本の数
- 各本について:
id|title|author - 登録するユーザーの数
- 各ユーザーについて:
name|memberId - 実行する操作の数
- 各操作について:
action|bookId|memberId(actionはborrowまたはreturnのいずれか)
各操作について、貸出または返却アクションの結果を出力してください。すべての操作の後、各ユーザーの概要を、名前と現在借りている本の数を {Name}: {BorrowedCount} book(s) の形式で出力します。
例えば、入力が以下の場合:
Downtown Library
2
B001|Clean Code|Robert Martin
B002|Design Patterns|Gang of Four
2
Alice|101
Bob|102
4
borrow|B001|101
borrow|B002|101
borrow|B001|102
return|B001|101出力は以下のようになります:
Clean Code has been borrowed
Design Patterns has been borrowed
Clean Code is not available
Clean Code has been returned
Alice: 1 book(s)
Bob: 0 book(s)Aliceが2冊の本を正常に借りますが、BobがClean Code(すでにAliceが借りている)を借りようとすると、操作が失敗することに注目してください。AliceがClean Codeを返却した後、彼女のカウントは1に減少します。これは、モデルが連携してライブラリのルールを適用していることを示しています!
自分で試してみよう
using System;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// 入力を読み込む
string libraryName = Console.ReadLine();
string bookInput = Console.ReadLine();
string userInput = Console.ReadLine();
// 本の入力を解析する (形式: title|author)
string[] bookParts = bookInput.Split('|');
string bookTitle = bookParts[0];
string bookAuthor = bookParts[1];
// ユーザーの入力を解析する (形式: name|memberId)
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
// 図書館名を使用して Library インスタンスを作成する
Library library = new Library(libraryName);
// タイトルと著者を使用して Book インスタンスを作成する
Book book = new Book(bookTitle, bookAuthor);
// 名前とメンバーIDを使用して User インスタンスを作成する
User user = new User(userName, memberId);
// GetInfo() を使用して図書館情報を出力する
Console.WriteLine(library.GetInfo());
// 次の形式で本の情報を出力する: Book: {Title} by {Author} - Available: {IsAvailable}
Console.WriteLine($"Book: {book.Title} by {book.Author} - Available: {book.IsAvailable}");
// 次の形式でユーザー情報を出力する: User: {Name} (ID: {MemberId})
Console.WriteLine($"User: {user.Name} (ID: {user.MemberId})");
}
}
}