Menu
Coddy logo textTech

ゲッターメソッド

CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 13/70。

self.healthself.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

このパターンは、オブジェクトの内部構造と他のコードがそれと相互作用する方法の間に明確な境界を作成します。外部の世界は、オブジェクトのフィールドに直接アクセスするのではなく、メソッドを通じてデータを要求します。

challenge icon

チャレンジ

簡単

Player クラスを構築しましょう。このクラスは、内部データにアクセスするためのゲッターメソッドを使用します。プレイヤーのフィールドに直接アクセスする代わりに、プレイヤーの情報への制御されたアクセスを提供するメソッドを作成します。

コードを 2 つのファイルに分けて整理します:

  • Player.lua: 標準のプロトタイプパターンを使用して Player クラスを定義します。コンストラクタは名前を受け取り、健康値を 100 に初期化します。3 つのゲッターメソッドを追加します:
    • :getName() はプレイヤーの名前を返します
    • :getHealth() はプレイヤーの現在の健康値を返します
    • :getStatus() は両方の情報を組み合わせた書式化された文字列を返します
  • main.lua: Player モジュールを require し、プレイヤーインスタンスを作成します。ゲッターメソッドを使用してプレイヤーの情報を表示します—フィールドに直接読み込むのではなく、すべてメソッド経由でアクセスします。

:getStatus() メソッドは、以下の正確な形式の文字列を返す必要があります:

[name] has [health] HP

1 つの入力を受け取ります:プレイヤーの名前です。

メインのファイルで、与えられた名前でプレイヤーを作成し、ゲッターメソッドを使用して 3 行を出力します:

  1. プレイヤーの名前(:getName() を使用)
  2. プレイヤーの健康値(:getHealth() を使用)
  3. プレイヤーの完全なステータス(: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() を使用してプレイヤーのステータスを出力する
quiz icon腕試し

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

Object Oriented Programmingのすべてのレッスン