管理者用CLIインターフェース
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 103/107。
チャレンジ
簡単Command Patternを使用して、図書館管理システムのコマンドラインインターフェース(CLI)を構築しましょう!書籍の追加、ユーザーの登録、貸出操作の管理など、管理コマンドを処理するCLIを、クリーンで拡張性の高いアーキテクチャを通じて作成します。
コードを以下の6つのファイルに整理します:
book.go:ID、Title、Author、ISBN、AvailableのためのJSONタグを持つBook構造体。NewBookコンストラクタを含めます。user.go:ID、Name、Email、BorrowedBooksのためのJSONタグを持つUser構造体。NewUserコンストラクタを含めます。library.go: 書籍とユーザーのマップ、および以前のレッスンで作成したAddBook、AddUser、Borrow、Returnメソッドを持つLibrary構造体。commands.go: ここでCommand Patternが真価を発揮します!*Libraryと[]stringの引数を受け取り、文字列の結果を返すExecuteメソッドを持つCommandインターフェースを定義します。次に、以下のコマンド構造体を実装します:AddBookCommand— 4つの引数(id, title, author, isbn)を期待します。書籍を追加し、Book added: [title]を返します。AddUserCommand— 3つの引数(id, name, email)を期待します。ユーザーを追加し、User added: [name]を返します。BorrowCommand— 2つの引数(userID, bookID)を期待します。成功時にはBorrowed: [bookID]を、失敗時にはError: [message]を返します。ReturnCommand— 2つの引数(userID, bookID)を期待します。成功時にはReturned: [bookID]を、失敗時にはError: [message]を返します。ListBooksCommand— 引数は不要です。各書籍のIDとタイトルを[id]: [title]の形式で各行に返します。書籍がない場合はNo booksを返します(書籍はIDでソートしてリストします)。
コマンドに十分な引数がない場合は、
Error: insufficient argumentsを返してください。cli.go:Libraryへのポインタと、コマンド名からCommand実装へのマップを保持するCLI構造体を作成します。以下を構築してください:NewCLIコンストラクタ:ライブラリでCLIを初期化し、すべてのコマンド(addbook、adduser、borrow、return、listbooks)を登録します。Runメソッド:入力文字列を受け取り、strings.Fieldsを使用して解析し、コマンドを検索して実行します。入力が空の場合はNo command providedを、認識されないコマンドの場合はUnknown command: [name]を返します。
main.go: ライブラリとCLIを作成し、入力からコマンドを処理します。コマンドの数を読み取り、次に各コマンド文字列を個別の行で読み取ります。各コマンドに対してRunを呼び出し、結果を出力します。
以下の入力が提供されます:
- コマンドの数
- 各コマンド(1行に1つの完全な文字列として)
例えば、以下の場合:
6
addbook B001 Go-Programming Alan-Donovan 978-0134190440
addbook B002 Clean-Code Robert-Martin 978-0132350884
adduser U001 Alice alice@test.com
borrow U001 B001
listbooks
borrow U001 B001出力は以下のようになります:
Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not availableまた、以下の場合:
4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd test出力は以下のようになります:
No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmdさらに、以下の場合:
5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001出力は以下のようになります:
User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001CLIが各操作の詳細を知る必要がないことに注目してください。CLIは単にコマンドを検索し、実行を委譲するだけです。これにより、Commandインターフェースを実装する新しい構造体を作成し、CLIに登録するだけで、新しいコマンドを簡単に追加できるようになります!
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// コマンドの数を読み取る
var n int
fmt.Scanln(&n)
// 行全体を読み取るための scanner を作成する
scanner := bufio.NewScanner(os.Stdin)
// TODO: 新しい Library を作成する
// TODO: そのライブラリを使用して新しい CLI を作成する
// TODO: 各コマンドを処理する
// n 個の各コマンドについて:
// - scanner.Scan() と scanner.Text() を使用してコマンドラインを読み取る
// - CLI を通じてコマンドを実行する
// - 結果を表示する
_ = scanner // scanner を使用する際にこの行を削除する
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー