Menu
Coddy logo textTech

管理者インターフェース

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

challenge icon

チャレンジ

簡単

管理者インターフェースを使用して、図書館管理システムを拡張しましょう!実際の図書館には、新しい本の追加、古い本の削除、新しい利用者の登録といった管理機能が必要です。これらの管理操作を定義するインターフェースを作成し、専用の管理クラスでそれらを実装します。

5つのファイルにわたって、既存のコードを基に構築を続けます:

  • Book.java: 既存のすべての機能(isbn、title、author、isAvailable、borrowedBy、getDetails()、および適切なゲッター/セッター)を備えた Book クラスを保持します。
  • 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 を作成してライブラリに追加します。利用者を登録するときは、新しい User を作成して登録します。

  • Main.java: 管理システムを実演しましょう!一連の管理コマンドを、単一のカンマ区切り文字列として受け取ります。各コマンドは次のいずれかの形式に従います:
    • 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 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

管理インターフェースが管理操作のためのクリーンなコントラクトを提供し、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);
            }
        }
        
        // ライブラリの状態を表示する
        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);
        }
    }
}

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