תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

שיפור סגנון קוד ה-PHP

מחבר:
בתאריך:

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

 

בעיה 1 : לא משתמשים בפונקציות

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

 

בעיה 2 : לא משתמשים בפונקציות מובנות

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

 

בעיה 3 : שמות מעורפלים לפונקציות ולמשתנים

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

 

בעיה 4 : מספרים ומחרוזות קסם

מספר קסם הוא מספר שמוצאים בקוד בלי שום הסבר או שם. לדוגמה, המספר 5 בלולאה:

for($i=0;$i<5;$i++)
{
  //do check
}

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

$maxCheckNumbers = 50;
 
for($i=0; $i<$maxCheckNumbers; $i++)
{
  //do check
}

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

 

בעיה 5 : שכפול הקוד

אם אתם מוצאים את עצמכם חוזרים שוב ושוב על אותו קוד, סימן שאתם עובדים לא נכון. למעשה אם אתם נוהגים כך, אתם מפירים את אחד העקרונות החשובים ביותר בכתיבה של קוד מודרני : Dont repeat your self או בקיצור DRY. הסיבה לכך ש-DRY הוא עיקרון כל כך חשוב היא פרקטית. תארו לכם שאחרי שסיימתם לכתוב את הקוד, אתם צריכים לשנות בו משהו. אם לא הקפדתם מספיק, וחזרתם על עצמכם, תצטרכו להתאמץ ולשנות את הקוד במספר מקומות, מה שעלול לתרום להופעתם של באגים. אבל אם תקפידו לא לחזור על עצמכם, תוכלו לשנות את הקוד רק במקום אחד. הדרך הטובה ביותר להימנע משיכפול הקוד היא לעטוף את הקוד שחוזר על עצמו בפונקציה, ולקרוא לפונקציה מהיכן שצריך בקוד.

 

בעיה 6 : פונקציות שעושות יותר מדבר אחד

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

במקום שתי פעולות בפונקציה- בדיקת התנאי וגם הצגת התוצאה במסגרת של הטמ"ל:

function a($string)
{
  // Action 1 : Check if matches.
  $a = 'a';
  
  if($string===$a)
  {
    $b='yes';
  }
  else
  {
    $b='no';
  }
 
  // Action 2 : Outputs result.
  echo "<p>$b</p>";
}

עדיף להפריד לשתי פונקציות, פונקציה doMatch שבודקת את התנאי, ופונקציה output שמציגה את התוצאה:

function doMatch($string)
{
  $a = 'a';
  return($string===$a)? true : false;
}
 
function output($binary)
{
  $string=($binary)? "yes" : "no";
  return "<p>$string</p>";
}
 
$string = 'b';
$doMatch = doMatch($string);
echo output($doMatch);

כך הפונקציה output יכולה להיות חופשית לקבל מידע גם מפונקציות נוספות.

 

בעיה 7 : יותר מדי משפטי תנאי מקוננים

אחת הסיבות העיקריות לקוד מבולגן קשורה במשפטי תנאי מקוננים (if בתוך if). בעיה שניתן לפתור בקלות על ידי שימוש בפונקציות וב-return.

במקום תנאים מורכבים:

if($string==='a' || $string==='b')
{
  if($string==='a')
  {
    echo "a indeed";
  }
  
  if($string==='b')
  {
    echo "b";
  }
}
else
{
  echo "x";
}

 

ניתן לכתוב פונקציה שמחזירה מה שצריך לעשות אם עומדים באחד התנאים:

function eliminateNestedConditionals($string)
{
  if($string==='a') return "a indeed";
  
  if($string==='b') return "b";
  
  return "x";
}
 
$string = "m";
echo eliminateNestedConditionals($string);

אם אתם מעוניינים להרחיב על בנושא של שיפור סגנון הקוד, אני ממליץ לחפש ב-google עם מילות המפתח: clean code ו- code smells .

תכנתו בהנאה.

 

לכל מדריכי ה-PHP

 

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

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

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

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

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

איך קוראים בעברית לצ`ופצ`יק של הקומקום?