שמות טובים
מתן שמות: יסודות מונחה עצמים
מתן שמות: יסודות תכנות מונחה עצמים
בואו נבחן עיצוב של אובייקט/מחלקה באמצעות דוגמה…
המצב
האם אי פעם עיצבתם מודל נתונים (בקוד, 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