ゲッターメソッド
CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 13/70。
self.health や self.items のようなインスタンス変数にデータを格納する方法を学びました。オブジェクトの外部からこれらのフィールドに直接アクセスすることは可能ですが、よりクリーンなアプローチがあります:ゲッターメソッドを使用することです。
ゲッター(アクセサメソッドとも呼ばれる)は、内部の値を返すシンプルなメソッドです。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なぜわざわざ追加のメソッドを使うのか?ゲッターはデータへの制御されたアクセスポイントを提供します。
現在、:getHealth() は単にその値を返します。しかし、後でロジックを追加したくなるかもしれません—例えば、ヘルスが 10 未満に低下したら「クリティカル」を返す、またはヘルスがチェックされるたびにログを記録するなどです。
getter が設定されていると、オブジェクトを使用するコードを変更せずにこれらの変更を加えることができます。
local hero = Player:new("Luna")
print(hero:getHealth()) -- Output: 100
print(hero:getName()) -- Output: Lunaこのパターンは、オブジェクトの内部構造と他のコードがそれと相互作用する方法の間に明確な境界を作成します。外部の世界は、オブジェクトのフィールドに直接アクセスするのではなく、メソッドを通じてデータを要求します。
チャレンジ
簡単Player クラスを構築しましょう。このクラスは、内部データにアクセスするためのゲッターメソッドを使用します。プレイヤーのフィールドに直接アクセスする代わりに、プレイヤーの情報への制御されたアクセスを提供するメソッドを作成します。
コードを 2 つのファイルに分けて整理します:
Player.lua: 標準のプロトタイプパターンを使用してPlayerクラスを定義します。コンストラクタは名前を受け取り、健康値を100に初期化します。3 つのゲッターメソッドを追加します::getName()はプレイヤーの名前を返します:getHealth()はプレイヤーの現在の健康値を返します:getStatus()は両方の情報を組み合わせた書式化された文字列を返します
main.lua: Player モジュールを require し、プレイヤーインスタンスを作成します。ゲッターメソッドを使用してプレイヤーの情報を表示します—フィールドに直接読み込むのではなく、すべてメソッド経由でアクセスします。
:getStatus() メソッドは、以下の正確な形式の文字列を返す必要があります:
[name] has [health] HP1 つの入力を受け取ります:プレイヤーの名前です。
メインのファイルで、与えられた名前でプレイヤーを作成し、ゲッターメソッドを使用して 3 行を出力します:
- プレイヤーの名前(
:getName()を使用) - プレイヤーの健康値(
:getHealth()を使用) - プレイヤーの完全なステータス(
:getStatus()を使用)
たとえば、入力が Luna の場合、出力は次のようになります:
Luna
100
Luna has 100 HPチートシート
ゲッターメソッド(またはアクセサーメソッド)は、オブジェクトから内部値を返すメソッドです。フィールドに直接アクセスする代わりに、メソッドを呼び出してデータを取得します。
基本的なゲッターメソッド:
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endゲッターメソッドの使用:
local hero = Player:new("Luna")
print(hero:getHealth()) -- Output: 100
print(hero:getName()) -- Output: Lunaゲッターはデータへの制御されたアクセスポイントを提供します。オブジェクトの内部構造と他のコードがそれとやり取りする方法の間に明確な境界を作成します。これにより、オブジェクトを使用するコードを変更せずに、後でロジック(検証やログ記録など)を追加できます。
自分で試してみよう
-- Player モジュールを読み込む
local Player = require('Player')
-- 入力を読み込む
local name = io.read()
-- TODO: 与えられた名前でプレイヤーインスタンスを作成する
-- TODO: :getName() を使用してプレイヤーの名前を出力する
-- TODO: :getHealth() を使用してプレイヤーのヘルスを出力する
-- TODO: :getStatus() を使用してプレイヤーのステータスを出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。