4 כללים למדידת פשטות של תוכנה

על מה עליכם להקפיד על מנת לוודא שהתוכנה שאתם כותבים היא אכן פשוטה?

בעולם התוכנה, קיימים מספר ״כללי אצבע״ מוצלחים, המנחים אותנו כיצד ליצור תוכנה טובה יותר. הייתי רוצה להקדיש לכללים אלו קצת יותר תשומת-לב ולהציג לכם את ארבעת הכללים למדידת פשטות של תוכנה.

מתחילים בהגדרות

אחת ההגדרות שאני אוהב היא של בחור בשם J.B. Rainsberger, הגדרה של ״מבנה פשוט של תוכנה״. אני משתמש במילה מבנה (structure) כדי לתאר את התוצאה בפועל, בניגוד לתכנון (design) שזו התוכנית, או השאיפה, שלא תמיד מוסכמת על כולם או מתממשת בפועל. עצם קיומו של מסמך design לא מבטיח שלאחר שנה של קידוד – כך באמת תראה התוכנה [א].

ע״פ ריינסברגר (עוד), ישנם ארבעה אלמנטים (עם סדר עדיפויות ברור) המובילים לתוכנה פשוטה:

  1. כל הבדיקות עוברות. 
  2. צמצום כפילויות קוד. 
  3. הקוד מתאר כוונה (clarity). 
  4. צמצום מספר האלמנטים בקוד למינימום האפשרי. 

כל הבדיקות עוברות

העיקרון הראשון הוא דיי ברור – התוכנה עומדת בהתנהגות הרצויה. זה הכי חשוב. אם אתם לא משתמשים בבדיקות יחידה, אזי:
א. אתם יכולים לתרגם כלל זה ל״נכונות פונקציונליות״.
ב. אתם נמצאים בעמדת נחיתות להשגת קוד פשוט: בדיקות יחידה מאלצות את הקוד להיות מודולרי ופשוט יותר, ובלעדיהן המשימה של השגת קוד-פשוט היא קשה כפליים.

צמצום כפילויות קוד + קוד המתאר כוונה

קריאות הקוד נחשבת לעתים לחשובה לא-פחות מביטול כפילויות בקוד. ריינסברגר טוען שהסרה של קוד כפול מובילה בסה״כ לתוצאות טובות יותר מ״שימוש בקוד כפול לצורך בהירות״. ההמלצה הגורפת שלו היא להעדיף ביטול קוד כפול על פני ניסיון לכתוב קוד ברור יותר. אני נוטה להסכים, וגם מכיר בצורך לספק כללים פשוטים שקל לעקוב אחריהם, אך רוצה לציין הסתייגות בנושא זה.

הנה דוגמה של קוד “ללא כפילויות” שהפריע לי והפכתי לכפול:

אני מסכים, זה לא קוד “מושלם”, וספריית templating הייתה יכולה להפוך אותו ליפה יותר, אך זו דוגמה אמיתית מהחיים. הנה הקוד לאחר השינוי:

זה בהחלט קוד פשוט יותר, למרות כמה שורות קוד כפולות. כיצד אני מסביר / מרשה כפילות קוד שכזו?
א. הכפילות קרובה פיסית – קל להבין אותה ולהיות מודעים אליה (=> הסיכוי לתקן במקום אחד ולפספס את השני – קטן).
ב. לא מדובר ביותר מ-3 שורות קוד רצופות כפולות. זו דוגמה פשוטה – ביצעתי שינויים דומים לקוד ארוך ומסובך יותר (ולא רק שרשור html, אלא גם לוגיקה), אך לעולם לא השארתי יותר מ-3 שורות רצופות של קוד כפול.

קוד המתאר כוונה

אם מזקקים את הכלל של “כתיבת קוד המתאר כוונה”, לרוב עיקר העבודה היא מסביב לשמות: שמות של פונקציות או משתנים, או שמות חדשים הנוספים ע”י פעולות “extract method” או “introduce variable“. ישנם 4 “דרגות” של שם:

  1. שם סתמי
  2. שם נכון
  3. שם מדויק
  4. שם בעל משמעות (“meaningful”).
עצלנות ולחץ גורמים לנו להיצמד לתחתית הסקאלה (1,2), בעוד הקפדה ומקצועיות דוחפים אותנו לראש הסקאלה (3,4).

מאוד נהניתי, כשקראתי את ריינסברגר, כשהוא מתאר בדיוק רב הרגל שגם אני רכשתי: כאשר אני רואה קוד כפול אני מבצע extract method לשורות הכפולות, גם מבלי להבין לעומק מה המשמעות שלהן. פעולה טכנית גרידא. אני נותן לפונקציה שנוצרה את השם “foo”. מבלי לחשוב. תוך כדי עבודה אני מבין מה הפונקציה עושה ומשנה את שמה. לאחר 10 דקות עבודה ייתכן והשם שונה כבר שלוש או ארבע פעמים, אך אני מרגיש בבירור שאלו עליות דרגה ברמה של השם. לעתים פשוט צריך לנסות איזה שם ו”לחיות” איתו כמה דקות על מנת למצוא שם מוצלח יותר.

צמצום מספר האלמנטים בקוד למינימום האפשרי.

למי שנתקל ברעיונות אג’יליים – אני מניח שעקרון זה הוא מובן מאליו. Eliminate Waste. מי שעובד ב (Test Driven Development (TDD נהנה באופן מובנה מעקרון 1 (“כל הבדיקות עוברות”) ועקרון 4 (“צמצום מספר האלמנטים בקוד למינימום האפשרי”). זו הדרך המהירה ליצירת קוד פשוט, שגם יישאר פשוט לאורך זמן.

מכאן נותרו רק 2 פעולות לשים לב אליהן: צמצום כפילויות קוד [ב] ו כתיבת קוד המתאר כוונה / קוד ברור. המשיכו לעשות את אלו בצורה תמידית – והמבנה של הקוד שלכם, או ה “design” של הקוד שלכם – יהיה פשוט. זו הדרך היעילה ביותר שאני מכיר.

זה אולי נשמע קצת פשוט מדי: אולי ציפיתם לשימוש במחשבון של Cyclomatic complexity וטכניקות של ספירת Weighted Micro Function Points (ממש כמו ספירת קלוריות). צר לי לאכזב אתכם: כמה אנשים טובים השקיעו שנים ביצירת מודלים מתמטיים לתיאור סיבוכיות של תוכנה – אך בפועל כמה עקרונות פשוטים הם אלו שיגרמו לקוד שלכם להיות פשוט יותר, וקל יותר לתחזוקה.

שיהיה בהצלחה!

—-

[א] יש המשתמשים במילה Design על מנת לתאר מצב של תוכנה חיה, ולא רק את התוכניות. לדוגמה: “Refactoring: Improving the Design of Existing Code”. אם הרעיון הזה ברור לכם – הרגישו חופשיים להשתמש במילה design ולא ב structure.[ב] אזהרה!: יש המבלבלים בין צמצום כפילות קוד בתוך המערכת, לבין שימוש-חוזר בקוד (code re-usability) או “צמצום כפילות קוד בעולם האנושי”. בעוד ביטול כפילות-קוד בתוך הקוד שאתם כתבתם הוא כמעט-תמיד דבר טוב, שימוש חוזר בקוד (“חיצוני”) הוא נושא מורכב עם הרבה ייתרונות וחסרונות. אני מתכנן לעסוק בנושא זה לעומק בפוסט נפרד.

ליאור בר-און

ליאור בר-און הוא Chief Architect בחברת סטארטאפ ישראלית גדולה.

הגב

10 Comments on "4 כללים למדידת פשטות של תוכנה"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 
Sort by:   newest | oldest | most voted
Rafael Herscovici
Guest

בשורה הראשונה בקוד חסר לך גרש, אתה משתמש בגרש בודד בכדי לציין מאפיינים של DIV (בניגוד להגדרות HTML4/5),
בשורת NEWLIST האחרונה חסר לך גרש.
ואתה כותב HTML בCODE BEHIND.
מזל שאתה לא עובד איתנו.

Denis Volovik
Guest

:)

Lior Bar-On
Guest

אכן חסר גרש שיסגור את ה listRow.
רק להבהיר: תקן ה HTML מתיר להשתמש לסירוגין בגרש בודד או בגרשיים.

מקור: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.2

הקוד הוא קוד JavaScript שקצת דיללתי בצד עבור הדוגמה. לא Code Behind.

Eyal Gursoy
Guest

מי משרשר מחרוזות של HTML?!?
זאת הדוגמה הכי טובה שלך ל- Clean Code?!
אני מציע לך לקרוא קצת על עקרונות ה- SOLID של Bob Martin, זה קצת יותר רציני.

Jacob Dvir
Guest

איזו אגרסיביות בתגובה אחי. נרשם שם שזה לא מושלם. בכל אופן, אני דוקא חושב שזה יכול כן להראות כקוד טוב.

Rafael Herscovici
Guest

תקשיב ידידי היקר.
קוד צריך להיות מושלם.
כתבה עם קוד…. צריכה להיות אפילו יותר ממושלמת.

Rafael Herscovici
Guest

Jacob Dvir ועוד יותר אהבתי את הדף שלך Startup initative…. זה רק מראה למה לך זה נראה בסדר.

Maayan Yerushalmi
Guest

אייל מעכשיו אני דווקא ישרשר כי אני רואה שזה באמת מעצבן אותך :).
אבל אני חייב להסכים לרוח התגובה שלך :) מאמר שטחי ועוד יותר מזה דוגמא רעה להמחשה.

Eliav Maman
Guest

אני מציע לך לקרוא על הsolid של bob marley

משהו
Guest

מסכים אבל חשוב גם לא להגזים, חשוב לזכור ש-premature optimization is the root of all evil.

אגב תמיד עדיך לעבוד עם format של strings ולא שירשור, יותר נקי, יותר ברור.

wpDiscuz

תגיות לכתבה: