プロジェクトの概要と構成
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 98/107。
チャレンジ
簡単基礎となる構造をセットアップして、図書館管理システムプロジェクトを開始しましょう!この最初のステップでは、今後のレッスンで構築するすべての機能を支える基本的な足場を作成します。
関心の分離を明確にするために、コードを3つのファイルに整理します。
book.go: 図書館の本を表すBook構造体を定義します。各本はID、Title、Author、およびAvailableステータス(ブール値)を持つ必要があります。ID、タイトル、著者をパラメータとして受け取り、Availableがデフォルトでtrueに設定された新しい Book へのポインタを返すコンストラクタ関数NewBookを作成します。また、本の情報を[ID] Title by Authorの形式で返すString()メソッドを追加します。user.go:ID、Name、Emailフィールドを持つ図書館の利用者をあらわすUser構造体を定義します。3つの値すべてを受け取り、新しい User へのポインタを返すコンストラクタ関数NewUserを作成します。User: Name (Email)を返すString()メソッドを追加します。main.go: 入力を読み取って本とユーザーを作成し、それらの情報を表示することで、すべてをまとめます。作成する本の数を読み取ります。各本について、ID、タイトル、著者を別々の行で読み取ります。次にユーザーの数を読み取り、各ユーザーについて、ID、名前、メールアドレスを別々の行で読み取ります。
すべてのアイテムを作成した後、各本の文字列表現をそれぞれの行に出力し、続いて各ユーザーの文字列表現をそれぞれの行に出力します。
以下の入力が提供されます:
- 本の数
- 各本について:ID、タイトル、著者(それぞれ別々の行)
- ユーザーの数
- 各ユーザーについて:ID、名前、メールアドレス(それぞれ別々の行)
例えば、以下が与えられた場合:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.com出力は以下のようになります:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)また、以下が与えられた場合:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com出力は以下のようになります:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)この基盤により、プロジェクト全体で拡張していくコアデータモデルが確立されます。次のレッスンでは、これらの構造体を強化し、貸出機能を追加します!
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 本の数を読み込む
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: 本を格納するためのスライスを作成する
// TODO: 各本の情報(ID、タイトル、著者。それぞれ別々の行)を読み込む
// そして NewBook を使用して Book オブジェクトを作成する
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
// TODO: 新しい本を作成し、スライスに追加する
}
// ユーザーの数を読み込む
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: ユーザーを格納するためのスライスを作成する
// TODO: 各ユーザーの情報(ID、名前、メールアドレス。それぞれ別々の行)を読み込む
// そして NewUser を使用して User オブジェクトを作成する
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: 新しいユーザーを作成し、スライスに追加する
}
// TODO: 各本の文字列形式を出力する
// TODO: 各ユーザーの文字列形式を出力する
fmt.Println("TODO: Print output here")
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー