Menu
Coddy logo textTech

セッターメソッド

CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 14/70。

ゲッターメソッドを使用すると、制御されたアクセスポイントを介して内部データを読み取ることができます。セッターメソッド(ミューテーターメソッドとも呼ばれます)はその逆で、内部状態を変更するための制御された方法を提供します。

直接 car.speed = 50 を代入する代わりに、car:setSpeed(50) を呼び出します:

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

function Car:getSpeed()
    return self.speed
end

一見すると、同じ結果を得るために余計な手間がかかっているように見えます。しかし、後でルールを追加する必要がある場合、セッターは強力なツールになります。例えば、速度が負の値にならないようにしたり、最高速度を超えないようにしたりしたい場合を想像してみてください:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

これで、すべての速度変更がバリデーションロジックを通過するようになります。:setSpeed() を使用しているコードは、変更を加えることなく自動的にこれらのチェックの恩恵を受けます。これがセッターの真の価値です。セッターはデータの変更方法を制御する単一のポイントを作成し、オブジェクトをより安全でメンテナンスしやすくします。

challenge icon

チャレンジ

簡単

セッターメソッドを使用してスマートに温度を制御する Thermostat クラスを作成しましょう。任意の温度値を許可するのではなく、サーモスタットが妥当な制限を強制し、温度を快適な範囲内に保つようにします。

コードは2つのファイルに分けて構成します:

  • Thermostat.lua: 標準的なプロトタイプパターンを使用して Thermostat クラスを定義します。各サーモスタットは現在の temperature を追跡する必要があります。以下を含めてください:
    • 温度を 20(快適なデフォルト値)に初期化する :new() コンストラクタ
    • 現在の温度を返す :getTemperature() ゲッター
    • 温度を更新するが、最小 10、最大 30 の範囲内に制限する :setTemperature(newTemp) セッター
  • main.lua: Thermostat モジュールをロードし、サーモスタットのインスタンスを作成します。セッターを使用してさまざまな温度変更を試み、制限がどのように適用されるかを確認してください。

:setTemperature() メソッドは以下のルールを適用する必要があります:

  • 新しい温度が 10 未満の場合は、10 に設定する
  • 新しい温度が 30 を超える場合は、30 に設定する
  • それ以外の場合は、要求された値に設定する

2つの入力を受け取ります:

  1. 設定する1つ目の温度
  2. 設定する2つ目の温度

メインファイルでサーモスタットを作成し、以下の手順を実行してください:

  1. 初期温度を表示する
  2. 温度を1つ目の入力値に設定し、結果を表示する
  3. 温度を2つ目の入力値に設定し、結果を表示する

各温度をそれぞれの行に表示してください(数値のみ)。

例えば、入力が 2550 の場合、出力は以下のようになります:

20
25
30

2回目の 50 に設定しようとする試みが 30 になっていることに注目してください。セッターが自動的に上限を適用しています!

チートシート

セッターメソッドは、内部状態を制御された方法で変更する手段を提供し、バリデーションルールや制約を追加することを可能にします。

基本的なセッターメソッドの構文:

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

バリデーション付きのセッターは、データが変更される際にルールを適用します:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

ゲッターとセッターを組み合わせることで、オブジェクトのプロパティへの制御されたアクセスを作成します:

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

function Car:getSpeed()
    return self.speed
end

セッターはデータ変更のための単一の制御点を作成し、オブジェクトをより安全でメンテナンスしやすくします。セッターを使用するすべてのコードは、変更を加えることなく、自動的にバリデーションロジックの恩恵を受けます。

自分で試してみよう

-- Thermostatモジュールを読み込む
local Thermostat = require('Thermostat')

-- 入力を読み込む
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())

-- TODO: サーモスタットのインスタンスを作成する

-- TODO: 初期温度を表示する

-- TODO: 温度をtemp1に設定し、結果を表示する

-- TODO: 温度をtemp2に設定し、結果を表示する
quiz icon腕試し

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

Object Oriented Programmingのすべてのレッスン