שימוש בbreak וcontinue בלולאה

במהלך הקורס נאסר עלינו להשתמש בשתי מילות המפתח האלה כי זה “bad practice”, אשמח לשמוע למה? ובאילו דרכים חלופיות ניתן לדלג על איטרציה בלולאת for אם תנאי מסויים מתקיים (בלולאת while יש פשוט קידום של האינדקס באחד),
וכן כיצד לסיים לולאה אם תנאי מסויים מתקיים (בלולאת while פשוט מציבים באינדקס ערך של סיום לולאה).

הסיבה הפדגוגית

לכל בעיה יש פתרון מיטבי אחר:
ישנן בעיות שקל יותר לפתור בעזרת לולאת for, ובעיות אחרות – בעזרת לולאת while (ראו עוד במחברות).
חניכים נוטים לבחור סוג לולאה אחד ולהשתמש בו תמיד – וזו פרקטיקה שגויה.
המטרה שלי היא לוודא שהם יודעים לשלוט בשתי הטכניקות.

בדרך כלל זה נראה ככה:

  1. חניך רגיל לפתור בעיות בעזרת לולאות for.
  2. הוא נתקל בתרגיל בו צריך לעצור בתנאי. נניח: באיזה מיקום ברשימה סכום האיברים עד אותו מיקום הוא 100.
  3. החניך יבחר for, וכדי “לחפות” על הבחירה השגויה – ישתמש ב־break כשהגיע לסכום 100.
  4. החניך פספס את הפתרון המיטבי – שימוש ב־while.

האיסור על השימוש ב־break וב־continue מטרתו לטייב את בחירת סוג הלולאה ע"י החניך בהתאם לצורך.

הסיבה האישית

מעבר לנ"ל, העדפתי האישית היא לא להשתמש ב־continue וב־break; אבל זה לחלוטין עניין של טעם אישי.
הנה הסיבות שאני מונה כששואלים אותי מדוע:

  1. שימוש ב־break או ב־continue מרגיש לי קצת לשקר לקורא: כשאנחנו רואים header של לולאה אנחנו יודעים מה היא תעשה ויכולים לעבור הלאה. break ו־continue מפרים את ההבטחה הזו.
  2. גם כששמים לב למילות המפתח break או continue, ה"חוק הנוסף" שהוספנו ללולאה מעמיסה על ה־cognitive load של הקורא.
  3. זה פתח לבאגים נוראיים (בגלל שילוב של 1 ו־2).
  4. אם הקוד משתמש בחלוקה נכונה לפונקציות ולתפקידים, ונעשה שימוש מושכל ב־while וב־for, ב־99% מהמקרים אין צורך ב־break או continue, ככה שהם די code smell.
  5. זה Code Smell גם כי python -m this אומר Special cases aren’t special enough to break the rules, וזה בד"כ הסיבה שמשתמשים ב־break או ב־continue.
7 לייקים

נשמע שגם שימוש בקשטנים (@) עושים את אותם בעיות… ועדיין איכשהו נחשב נכון טוב ומתוחכם להשתמש בהם…
אתה יכול להבהיר את ההבדל בין שני המקרים?

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