Menu
Coddy logo textTech

מתודות Setter

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

מתודות Getter מאפשרות לקרוא נתונים פנימיים דרך נקודת גישה מבוקרת. מתודות Setter (הנקראות גם מתודות מוטטור) עושות את ההפך. הן מספקות דרך מבוקרת לשנות מצב פנימי.

במקום להקצות ישירות car.speed = 50, קוראים ל־car:setSpeed(50):

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

function Car:getSpeed()
    return self.speed
end

במבט ראשון, נראה שזו עבודה נוספת עבור אותה תוצאה. אבל פונקציות הגדרה נעשות עוצמתיות כשצריך להוסיף כללים בהמשך. דמיינו שאתם רוצים לוודא שהמהירות לעולם לא תהיה שלילית או תחרוג מהמקסימום:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

כעת כל שינוי מהירות עובר דרך לוגיקת האימות שלך. כל קוד שמשתמש ב־:setSpeed() נהנה אוטומטית מהבדיקות האלה ללא שינוי. זהו הערך האמיתי של פונקציות הגדרה. הן יוצרות נקודה יחידה שבה אפשר לשלוט באופן שבו הנתונים משתנים, וכך הופכות את האובייקטים שלך לבטוחים יותר וקלים יותר לתחזוקה.

challenge icon

אתגר

קל

בואו נבנה מחלקת Thermostat שמשתמשת בשיטות setter כדי לשלוט בטמפרטורה בצורה חכמה. במקום לאפשר כל ערך טמפרטורה, התרמוסטט שלך יאכוף גבולות סבירים וישמור את הטמפרטורה בטווח נוח.

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

  • Thermostat.lua: הגדר את המחלקה Thermostat באמצעות תבנית אב־טיפוס סטנדרטית. כל תרמוסטט צריך לעקוב אחר ה-temperature הנוכחית שלו. כלול:
    • בנאי :new() שמאתחל את הטמפרטורה ל-20 (ברירת מחדל נוחה)
    • getter בשם :getTemperature() שמחזיר את הטמפרטורה הנוכחית
    • setter בשם :setTemperature(newTemp) שמעדכן את הטמפרטורה, אך שומר אותה בתוך הגבולות: מינימום 10 ומקסימום 30
  • main.lua: טען את מודול Thermostat שלך וצור מופע של תרמוסטט. השתמש ב-setter כדי לנסות שינויים שונים בטמפרטורה ולראות כיצד הגבולות נאכפים.

השיטה :setTemperature() שלך צריכה לאכוף את הכללים האלה:

  • אם הטמפרטורה החדשה נמוכה מ-10, קבע אותה ל-10
  • אם הטמפרטורה החדשה גבוהה מ-30, קבע אותה ל-30
  • אחרת, קבע אותה לערך המבוקש

תקבל שתי קלטים:

  1. הטמפרטורה הראשונה שיש לקבוע
  2. הטמפרטורה השנייה שיש לקבוע

בקובץ הראשי שלך, צור תרמוסטט, ואז:

  1. הדפס את הטמפרטורה ההתחלתית
  2. קבע את הטמפרטורה לערך הקלט הראשון והדפס את התוצאה
  3. קבע את הטמפרטורה לערך הקלט השני והדפס את התוצאה

הדפס כל טמפרטורה בשורה נפרדת (רק את המספר).

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

20
25
30

שים לב שהניסיון השני לקבוע את 50 מסתיים בערך 30: ה-setter אוכף את הגבול העליון באופן אוטומטי!

נסו בעצמכם

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

-- קרא את הקלט
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())

-- TODO: צור מופע של תרמוסטט

-- TODO: הדפס את הטמפרטורה ההתחלתית

-- TODO: הגדר את הטמפרטורה ל-temp1 והדפס את התוצאה

-- TODO: הגדר את הטמפרטורה ל-temp2 והדפס את התוצאה
quiz iconבחנו את עצמכם

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

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

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