セッターメソッド
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 14/70。
Getter メソッドを使うと、制御されたアクセス点を通じて内部データを読み取れます。Setter メソッド(mutator メソッドとも呼ばれます)はその反対の働きをします。内部状態を変更するための制御された方法を提供します。
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一見すると、同じ結果を得るための余計な作業のように思えます。しかし、後からルールを追加する必要があるとき、Setterは強力なものになります。速度が決して負にならず、最大値を超えないようにしたいとします。
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()を使用するコードは、変更を加えなくても自動的にこれらのチェックの恩恵を受けます。これが Setter の本当の価値です。Setter はデータの変更方法を制御する単一の場所を作り、オブジェクトの安全性を高め、保守しやすくします。
チャレンジ
簡単Thermostatクラスを作成し、セッターメソッドを使って温度をスマートに制御しましょう。任意の温度値を許可する代わりに、サーモスタットで適切な制限を適用し、温度を快適な範囲内に保ちます。
コードを2つのファイルに分けて整理します。
Thermostat.lua:標準的なprototype patternを使ってThermostatクラスをDefineします。各サーモスタットは現在のtemperatureを追跡する必要があります。以下を含めます。- 温度を
20(快適なデフォルト値)にinitializesする:new()Constructor - 現在の温度をreturnsする
:getTemperature()Getter - 温度をupdatesする
:setTemperature(newTemp)Setter。ただし、最小値10、最大値30のbounds内に保ちます
- 温度を
main.lua:Thermostat moduleをRequireして、thermostat instanceを作成します。Setterを使って異なる温度変更を試し、制限がどのように適用されるかを確認します。
:setTemperature()メソッドでは、次のルールを適用します。
- 新しい温度が
10未満の場合は、10に設定する - 新しい温度が
30を超える場合は、30に設定する - Otherwise、要求された値に設定する
2つのinputが与えられます。
- 最初に設定する温度
- 次に設定する温度
mainファイルでthermostatを作成し、次の操作を行います。
- initial温度をPrintする
- 温度を最初のinput値に設定し、resultをPrintする
- 温度を2番目のinput値に設定し、resultをPrintする
各温度をそれぞれ1行にPrintします(数字のみ)。
たとえば、inputが25と50の場合、出力は次のようになります。
20
25
302回目に50を設定しようとすると30になることに注目してください。Setterが最大値の制限を自動的に適用しています。
自分で試してみよう
-- Thermostatモジュールを読み込む
local Thermostat = require('Thermostat')
-- 入力を読み取る
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())
-- TODO: Thermostatのインスタンスを作成する
-- TODO: 初期温度を出力する
-- TODO: 温度をtemp1に設定して結果を出力する
-- TODO: 温度をtemp2に設定して結果を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ