במאמר האחרון טיפלנו בקוד והפכנו אותו למודרני ומסודר יותר.
כל זה היה טוב ויפה ל-2016. אבל אנחנו בזמנים מודרניים ויש פרדיגמות חדשות יותר, כמו תכנות פונקציונלי. קוד פונקציונלי נחשב גם לאמין יותר. לא אכנס לויכוח על האם זה נכון, אבל אזרום עם הטרנד. בואו נשכתב את הקוד.
בלי להיכנס לפרטי פרטים של תכנות פונקציונלי, בואו נראה את הבסיס:
כל מה שעושים חייב להיות בתוך פונקציה. יש.
בהינתן אותם הנתונים, אמורים לקבל את אותה התוצאה. יש.
הפונקציה שלנו לא אמורה להשפיע על שום משתנה חיצוני ("תופעות לוואי"). יש.
הפונקציה שלנו אמורה להיות פשוטה לקריאה ומתאימה לשימוש חוזר. לא בדיוק.
יש לנו מערך שנוצר באופן דינמי. לולאה יוצרת אותו בהדרגה ומחליטה בזמן אמת האם לשים במקום i מספר או מחרוזת לפי חוקיות מסויימת. אבל אלה שני דברים שונים שאין ביניהם קשר: יצירת מערך והחלפת ערכים בתוך מערך.
אם נסתכל על זה בצורה פונקציונלית, אפשר להפריד את הפעולות האלה לשני חלקים ולטפל בבעיה בצורה מסודרת. על הדרך נרוויח הפרדת עקרונות בין שתי הפעולות השונות ונוכל למחזר אותן לצרכים שונים.
לפני שתסתכלו בקוד הבא, שימו לב שאני עושה שני דברים קצת יותר מודרניים עם הקוד, בלי קשר לחלק הפונקציונלי:
- אני משתמש בפונקציות חץ במקום במבנה הקלאסי. למה? ככה.
- אני משתמש ב-destructuring במקום אובייקט אנונימי. זה מבהיר כבר בשלב החתימה למה הפונקציה מצפה.
עוד משהו ששווה לציין, זה שהמשתנה curVal משמש לא רק בשביל הבהירות, אלא גם כי האינדקס לא משקף את הערך באותו המקום במערך (כזכור המערך שלנו יכול להתחיל בכל מספר).
עכשיו כל מי ששמע על תכנות פונקציונלי אמור להזדעק על לולאות ה-for. לי אישית אין שום בעיה עם לולאות כאלה, אבל אנחנו לא כבדים. נזרום עם הזמנים.
ראשית נטפל בפונקציה הקטנה יותר שמייצרת את המערך:
- נייצר מערך ריק בגודל רצוי.
- נמלא את המערך שלנו בערך סטטי.
- נרוץ על המערך ונחליף את הערכים הסטטיים במספרים שמעניינים אותנו. נשתמש ב-map וניעזר בפרמטר השני שנותן לנו את האינדקס של הערך עליו אנחנו עובדים כרגע.
עכשיו נמיר את הפונקציה הגדולה יותר למבנה מבוסס map.
אנחנו נהנים מהעובדה שדרך שימוש בנקודה אנחנו יכולים להשאיר את result בתור קבוע.
אנחנו מתקרבים לסיום. בואו נעשה משהו ממש נחמד. נחסוך הרבה סוגריים מסולסלים וגם נבטל לגמרי את השימוש ב-if else דרך שימוש באופרטור ternary. לא נסתפק בשימוש הטריוויאלי, אלא נשרשר כמו אופרטורים כאלה בשביל לכסות את כל המקרים.
ומכייון שאפס נחשב בבוליאנית ל-false, אנחנו יכולים להיפטר גם ממנו.
ואם במקרה תהיתם אם אפשר היה לפתור את הבעיה המקורית תוך שימוש בפונקציה אחת במקום שתיים, אז כמובן!
רגע אחד לפני החגיגות! במשימה המקורית התבקשנו לספר רשימה של מחרוזות ולא מערך. אופסי? ממש לא ביג דיל.
והגענו לשלב הסכו"ם.
שלב הסכו"ם
שווה לחזור למאמר המקורי ולראות איזה מרחק עשינו מאז הדרישה המקורית ועד לכאן. זה רק בא ללמד אותנו שתמיד כדאי לנסות לחשוב בצורה יצירתית על בעיות קוד (ובעיות בכלל).
בגלל שאני עשיתי כאן את כל העבודה השחורה, לא נשחרר אתכם בלי חומר למחשבה וקצת תרגול.
האם תצליחו להרכיב פתרון פיזבז משלכם שעונה על הדרישות הבאות:
- הפונקציה תייצר רשימה דינמית רצופה עם התחלה וסוף מוגדרים מראש.
- הפונקציה תאפשר הכנסה של רשימה דינמית של חוקים אשר קושרים בין מספרים (או צירופי מספרים) לבין מחרוזות שיחליפו את המספר המקורי אם הוא מתחלק במספר\ים ללא שארית. כלומר במקרה של המשימה המקורית להעביר את 3, 5 וכן את 3 ו-5 יחד עם המחרוזות שמייצגות אותם בתור פרמטר.
בהצלחונת!