בדיקות שוויון
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 17 מתוך 70.
ראיתם איך __tostring קובע כיצד אובייקט מציג את עצמו. מתודה מטא שימושית נוספת היא __eq, שמגדירה מתי יש להתייחס לשני אובייקטים כשווים באמצעות האופרטור ==.
כברירת מחדל, השוואה בין שתי טבלאות באמצעות == בודקת אם מדובר באותה טבלה בדיוק בזיכרון. שני אובייקטים נפרדים עם נתונים זהים יחזירו false:
local user1 = {id = 101, name = "Alice"}
local user2 = {id = 101, name = "Alice"}
print(user1 == user2) -- פלט: false (טבלאות שונות)באמצעות __eq, אפשר להגדיר לוגיקת שוויון משלך. במחלקה, מוסיפים אותה בדיוק כמו __tostring, כפונקציה בטבלת המחלקה. כדי שהשוויון יעבוד, שני האובייקטים חייבים לשתף את אותה מטא-טבלה:
local User = {}
User.__index = User
function User:new(id, name)
local instance = {}
setmetatable(instance, self)
instance.id = id
instance.name = name
return instance
end
function User:__eq(other)
return self.id == other.id
endכעת שני אובייקטים מסוג User נחשבים שווים אם יש להם אותו מזהה, ללא קשר לשדות האחרים:
local u1 = User:new(101, "Alice")
local u2 = User:new(101, "Bob")
local u3 = User:new(202, "Alice")
print(u1 == u2) -- פלט: true (אותו ID)
print(u1 == u3) -- פלט: false (מזהי ID שונים)התבנית הזאת שימושית כאשר אובייקטים מייצגים ישויות מהעולם האמיתי בעלות מזהים ייחודיים: השוואה בין רשומות במסד נתונים, ישויות במשחק או כל אובייקט אחר שבו הזהות חשובה יותר ממיקום בזיכרון.
אתגר
קלבואו נבנה מחלקת Product שיכולה לקבוע אם שני מוצרים הם אותו פריט, גם כשהם מאוחסנים בטבלאות שונות לחלוטין! במערכות קמעונאיות, למוצרים יש לעיתים קרובות קודי SKU ייחודיים (יחידות שמירה במלאי), ויש להתייחס לשני מוצרים כשווים אם יש להם אותו SKU, בלי קשר לפרטים אחרים כמו שינויי מחיר.
תארגן את הקוד שלך בשני קבצים:
Product.lua: הגדר את מחלקתProductבאמצעות תבנית האב־טיפוס הסטנדרטית. כל מוצר צריך לשמורsku(המזהה הייחודי) ו-name. ממש את מטודת המטא__eqכך ששני מוצרים ייחשבו שווים כאשר יש להם אותו SKU: השם אינו משנה לצורך השוויון.main.lua: טען את המודול Product וצור כמה מופעים של מוצרים. השווה ביניהם באמצעות האופרטור==כדי לראות את לוגיקת השוויון המותאמת שלך בפעולה.
מחלקת Product שלך צריכה לכלול:
- בנאי
:new(sku, name) - מתודה
:getInfo()שמחזירה מחרוזת בפורמט:[sku]: [name] - מטודת המטא
__eqשמשווה בין מוצרים לפי ה-SKU שלהם
תקבל שישה קלטים:
- ה-SKU של המוצר הראשון
- השם של המוצר הראשון
- ה-SKU של המוצר השני
- השם של המוצר השני
- ה-SKU של המוצר השלישי
- השם של המוצר השלישי
בקובץ הראשי שלך, צור שלושה מוצרים באמצעות הקלטים שסופקו, ואז הדפס:
- המידע של כל מוצר (שלוש שורות)
- תוצאת ההשוואה בין מוצר 1 למוצר 2
- תוצאת ההשוואה בין מוצר 1 למוצר 3
לדוגמה, אם הקלטים הם ABC123, Wireless Mouse, ABC123, Mouse (Updated), XYZ789, ו-Keyboard, הפלט צריך להיות:
ABC123: Wireless Mouse
ABC123: Mouse (Updated)
XYZ789: Keyboard
true
falseשים לב ששני המוצרים הראשונים שווים (אותו SKU), אף על פי ששמותיהם שונים. כך בדיוק מערכות מלאי אמיתיות עוקבות אחר מוצרים גם לאחר שינויי שם ועדכונים!
נסו בעצמכם
-- טען את המודול Product באמצעות require
local Product = require('Product')
-- קרא את הקלטים
local sku1 = io.read()
local name1 = io.read()
local sku2 = io.read()
local name2 = io.read()
local sku3 = io.read()
local name3 = io.read()
-- TODO: צור שלושה מופעים של Product באמצעות הקלטים
-- TODO: הדפס את המידע על כל מוצר (שלוש שורות)
-- TODO: הדפס את תוצאת ההשוואה בין מוצר 1 למוצר 2
-- TODO: הדפס את תוצאת ההשוואה בין מוצר 1 למוצר 3
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין