Menu
Coddy logo textTech

Getter & Setter メソッド

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

非exportedフィールドはpackageの外部から直接アクセスできないため、制御されたアクセスを可能にするメソッドを提供する必要があります。これらは一般にgettersetterと呼ばれます。

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は常に有効な状態に保たれます。これはカプセル化の実例です。データを隠しながら、制御された振る舞いを公開します。

challenge icon

チャレンジ

簡単

getter と setter メソッドを使用した適切なカプセル化を示す温度変換器を構築しましょう。内部では温度を Celsius で格納し、検証付きのメソッドを通じて制御されたアクセスを提供する struct を作成します。

コードを2つのファイルに分けて整理します。

  • temperature.go: 非公開の celsius field(float64)を持つ Temperature struct を Create します。次のメソッドを Implement してください。
    • Celsius() - current の温度を Celsius で return する getter
    • SetCelsius(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 格納します。
    また、given の値で initialized された温度を creates する constructor 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 します。

  1. 作成後: C: [celsius] F: [fahrenheit]
  2. Celsius の設定後: C: [celsius] F: [fahrenheit]
  3. Fahrenheit の設定後: C: [celsius] F: [fahrenheit]

たとえば、25-300212 が given の場合、output は次のようになります。

C: 25.00 F: 77.00
C: 25.00 F: 77.00
C: 100.00 F: 212.00

2行目では、-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 値の設定を試み、結果を出力する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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

自分で練習してみよう: Goオンラインコンパイラ