まとめ - 学生の記録
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 51/107。
チャレンジ
簡単適切なカプセル化を示す Student Records システムを構築しましょう。機密性の高い学業データを保護しながら、適切に設計された method を通じて制御されたアクセスを提供する学生管理構造を Create します。
コードを2つのファイルに分けて整理します。
student.go: 機密情報を保護しながら、安全な公開データを公開するStudentstruct を Create します。学生のNameは Exported(publicly accessible)にしますが、grade(float64)とstudentID(string)は、この機密情報を保護するために非公開にします。次を Implement してください。
- 学生を creates コンストラクター
NewStudent(name, id string, initialGrade float64) *Student。initial grade は 0 から 100 のinclusiveの範囲にある場合に only 設定し、それ以外はdefaultで 0 にします。 - current grade を返す getter
Grade() float64 - 学生の ID を返す getter
StudentID() string - 新しい値が 0 から 100 の
inclusiveの範囲にある場合に only grade を更新する setterSetGrade(newGrade float64) bool。grade が更新された場合はtrue、otherwise はfalseを返します。 - 次の Format を返す method
Summary() string:[Name] (ID: [studentID]) - Grade: [grade]
- 学生を creates コンストラクター
main.go: input から学生 information を読み取り、constructor を使用して学生を Create し、その後 grade の操作を実行します。creation 後、および各 grade 更新 Attempt 後に、学生の summary を表示します。
次の input が提供されます。
- line 1: 学生名
- line 2: 学生 ID
- line 3: Initial grade
- line 4: 設定する first new grade
- line 5: 設定する2番目の new grade
学生を creation した後、その summary を print します。次に各 grade 更新を Attempt し、成功した場合は更新された summary を print します。拒否された場合は Invalid grade rejected を print します。すべての grade 値は小数点以下2 places で Format してください。
たとえば、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 が有効な範囲外であるため失敗します。setter method がこのルールを適用し、学生の data を valid に保ちます。studentID と grade が直接 accessible になることは never ない点に注目してください。外部コードは、この保護された data を操作するために getter と setter method を使用する必要があります。
自分で試してみよう
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)
// 最初の新しい成績を読み取る
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: 最初の成績更新を試みる
// 成功した場合、更新されたサマリーを出力する
// If rejected, print "Invalid grade rejected"
// TODO: 2つ目の成績更新を試みる
// 成功した場合、更新されたサマリーを出力する
// If rejected, print "Invalid grade rejected"
// Hint: Summary()で成績をフォーマットするにはfmt.Sprintfと%.2fを使用する
_ = newGrade1 // 変数を使用するときにこの行を削除する
_ = newGrade2 // 変数を使用するときにこの行を削除する
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ