Menu
Coddy logo textTech

מתודות Getter

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 13 מתוך 70.

למדת לאחסן נתונים במשתני מופע כמו self.health או self.items. אמנם אפשר לגשת לשדות האלה ישירות מחוץ לאובייקט, אבל יש דרך נקייה יותר: שימוש במתודות getter.

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

למה לטרוח ולהוסיף מתודה? פונקציות גישה מספקות נקודת גישה מבוקרת לנתונים שלך.

כרגע, :getHealth() פשוט מחזירה את הערך. אבל בהמשך, אולי תרצה להוסיף לוגיקה: למשל, להחזיר "Critical" אם הבריאות יורדת מתחת ל־10, או לתעד בכל פעם שבודקים את הבריאות.

לאחר שהוספת פונקציית getter, אפשר לבצע את השינויים האלה בלי לשנות שום קוד שמשתמש באובייקט.

local hero = Player:new("Luna")
print(hero:getHealth())  -- פלט: 100
print(hero:getName())    -- פלט: Luna

התבנית הזו יוצרת גבול ברור בין המבנה הפנימי של אובייקט לבין האופן שבו קוד אחר מקיים איתו אינטראקציה. העולם החיצוני מבקש נתונים באמצעות מתודות במקום לגשת ישירות לשדות של האובייקט.

challenge icon

אתגר

קל

בואו נבנה מחלקת Player שמשתמשת בשיטות getter כדי לגשת לנתונים הפנימיים שלה. במקום לגשת ישירות לשדות של השחקן, תיצרו שיטות שמאפשרות גישה מבוקרת למידע של השחקן.

תארגנו את הקוד שלכם בשני קבצים:

  • Player.lua: הגדירו את מחלקת Player שלכם באמצעות תבנית האב־טיפוס המקובלת. הבנאי צריך לקבל שם ולאתחל את health ל־100. הוסיפו שלוש שיטות getter:
    • :getName() מחזירה את שם השחקן
    • :getHealth() מחזירה את הבריאות הנוכחית של השחקן
    • :getStatus() מחזירה מחרוזת מעוצבת שמשלבת את שני פרטי המידע
  • main.lua: טענו את המודול Player שלכם וצרו מופע של שחקן. השתמשו בשיטות getter כדי להציג את המידע של השחקן: גשו לכל המידע דרך שיטות במקום לקרוא ישירות את השדות.

השיטה :getStatus() שלכם צריכה להחזיר מחרוזת בדיוק בפורמט הזה:

[name] has [health] HP

תקבלו קלט אחד: שם השחקן.

בקובץ הראשי שלכם, צרו שחקן עם השם הנתון, ואז הדפיסו שלוש שורות באמצעות שיטות ה-getter שלכם:

  1. שם השחקן (באמצעות :getName())
  2. הבריאות של השחקן (באמצעות :getHealth())
  3. הסטטוס המלא של השחקן (באמצעות :getStatus())

לדוגמה, אם הקלט הוא Luna, הפלט צריך להיות:

Luna
100
Luna has 100 HP

נסו בעצמכם

-- טען את המודול Player באמצעות require
local Player = require('Player')

-- קרא את הקלט
local name = io.read()

-- TODO: צור מופע של שחקן עם השם הנתון

-- TODO: הדפס את שם השחקן באמצעות :getName()

-- TODO: הדפס את רמת הבריאות של השחקן באמצעות :getHealth()

-- TODO: הדפס את מצבו של השחקן באמצעות :getStatus()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Lua אונליין