Menu
Coddy logo textTech

セッターメソッド

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 はデータの変更方法を制御する単一の場所を作り、オブジェクトの安全性を高め、保守しやすくします。

challenge icon

チャレンジ

簡単

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が与えられます。

  1. 最初に設定する温度
  2. 次に設定する温度

mainファイルでthermostatを作成し、次の操作を行います。

  1. initial温度をPrintする
  2. 温度を最初のinput値に設定し、resultをPrintする
  3. 温度を2番目のinput値に設定し、resultをPrintする

各温度をそれぞれ1行にPrintします(数字のみ)。

たとえば、inputが2550の場合、出力は次のようになります。

20
25
30

2回目に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に設定して結果を出力する
quiz icon腕試し

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

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

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