Menu
Coddy logo textTech

管理者インターフェース

CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 81/87。

challenge icon

チャレンジ

簡単

Library Management System を Admin Interface で拡張しましょう!実際の図書館には、蔵書への新しい本の追加、古くなった本の削除、新しいメンバーの登録といった管理機能が必要です。これらの管理操作を定義するインターフェースを作成し、専用の管理クラスで実装します。

既存のコードを5つのファイルにわたって引き続き構築します。

  • Book.java:既存のすべての機能を備えた Book クラスを維持します。isbn、title、author、isAvailable、borrowedBy、getDetails()、および適切な getter/setter を含めます。
  • User.java:id、name、borrowedBooks ArrayList、borrowBook()、returnBook()、getBorrowedCount()、toString() を含む User クラスを変更せずに維持します。
  • Library.java:既存のすべてのメソッドを備えた Library クラスを維持します。ISBN によって蔵書から本を検索して削除する新しいメソッド removeBook(String isbn) を追加します。本が見つかって削除された場合は true、それ以外の場合は false を返す必要があります。本は現在利用可能な場合(貸し出されていない場合)にのみ削除できます。
  • LibraryAdmin.java:管理操作の契約を定義する LibraryAdmin というインターフェースを作成します。インターフェースには次の3つのメソッドを宣言します。
    • addBook(String isbn, String title, String author) - 成功したかどうかを示す boolean を返します
    • removeBook(String isbn) - 成功したかどうかを示す boolean を返します
    • registerUser(String id, String name) - 成功したかどうかを示す boolean を返します

    次に、このインターフェースを実装する AdminService というクラスを作成します。AdminService は Library への参照(コンストラクターを通じて渡される)を保持し、適切なフィードバックを追加しながら、Library に委譲して3つのメソッドをすべて実装します。本を追加するときは、新しい Book を作成して library に追加します。ユーザーを登録するときは、新しい User を作成して登録します。

  • Main.java:管理システムを実演します!管理コマンドの一連の並びを、カンマ区切りの1つの文字列として受け取ります。各コマンドは次のいずれかの形式に従います。
    • ADD_BOOK:isbn:title:author
    • REMOVE_BOOK:isbn
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Library と AdminService を作成します。各コマンドを処理し、結果を出力します。

    • ADD_BOOK の場合:成功時に Added: [title] を出力します
    • REMOVE_BOOK の場合:成功時に Removed: [isbn] を、または本が存在しないか貸し出し中の場合に Cannot remove: [isbn] を出力します
    • REGISTER_USER の場合:Registered: [name] を出力します
    • BORROW の場合:既存の library の貸し出し機能を使用します

    すべてのコマンドを処理した後、Library status: を出力し、その後に各本の詳細と利用可能状況を [details] - [Available/Borrowed] の形式で出力します。

入力として、カンマ区切りのコマンド文字列を1つ受け取ります。

たとえば、入力が REGISTER_USER:U001:Alice,ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Design Patterns:Gang of Four,BORROW:U001:ISBN-001,REMOVE_BOOK:ISBN-001,REMOVE_BOOK:ISBN-002 の場合、出力は次のようになります。

Registered: Alice
Added: Clean Code
Added: Design Patterns
Alice borrowed Clean Code
Cannot remove: ISBN-001
Removed: ISBN-002
Library status:
[ISBN-001] Clean Code by Robert Martin - Borrowed

Admin interface が管理操作の明確な契約を提供し、AdminService の実装が実際のロジックを処理していることに注目してください。このシステムは、貸し出し中の本の削除を正しく防ぎながら、利用可能な本の削除を許可します。インターフェースと実装を分離することは、コードを保守しやすく、テストしやすくする重要な OOP の原則です。

自分で試してみよう

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // カンマ区切りのコマンドを読み取る
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // LibraryとAdminServiceを作成する
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // 各コマンドを処理する
        for (String command : commands) {
            String[] parts = command.split(":");
            String operation = parts[0];
            
            if (operation.equals("ADD_BOOK")) {
                String isbn = parts[1];
                String title = parts[2];
                String author = parts[3];
                if (adminService.addBook(isbn, title, author)) {
                    System.out.println("Added: " + title);
                }
            } else if (operation.equals("REMOVE_BOOK")) {
                String isbn = parts[1];
                if (adminService.removeBook(isbn)) {
                    System.out.println("Removed: " + isbn);
                } else {
                    System.out.println("Cannot remove: " + isbn);
                }
            } else if (operation.equals("REGISTER_USER")) {
                String id = parts[1];
                String name = parts[2];
                if (adminService.registerUser(id, name)) {
                    System.out.println("Registered: " + name);
                }
            } else if (operation.equals("BORROW")) {
                String userId = parts[1];
                String isbn = parts[2];
                library.borrowBook(userId, isbn);
            }
        }
        
        // Print library status
        System.out.println("Library status:");
        ArrayList<Book> allBooks = library.getAllBooks();
        for (Book book : allBooks) {
            String status = book.isAvailable() ? "Available" : "Borrowed";
            System.out.println(book.getDetails() + " - " + status);
        }
    }
}

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

自分で練習してみよう: Javaオンラインコンパイラ