セッターメソッド
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() を使用しているコードは、変更を加えることなく自動的にこれらのチェックの恩恵を受けます。これがセッターの真の価値です。セッターはデータの変更方法を制御する単一のポイントを作成し、オブジェクトをより安全でメンテナンスしやすくします。
チャレンジ
簡単セッターメソッドを使用してスマートに温度を制御する Thermostat クラスを作成しましょう。任意の温度値を許可するのではなく、サーモスタットが妥当な制限を強制し、温度を快適な範囲内に保つようにします。
コードは2つのファイルに分けて構成します:
Thermostat.lua: 標準的なプロトタイプパターンを使用してThermostatクラスを定義します。各サーモスタットは現在のtemperatureを追跡する必要があります。以下を含めてください:- 温度を
20(快適なデフォルト値)に初期化する:new()コンストラクタ - 現在の温度を返す
:getTemperature()ゲッター - 温度を更新するが、最小
10、最大30の範囲内に制限する:setTemperature(newTemp)セッター
- 温度を
main.lua: Thermostat モジュールをロードし、サーモスタットのインスタンスを作成します。セッターを使用してさまざまな温度変更を試み、制限がどのように適用されるかを確認してください。
:setTemperature() メソッドは以下のルールを適用する必要があります:
- 新しい温度が
10未満の場合は、10に設定する - 新しい温度が
30を超える場合は、30に設定する - それ以外の場合は、要求された値に設定する
2つの入力を受け取ります:
- 設定する1つ目の温度
- 設定する2つ目の温度
メインファイルでサーモスタットを作成し、以下の手順を実行してください:
- 初期温度を表示する
- 温度を1つ目の入力値に設定し、結果を表示する
- 温度を2つ目の入力値に設定し、結果を表示する
各温度をそれぞれの行に表示してください(数値のみ)。
例えば、入力が 25 と 50 の場合、出力は以下のようになります:
20
25
302回目の 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に設定し、結果を表示する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。