Website Icon

כתיבת קוד נקי: טיפים ושיטות לשיפור הקוד שלכם

Hand wearing a purple glove holding a yellow spray bottle.

מבוא לקוד נקי ו-Refactoring

קוד נקי או Clean Code, הוא שם כללי בפיתוח תוכנה המתאר שיטות וטכניקות שעוזרות לנו לבנות קוד שהוא קל לקריאה, הבנה ותחזוקה שהרבה מתכנתים מכל העולם הולכים לפיהם. במאמר הזה אנחנו נחקור עקרונות שונים של קוד נקי ונספק דוגמאות כדי להדגיש את ההבדלים בין קוד נקי לקוד מלוכלך (Dirty Code).

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

לכן, כאשר אנחנו מדברים על שיפור מבניות והקריאות של הקוד שלנו (מבלי לשנות את ההתנהגות שלו), השמות Clean Code ו-Refactoring מגיעים בדרך כלל ביחד. באמצעות עקרונות קוד נקי ו-Refactoring, אנחנו שואפים ליצור קוד ברור, פשוט וקל לתחזוקה.

שמות בעלי משמעות

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

Screenshot of JavaScript code.

בדוגמה Bad Example, השמות של הפונקציה ושל המשתנה לא נותנים אינדיקציה והבנה ברור למטרה שלהם, מה שמקשה על מפתחים אחרים להבין את כוונתם. לעומת זאת, בדוגמה Good Example, השמות של הפונקציה ושל המשתנה מבהירים בדיוק את הכוונה שעומדת בפני מטרת הפונקציה והמשתנה.

התמקדות בתהליך אחד (Single Responsibility Principle)

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

Screenshot of JavaScript code.Screenshot of JavaScript code.

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

שמור על פשטות, טיפש - KISS (Keep It Simple, Stupid)

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

Screenshot of JavaScript code.Screenshot of JavaScript code.

שתי הפונקציות `findMaxComplex` ו-`findMaxSimple` מבצעות את אותה משימה - מחזירות את הערך הגבוה ביותר במערך. ההבדל ביניהן הוא בדרך שבה הן מיישמות את הפתרון. הפונקציה `findMaxComplex` משתמשת בלולאה ובודקת כל איבר במערך, בעוד שהפונקציה `findMaxSimple` משתמשת בפונקציה המובנית `Math.max` של JavaScript לקבלת התוצאה בצורה יותר יעילה ופשוטה.

הערות (Comments) במידת הצורך

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

Screenshot of JavaScript code.Screenshot of JavaScript code.

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

DRY (Don't Repeat Yourself)

העקרון DRY (Don't Repeat Yourself) מדגיש את החשיבות של מניעת שכפול בקוד. קוד שחוזר על עצמו במקומות שונים בפרויקט לא רק שמכביד על הפיתוח והתחזוקה, אלא גם יכול לגרום לחוסר עקביות, מה שעלול להוביל לבאגים והתנהגויות בלתי צפויות. כאשר נתקלים בחלקי קוד זהים או דומים, כדאי לשקול להפריד אותם לפונקציות או מודולים נפרדים שניתן לשתף ולשחזר.

Screenshot of JavaScript code.Screenshot of JavaScript code.

בגרסה הלא יעילה של הקוד (Bad example), חזרנו על אותה לוגיקה למציאת הספר בשתי הפונקציות (`()addBook()`, `removeBook`). בגרסה המשופרת (Good example), עטפנו את הלוגיקה למציאת הספר בפונקציה `()findBookIndex`, והשתמשנו בה בכל שתי הפונקציות האחרות, מה שמוריד את החזרה על הקוד ומיישם את עקרון DRY בצורה טובה יותר.

YAGNI (You Aren't Gonna Need It)

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

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

סיכום

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