Menu
Coddy logo textTech

本とユーザーのモデル

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

challenge icon

チャレンジ

簡単

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})");
        }
    }
}

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