本とユーザーのモデル
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 63/70。
チャレンジ
簡単Book と User モデルにより豊かな機能を組み込んで、図書館システム(Library System)を拡張しましょう。本の状態追跡機能、ユーザーの貸出機能、およびデータを安全に保つための適切なカプセル化を追加します。
引き続き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 を保持する private なリストを含めます。ユーザーが現在借りている本の冊数を返すBorrowedCount読み取り専用プロパティを追加します。ユーザーの貸出本を管理するためのAddBorrowedBook(string bookId)およびRemoveBorrowedBook(string bookId)メソッドを含めてください。また、ユーザーがその特定の本を借りている場合に true を返すHasBook(string bookId)メソッドも追加します。Library.cs: Library クラスは本とユーザーのコレクションを維持する必要があります。図書館にデータを追加するためのAddBook(Book book)およびRegisterUser(User user)メソッドを含めます。指定された ID の本を返す(見つからない場合は null を返す)GetBookById(string id)メソッドと、ユーザーに対して同様に機能する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;
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());
// ユーザーを読み取って登録する
List<User> usersList = new List<User>();
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);
usersList.Add(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]);
Book book = library.GetBookById(bookId);
User user = library.GetUserById(memberId);
if (action == "borrow")
{
string result = book.Borrow();
Console.WriteLine(result);
if (result.Contains("has been borrowed"))
{
user.AddBorrowedBook(bookId);
}
}
else if (action == "return")
{
string result = book.Return();
Console.WriteLine(result);
if (result.Contains("has been returned"))
{
user.RemoveBorrowedBook(bookId);
}
}
}
// 各ユーザーの概要を出力する
foreach (User user in usersList)
{
Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
}
}
}
}