管理者インターフェース
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 81/87。
チャレンジ
簡単管理者インターフェースを使用して、図書館管理システムを拡張しましょう!実際の図書館には、新しい本の追加、古い本の削除、新しい利用者の登録といった管理機能が必要です。これらの管理操作を定義するインターフェースを作成し、専用の管理クラスでそれらを実装します。
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:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW: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);
}
}
}
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造