ゲッターメソッド
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 13/70。
self.healthやself.itemsのようなインスタンス変数にデータを格納する方法を学びました。オブジェクトの外部からこれらのフィールドに直接アクセスすることもできますが、よりすっきりした方法があります。それは、ゲッターメソッドをusingすることです。
getter(アクセサメソッドとも呼ばれます)は、内部の値を返すシンプルなメソッドです。player.healthに直接アクセスする代わりに、player:getHealth()を呼び出します。
local Player = {}
Player.__index = Player
function Player:new(name)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.health = 100
return instance
end
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endなぜ余分なmethodを用意するのでしょうか? ゲッターはあなたのdataへの制御されたアクセスポイントを提供します。
現時点では、:getHealth()は単に値を返します。しかし後で、ロジックを追加したくなるかもしれません。たとえば、healthが10未満に下がった場合に"Critical"を返したり、healthが確認されるたびにログを記録したりすることが考えられます。
getter を用意しておけば、オブジェクトを使用するコードを変更せずに、これらの変更を行えます。
local hero = Player:new("Luna")
print(hero:getHealth()) -- 出力: 100
print(hero:getName()) -- 出力: Lunaこのパターンは、オブジェクトの内部構造と、他のコードがオブジェクトとどのようにやり取りするかの間に、明確な境界を作ります。外部のコードは、オブジェクトのフィールドに直接アクセスするのではなく、メソッドを通じてデータを要求します。
チャレンジ
簡単Player class を構築し、getter メソッドを使って内部データにアクセスしましょう。player のフィールドに直接アクセスする代わりに、player の情報への制御されたアクセスを提供するメソッドを作成します。
コードは2つのファイルに分けて整理します。
Player.lua:標準的な prototype pattern を使ってPlayerclass を Define します。Constructor は名前を受け取り、health を100に Initialize します。次の3つの getter メソッドを追加します。:getName()は player の名前を returns します:getHealth()は player の current health を returns します:getStatus()は両方の情報を組み合わせた formatted string を returns します
main.lua:Player module を Require し、player instance を Create します。getter メソッドを使って player の情報を表示します。フィールドを直接読み取るのではなく、すべてメソッドを通してアクセスしてください。
:getStatus() method は、次の exact format の string を returns する必要があります。
[name] has [health] HP入力は1つです。player の名前が与えられます。
main file で、given name を使って player を Create し、その後、getter メソッドを使って3行を Print します。
- player の名前(
:getName()を using) - player の health(
:getHealth()を using) - player の full status(
:getStatus()を using)
たとえば、input が Luna の場合、Output は次のようになります。
Luna
100
Luna has 100 HP自分で試してみよう
-- Playerモジュールを読み込む
local Player = require('Player')
-- 入力を読み取る
local name = io.read()
-- TODO: 指定された名前でプレイヤーインスタンスを作成する
-- TODO: :getName()を使ってプレイヤーの名前を出力する
-- TODO: :getHealth()を使ってプレイヤーの体力を出力する
-- TODO: :getStatus()を使ってプレイヤーのステータスを出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ