הבנת solid וclean code
-
עד כמה שהבנתי (לא קובע עובדה, לא מצהיר, לא יודע, רק מה שואל ממה שהבנתי), חלק ממה שזה אומר זה שלפונקציה תהיה אך ורק רק מטרה אחת ורק אותה היא תיישם, ולכן ברגע שאני שם סינון קלט או בדיקות תקינות בפונקציה שמטרתה הוספת מידע למסד נתונים אני עובר על הכלל הזה.
וכאן מגיעות השאלות:
א. לא קצת מגוחך לעשות פונקציה כזו (אל תתפסו אותי, רק בשביל ההדגמה)?export const deleteAd = async (knex, adId) => !!(await knex('ads').where({ id: adId }).del());או להוספה
export async function insertAd(knex, data) { const [id] = await knex('ads').insert(data); return id; }בשביל השורה הזו לעשות פונקציה ואותה לייבא לפונקציה אחרת שגם תקרא לפונקציה שתעשה את הולידציה וכו'? למה לא להכניס את זה ישר לקוד? במיוחד שבknex אין כמעט משמעות להחלפת מסד נתונים, הכל אותה הפונקציה...
ב. איך אני מונע ממישהו להתשמש בפונקצית הוספת ערך הכללית שכוללת את הולידציה וכו' ולא להשתמש בפונקצית ההוספה ישירות, דבר שבוא אסון למסד נתונים?
-
עד כמה שהבנתי (לא קובע עובדה, לא מצהיר, לא יודע, רק מה שואל ממה שהבנתי), חלק ממה שזה אומר זה שלפונקציה תהיה אך ורק רק מטרה אחת ורק אותה היא תיישם, ולכן ברגע שאני שם סינון קלט או בדיקות תקינות בפונקציה שמטרתה הוספת מידע למסד נתונים אני עובר על הכלל הזה.
וכאן מגיעות השאלות:
א. לא קצת מגוחך לעשות פונקציה כזו (אל תתפסו אותי, רק בשביל ההדגמה)?export const deleteAd = async (knex, adId) => !!(await knex('ads').where({ id: adId }).del());או להוספה
export async function insertAd(knex, data) { const [id] = await knex('ads').insert(data); return id; }בשביל השורה הזו לעשות פונקציה ואותה לייבא לפונקציה אחרת שגם תקרא לפונקציה שתעשה את הולידציה וכו'? למה לא להכניס את זה ישר לקוד? במיוחד שבknex אין כמעט משמעות להחלפת מסד נתונים, הכל אותה הפונקציה...
ב. איך אני מונע ממישהו להתשמש בפונקצית הוספת ערך הכללית שכוללת את הולידציה וכו' ולא להשתמש בפונקצית ההוספה ישירות, דבר שבוא אסון למסד נתונים?
עד כמה שהבנתי (לא קובע עובדה, לא מצהיר, לא יודע, רק מה שואל ממה שהבנתי), חלק ממה שזה אומר זה שלפונקציה תהיה אך ורק רק מטרה אחת ורק אותה היא תיישם, ולכן ברגע שאני שם סינון קלט או בדיקות תקינות בפונקציה שמטרתה הוספת מידע למסד נתונים אני עובר על הכלל הזה.
אכן לא הבנת.
פונקציה יכולה לעשות מליון פעולות וזה מעולה.
הכלל הוא ש"פונקציה עושה דבר אחד" הוא שלפונקציה חייבת להיות מטרה אחת, ולא שניים.
זה לא עניין של כמה פעולות קורות, אלא האם יש לכלל הפעולות האלו שם אחד, האם הכל חוסה תחת מטריה של מטרה מסויימת.
למשל אם פונקציה גם מכניסה למסד הנתונים וגם שומרת את הנתון לקובץ במקביל, בדוחק ניתן לקרוא לזה שיש לה מטרה אחת: שמירת הנתון. אבל פונקציה ששומרת למסד הנתונים וגם זורקת webhook שהנתון השתנה, עוברת על הכלל.
אבל לגיטימי לעבור על הכלל הזה מידי פעם. למשל כשהפעולה האחרת היא משנית מאוד, מצומצמת.
ולידציה בתחילת דרכה היא בהחלט פעולה משנית שנח לראות אותה יחד עם השמירה. אם הולידציה הופכת לתהליך, מוציאים את זה החוצה, זה שגרת יומו של מפתח טוב.
הרבה פחות לגיטימי לכתוב בלי להכיר טוב את השפה
מבחן טוב האם פונקציה עוברת על הכלל ברגל גסה הוא כשבאים לקרוא לה שם. אם יוצא שם טוב ונכון, בדרך כלל לא עברו על הכלל. אם השם לא נכון או לא מכסה חלק משמעותי מהפעולות, או שיוצא משפט ארוך (SaveAndRestoreAndNotify), אז ישנה בעיה...