מתודות 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() נהנה אוטומטית מהבדיקות האלה ללא שינוי. זהו הערך האמיתי של פונקציות הגדרה. הן יוצרות נקודה יחידה שבה אפשר לשלוט באופן שבו הנתונים משתנים, וכך הופכות את האובייקטים שלך לבטוחים יותר וקלים יותר לתחזוקה.
אתגר
קלבואו נבנה מחלקת Thermostat שמשתמשת בשיטות setter כדי לשלוט בטמפרטורה בצורה חכמה. במקום לאפשר כל ערך טמפרטורה, התרמוסטט שלך יאכוף גבולות סבירים וישמור את הטמפרטורה בטווח נוח.
תארגן את הקוד שלך בשני קבצים:
Thermostat.lua: הגדר את המחלקהThermostatבאמצעות תבנית אב־טיפוס סטנדרטית. כל תרמוסטט צריך לעקוב אחר ה-temperatureהנוכחית שלו. כלול:- בנאי
:new()שמאתחל את הטמפרטורה ל-20(ברירת מחדל נוחה) - getter בשם
:getTemperature()שמחזיר את הטמפרטורה הנוכחית - setter בשם
:setTemperature(newTemp)שמעדכן את הטמפרטורה, אך שומר אותה בתוך הגבולות: מינימום10ומקסימום30
- בנאי
main.lua: טען את מודול Thermostat שלך וצור מופע של תרמוסטט. השתמש ב-setter כדי לנסות שינויים שונים בטמפרטורה ולראות כיצד הגבולות נאכפים.
השיטה :setTemperature() שלך צריכה לאכוף את הכללים האלה:
- אם הטמפרטורה החדשה נמוכה מ-
10, קבע אותה ל-10 - אם הטמפרטורה החדשה גבוהה מ-
30, קבע אותה ל-30 - אחרת, קבע אותה לערך המבוקש
תקבל שתי קלטים:
- הטמפרטורה הראשונה שיש לקבוע
- הטמפרטורה השנייה שיש לקבוע
בקובץ הראשי שלך, צור תרמוסטט, ואז:
- הדפס את הטמפרטורה ההתחלתית
- קבע את הטמפרטורה לערך הקלט הראשון והדפס את התוצאה
- קבע את הטמפרטורה לערך הקלט השני והדפס את התוצאה
הדפס כל טמפרטורה בשורה נפרדת (רק את המספר).
לדוגמה, אם הקלטים הם 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 והדפס את התוצאה
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין