Menu
Coddy logo textTech

管理者用CLIインターフェース

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

challenge icon

チャレンジ

簡単

Command Patternを使用して、図書館管理システムのコマンドラインインターフェース(CLI)を構築しましょう!書籍の追加、ユーザーの登録、貸出操作の管理など、管理コマンドを処理するCLIを、クリーンで拡張性の高いアーキテクチャを通じて作成します。

コードを以下の6つのファイルに整理します:

  • book.go: IDTitleAuthorISBNAvailableのためのJSONタグを持つBook構造体。NewBookコンストラクタを含めます。
  • user.go: IDNameEmailBorrowedBooksのためのJSONタグを持つUser構造体。NewUserコンストラクタを含めます。
  • library.go: 書籍とユーザーのマップ、および以前のレッスンで作成したAddBookAddUserBorrowReturnメソッドを持つ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を初期化し、すべてのコマンド(addbookadduserborrowreturnlistbooks)を登録します。
    • 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: B001

CLIが各操作の詳細を知る必要がないことに注目してください。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 を使用する際にこの行を削除する
}

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