Getter & Setter メソッド
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 49/107。
非exportedフィールドはpackageの外部から直接アクセスできないため、制御されたアクセスを可能にするメソッドを提供する必要があります。これらは一般にgetterとsetterと呼ばれます。
Go では、ゲッターの規則はシンプルです。最初の文字を大文字にした field 名を使います。"Get" を前に付けず、GetBalance() ではなく Balance() を使います。
type BankAccount struct {
balance int // 非公開
}
// Getter - 値を返す
func (b *BankAccount) Balance() int {
return b.balance
}
// Setter - 検証付きで値を変更する
func (b *BankAccount) SetBalance(amount int) {
if amount >= 0 {
b.balance = amount
}
}
setterの本当の力は、検証やビジネスロジックを追加できることです。外部のコードから任意の値を直接設定できるようにするのではなく、何が許可されるかを制御します。
func (b *BankAccount) Deposit(amount int) bool {
if amount <= 0 {
return false
}
b.balance += amount
return true
}
このDepositメソッドは、ルール(負の預け入れは許可しない)を適用する特殊なsetterとして機能します。外部コードは必ずあなたのメソッドを介する必要があるため、structは常に有効な状態に保たれます。これはカプセル化の実例です。データを隠しながら、制御された振る舞いを公開します。
チャレンジ
簡単getter と setter メソッドを使用した適切なカプセル化を示す温度変換器を構築しましょう。内部では温度を Celsius で格納し、検証付きのメソッドを通じて制御されたアクセスを提供する struct を作成します。
コードを2つのファイルに分けて整理します。
temperature.go: 非公開のcelsiusfield(float64)を持つTemperaturestruct を Create します。次のメソッドを Implement してください。Celsius()- current の温度を Celsius で return する getterSetCelsius(value float64)- absolute zero (-273.15) 以上の値だけを accepts する setter。値がこのしきい値を下回る場合、温度は変更されないままにします。Fahrenheit()- Formula(celsius * 9/5) + 32を使用して温度を Fahrenheit に converted して return するメソッドSetFahrenheit(value float64)- input を Fahrenheit から Celsius に converts して格納します。ただし、resulting Celsius の値が -273.15 以上の場合に Only 格納します。
NewTemperature(celsius float64) *Temperatureも追加してください(constructor への input は valid であると assume します)。main.go: input から温度の値を Read し、getter/setter メソッドを実演します。温度を Create し、その値を両方の単位で表示してから、新しい値の設定を Attempt し、resulting 値を表示します。
次の input が提供されます。
- Line 1: Initial Celsius value
- Line 2: 設定する New Celsius value
- Line 3: 設定する New Fahrenheit value
すべての温度の出力を小数点以下2 places で format してください。次の sequence を Print します。
- 作成後:
C: [celsius] F: [fahrenheit] - Celsius の設定後:
C: [celsius] F: [fahrenheit] - Fahrenheit の設定後:
C: [celsius] F: [fahrenheit]
たとえば、25、-300、212 が given の場合、output は次のようになります。
C: 25.00 F: 77.00
C: 25.00 F: 77.00
C: 100.00 F: 212.002行目では、-300 が absolute zero を下回るため setter がその値を拒否し、変更されていない値が表示されていることに注目してください。3行目には、212°F の設定に成功した後の温度が表示されます(これは 100°C に converts されます)。これが setter の力です。setter はデータを valid に保つルールを適用します。
自分で試してみよう
package main
import (
"fmt"
)
func main() {
// 入力値を読み取る
var initialCelsius float64
var newCelsius float64
var newFahrenheit float64
fmt.Scanln(&initialCelsius)
fmt.Scanln(&newCelsius)
fmt.Scanln(&newFahrenheit)
// TODO: コンストラクタを使用して新しい Temperature を作成する
// TODO: 初期値を "C: [celsius] F: [fahrenheit]" の形式で小数点以下2桁で出力する
// TODO: 新しい Celsius 値の設定を試み、結果を出力する
// TODO: 新しい Fahrenheit 値の設定を試み、結果を出力する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ