まとめ - 学生の記録
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 51/107。
チャレンジ
簡単適切なカプセル化を実証する学生記録システムを構築しましょう。機密性の高い学術データが保護されつつ、適切に設計されたメソッドを通じて制御されたアクセスを提供する学生管理構造を作成します。
コードは2つのファイルに分けて構成します:
student.go: 安全な公開データを公開しつつ、機密情報を保護するStudent構造体を作成します。学生のNameはエクスポート(公開アクセス可能)されるべきですが、grade(float64) とstudentID(string) は、これらの機密情報を保護するためにエクスポートされない(非公開)ようにする必要があります。以下を実装してください:
- 学生を作成するコンストラクタ
NewStudent(name, id string, initialGrade float64) *Student。初期成績は、0から100(両端を含む)の間である場合にのみ設定し、それ以外の場合はデフォルトの0にします。 - 現在の成績を返すゲッター
Grade() float64 - 学生IDを返すゲッター
StudentID() string - 新しい値が0から100(両端を含む)の間である場合にのみ成績を更新するセッター
SetGrade(newGrade float64) bool。成績が更新された場合はtrueを、そうでない場合はfalseを返します。 [Name] (ID: [studentID]) - Grade: [grade]という形式を返すメソッドSummary() string
- 学生を作成するコンストラクタ
main.go: 入力から学生情報を読み取り、コンストラクタを使用して学生を作成し、成績の操作を実行します。作成後および各成績更新の試行後に、学生のサマリーを表示します。
以下の入力が提供されます:
- 1行目: 学生の名前
- 2行目: 学生ID
- 3行目: 初期成績
- 4行目: 設定する1つ目の新しい成績
- 5行目: 設定する2つ目の新しい成績
学生を作成した後、そのサマリーを出力します。次に、各成績更新を試みます。成功した場合は更新されたサマリーを出力し、拒否された場合は Invalid grade rejected と出力します。すべての成績の値は小数点以下2桁でフォーマットしてください。
例えば、Emma Wilson、STU001、85.5、92.0、150 が与えられた場合、出力は以下のようになります:
Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejected最後の更新は、150が有効な範囲外であるため失敗します。セッターメソッドがこのルールを強制し、学生のデータを有効に保ちます。studentID と grade が直接アクセスされることはなく、外部コードがこれらの保護されたデータとやり取りするには、ゲッターおよびセッターメソッドを使用する必要があることに注目してください。
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 学生の名前を読み取る
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// 学生IDを読み取る
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
// 初期の成績を読み取る
initialGradeStr, _ := reader.ReadString('\n')
initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)
// 1つ目の新しい成績を読み取る
newGrade1Str, _ := reader.ReadString('\n')
newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)
// 2つ目の新しい成績を読み取る
newGrade2Str, _ := reader.ReadString('\n')
newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)
// TODO: NewStudentコンストラクタを使用して新しい学生を作成する
// TODO: 作成後、学生の概要を出力する
// TODO: 1回目の成績更新を試みる
// 成功した場合は、更新された概要を出力する
// 拒否された場合は、"Invalid grade rejected" と出力する
// TODO: 2回目の成績更新を試みる
// 成功した場合は、更新された概要を出力する
// 拒否された場合は、"Invalid grade rejected" と出力する
// ヒント: Summary() で成績をフォーマットするには、%.2f とともに fmt.Sprintf を使用する
_ = newGrade1 // 変数を使用する際にこの行を削除する
_ = newGrade2 // 変数を使用する際にこの行を削除する
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー