管理者インターフェース
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 81/87。
チャレンジ
簡単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: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 の貸し出し機能を使用します
すべてのコマンドを処理した後、
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 - BorrowedAdmin 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);
}
}
}
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造自分で練習してみよう: Javaオンラインコンパイラ