שמות טובים
מתן שמות: יסודות מונחה עצמים
מתן שמות: יסודות תכנות מונחה עצמים
בואו נבחן עיצוב של אובייקט/מחלקה באמצעות דוגמה…
המצב
האם אי פעם עיצבתם מודל נתונים (בקוד, SQL, או גיליונות אקסל)?
האם הדבר הבא נראה מוכר?
*** anti-pattern - don't copy-paste ***
* User
- id
- avatarUrl
- name
- email
- password
* Agent
- id
- primaryPhoto
- name
- email
- agentEmail
- agentPhoneMain
- agentEmailPrimary
- agentPhonePrimary
- agentAddressFull
- agentCompanyName
- agentCompanyAddress
- *userEmail* - 'Pointer' to User table ^^^
איפה הבאג?
ובכן, טכנית אין באג, פשוט נתונים שזקוקים לארגון מחדש.
האם הדבר הבא נשמע מוכר?
- כל שינוי באפליקציה שלך ידרוש שעות של ניפוי שגיאות מפרך.
- כל דרישות משתנות יובילו ל:

למה מתן שם לשדה agentEmailPrimary הוא כל כך גרוע?
ראשית, אתה לא יוצר דבר חדש לגמרי ביקום. לספציפיות יתר יש כמה מלכודות:
- ‘נעול’ בשם ספציפי מדי, פירושו ש-
agentEmailPrimaryכנראה הופך את התצוגות והקוד הקשור ל0% לשימוש חוזר, ומציג באגים חוזרים ומעצבנים כמו:
- נתונים לא מסתנכרנים בין טבלאות (לא ברור אם
user.emailצריך להתפשט ל-agent.agentEmailאו להיפך - שלא לדבר על המורכבות של יישום ידני היכן וכיצד לאכוף את ה’לוגיקה’ הזו…) - כללי ולוגיקת אימות כנראה משוכפלים ולא עקביים.
- בהדרגה, הפרויקט שלך ידמה למגדל ג’נגה רועד.
- שבריריות מצטברת עם כל קובץ חדש, שכן נדרשת תשומת לב גבוהה ביותר לפרטים אפילו לשינויים טריוויאליים
agentEmailPrimaryיכול להתפרש בכמה דרכים שונות. הימנע מעמימות עם שמות קצרים יותר.
- היזהרו ממילים מיותרות מטופשות.
Primary? רק מוביל לשאלות נוספות: האם יש Secondary? האם זה עבור קרוב המשפחה הראשי שלהם?
מספיק מילים דן, איך זה אמור להיראות במקום?
פתרון
// Consolidated Schema:
User
- id
- role: ['agent', 'lead', 'admin']
- name
- phone
- address
- email
- password
- company
- name
- address
הסרתי את טבלת Agent, מכיוון שהיא לא הכילה שדות ייחודיים לסוכנים. ואובייקט User.company (עם .name, .address) צץ לאחר שניקיתי את השמות.
כמה עקרונות מנחים:
- בטל טבלאות מיותרות. האם אתה באמת צריך טבלת
statuses? כאשר אתה יכול להוסיף שדהstatus::VARCHAR(8)בטבלתUser? זה בסדר, השתמש בבתים הנוספים לשורה. - נסה למזג טבלאות קשורות. נתונים
- מחק איסוף נתונים מיותר (למשל, הסר טבלת
ActivityLogsאם הוחלפה בפתרון אנליטיקס.) - נסה לשמור על כל שמות השדות כמילה/שם עצם/כינוי בודד. זה בסדר להסתמך על ההקשר שמספקת הטבלה. (למשל,
PersonalAccount.emailלעומתBusinessAccount.email- ההקשר מסופק על ידי שם הטבלה.) - אין דבר כזה
Agent.agentEmailאוAgent.agentPhonePrimary. נקודה. אמור איתי: “זהemailו-phone.” - על ידי שימוש בשמות ספציפיים ביותר, אתה מטביע באבן רמה מסוימת של
שימוש חוזר בקודועמידות, ובכן, ספציפית אפס אחוז. - אתה לא עושה לעצמך טובות עם שטויות כמו
User.profileSummaryEmail. 💞
קריאה מומלצת כוללת:
- אולי נורמליזציה אינה נורמלית
- הפשרות בין נורמליזציה לדה-נורמליזציה של מסד נתונים
- http://phlonx.com/resources/nf3/
- https://en.wikipedia.org/wiki/Database_normalization