מתודות 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התבנית הזו יוצרת גבול ברור בין המבנה הפנימי של אובייקט לבין האופן שבו קוד אחר מקיים איתו אינטראקציה. העולם החיצוני מבקש נתונים באמצעות מתודות במקום לגשת ישירות לשדות של האובייקט.
אתגר
קלבואו נבנה מחלקת Player שמשתמשת בשיטות getter כדי לגשת לנתונים הפנימיים שלה. במקום לגשת ישירות לשדות של השחקן, תיצרו שיטות שמאפשרות גישה מבוקרת למידע של השחקן.
תארגנו את הקוד שלכם בשני קבצים:
Player.lua: הגדירו את מחלקתPlayerשלכם באמצעות תבנית האב־טיפוס המקובלת. הבנאי צריך לקבל שם ולאתחל את health ל־100. הוסיפו שלוש שיטות getter::getName()מחזירה את שם השחקן:getHealth()מחזירה את הבריאות הנוכחית של השחקן:getStatus()מחזירה מחרוזת מעוצבת שמשלבת את שני פרטי המידע
main.lua: טענו את המודול Player שלכם וצרו מופע של שחקן. השתמשו בשיטות getter כדי להציג את המידע של השחקן: גשו לכל המידע דרך שיטות במקום לקרוא ישירות את השדות.
השיטה :getStatus() שלכם צריכה להחזיר מחרוזת בדיוק בפורמט הזה:
[name] has [health] HPתקבלו קלט אחד: שם השחקן.
בקובץ הראשי שלכם, צרו שחקן עם השם הנתון, ואז הדפיסו שלוש שורות באמצעות שיטות ה-getter שלכם:
- שם השחקן (באמצעות
:getName()) - הבריאות של השחקן (באמצעות
:getHealth()) - הסטטוס המלא של השחקן (באמצעות
: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()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין