לוגיקת אימות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 47 מתוך 70.
עד כה, חקרנו דרכים שונות להגן על נתונים: מוסכמות שמות מסמנות את הכוונה, סגירות מסתירות משתנים לחלוטין, וטבלאות לקריאה בלבד מונעות כל שינוי. אבל לעיתים קרובות צריך משהו באמצע: לאפשר שינויים, אבל רק תקינים.
כאן שיטות setter הופכות לעוצמתיות. במקום רק להציב ערך, setter יכול לבדוק אם הערך החדש הגיוני לפני שהוא מקבל אותו:
local Person = {}
Person.__index = Person
function Person:new(name, age)
local obj = {
_name = name,
_age = age
}
setmetatable(obj, Person)
return obj
end
function Person:setAge(newAge)
if newAge < 0 then
print("Error: Age cannot be negative")
return
end
self._age = newAge
endכשמישהו קורא ל־person:setAge(-5), המתודה מזהה את הקלט הלא תקין ומסרבת לעדכן. מצב האובייקט נשאר עקבי. ללא ההגנה הזאת, נתונים שגויים עלולים לפגוע בתוכנית שלך מבלי שתבחין בכך: דמיין חישוב של קצבאות פרישה לפי גיל שלילי.
האימות יכול להיות פשוט או מורכב ככל שנדרש. אפשר לבדוק טווחים, לוודא טיפוסים או לוודא שהערכים תואמים לתבניות הצפויות. העיקרון המרכזי הוא שה־setter משמש כשומר סף, ומבטיח שרק נתונים הגיוניים ייכנסו לאובייקט שלך.
אתגר
קלבואו נבנה מחלקה Player שמגינה על מאפייני הבריאות והרמה שלה באמצעות לוגיקת אימות בשיטות setter! כך נבטיח שדמויות במשחק לעולם לא יגיעו לנתונים בלתי אפשריים.
תארגן את הקוד שלך בשני קבצים:
Player.lua: צור מחלקה שמנהלת את הנתונים של השחקן באמצעות אימות מתאים. הבנאי:new(name)צריך לאתחל את השחקן עם שם, כאשר_healthמוגדר ל-100, ו-_levelמוגדר ל-1. כלול את השיטות הבאות::getName(): מחזירה את שם השחקן:getHealth(): מחזירה את הבריאות הנוכחית:getLevel(): מחזירה את הרמה הנוכחית:setHealth(value): מעדכנת את הבריאות רק אם הערך הוא בין 0 ל-100 (כולל). אם הערך אינו תקין, הדפסError: Health must be between 0 and 100ואל תשנה את הערך.:setLevel(value): מעדכנת את הרמה רק אם הערך הוא 1 או יותר. אם הערך אינו תקין, הדפסError: Level must be at least 1ואל תשנה את הערך.
main.lua: טען את המודול Player שלך וקרא שם של שחקן, ולאחר מכן שני ערכים לבדיקת שיטות ה-setter. צור שחקן, נסה להגדיר את הבריאות שלו לערך הראשון, נסה להגדיר את הרמה שלו לערך השני, ואז הדפס את הנתונים הסופיים של השחקן.
יתקבלו שלושה קלטים:
- שם השחקן
- ערך בריאות שיש לנסות להגדיר (מספר, שיכול להיות תקין או לא תקין)
- ערך רמה שיש לנסות להגדיר (מספר, שיכול להיות תקין או לא תקין)
הפלט שלך צריך להציג הודעות שגיאה עבור ניסיונות לא תקינים, ולאחר מכן את הנתונים הסופיים של השחקן:
Name: {name}
Health: {finalHealth}
Level: {finalLevel}לדוגמה, אם הקלטים הם Hero, -20 ו-5, הפלט צריך להיות:
Error: Health must be between 0 and 100
Name: Hero
Health: 100
Level: 5שיטת ה-setter של הבריאות דחתה את -20 (והשאירה את הבריאות על 100), ואילו שיטת ה-setter של הרמה קיבלה את 5 כערך תקין.
אם הקלטים הם Warrior, 75 ו-0, הפלט צריך להיות:
Error: Level must be at least 1
Name: Warrior
Health: 75
Level: 1נסו בעצמכם
-- טען את המודול Player
local Player = require('Player')
-- קרא את הקלטים
local name = io.read()
local healthValue = tonumber(io.read())
local levelValue = tonumber(io.read())
-- TODO: צור שחקן חדש עם השם הנתון
-- TODO: נסה להגדיר את הבריאות של השחקן ל-healthValue
-- TODO: נסה להגדיר את הרמה של השחקן ל-levelValue
-- TODO: הדפס את הנתונים הסופיים של השחקן בפורמט:
-- שם: {name}
-- בריאות: {finalHealth}
-- רמה: {finalLevel}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין