פרק 1 – חושבים לרוחב
בפרק הקודם הצגנו פתרון לבעיה, אותו אפשר להגדיר בתור "עובר".
אבל אנחנו לא מסתפקים בציון עובר. אנחנו חושבים לרוחב. הקוד שכתבנו מנותק לחלוטין מכל הקשר. הוא סתם אוסף של שורות. אם הייתם צריכים לשתול אותו בתוך יישום, האם הייתם יכולים להסתפק בו כפי שהוא? ברור שלא.
לכן הדבר הראשון שמתבקש, זה לשתול את הקוד בתוך פונקציה.
עכשיו נניח שהייתם מתבקשים לממש את הקוד הזה עבור מספרים בטווח אחר מאשר 1-100. במקרה כזה היה מתבקש לשכתב את הפונקציה מעט, נכון? בואו נוסיף לפונקציה פרמטרים של טווח.
יותר טוב? כן. אבל מחר יכול להיות שהייתם מתבקשים לכתוב את אותו האלגוריתם, רק הפעם עבור מספרים אחרים מאשר 3 ו-5. מה עושים? מוסיפים עוד פרמטרים עבור "פיז" ו-"בז".
כלומר, בכדי לממש את פתרון הבעיה המקורית היינו קוראים לפונקציה ככה:
fizzbuzz(1, 100, 3, 5)
לכאורה היינו עומדים עכשיו בנקודה טובה יותר מאשר קודם, אבל כעת הפונקציה שלנו סובלת מעודף פרמטרים. למה הכוונה? אחת הפרקטיקות בכתיבת קוד איכותי היא צמצום בכמות הפרמטרים, כאשר 3 נחשב לסוג של מקסימום. אפשר להתווכח על זה עד מחר, אבל קודם כל נבין למה קיימת ההמלצה הזאת ומשם נתקדם.
אם מסתכלים על הקריאה למעלה, די קשה להבין מה כל פרמטר מייצג. אנחנו מבינים את זה היטב, כי אנחנו כתבנו את הקוד. אבל הוא לא באמת קריא. קחו את הדוגמה הבאה, היא חוקית לגמרי:
fizzbuzz(3, 5, 3, 5)
אפשר להבין מזה מה מייצג כל פרמטר? איך יודעים איזה זוג מייצג את הטווח ואיזה את הערכים? למזלנו ג'אווהסקריפט פותרת את העניין ע"י שימוש באובייקט בתור פרמטר.
ואז הקריאה שלנו תיראה ככה:
fizzbuzz({from: 5, to: 15, fizz: 3, buzz: 5})
One parameter to rule them all
רק מה, יש לנו בעיה גדולה מאד. מה קורה אם נקרא לפונקציה בלי שום פרמטרים? נסו ותיווכחו.
בואו נתגבר על זה ככה:
או בדרך טיפה יותר אלגנטית:
למה זה עובד? כי אם param הוא undefined, אז הוא מוגדר בתור ערך בוליאני שלילי.
ובשביל הקטע עשו את הניסיון הבא. כיתבו את שורות הקוד הבאות בקונסולה ותראו מה מתקבל:
({} == true)
({} == false)
הבנתם? יופי. נסו את זה:
if ({}) console.log(“So is it true or false?”)
מבולבלים? גם אנחנו.
בחזרה לדיון. הפונקציה שלנו לא ממש עושה כלום. היא בסה"כ מדפיסה ערכים לקונסולה. זה לא הדבר הכי שימושי. אז בואו נגרום לה להחזיר מערך עם רשימת התוצאות במקום זה.
אבל כעת נצטרך להדפיס את התוצאה של הפונקציה:
console.log(fizzbuzz({from: 1, to: 100, fizz: 3, buzz: 5})
עכשיו תגידו "אבל גיל" ואני אענה "מה?". ואתם תשאלו "למה מערך ולא רשימה מופרדת פסיקים בצורה של מחרוזת?" (string בעברית). ואני אענה "טוב שהסברתם לי איך כותבים string בעברית, יאללה לכו על זה! רק אל תגידו שלא הזהרתי אתכם מהפסיק בסוף הרשימה…".
"טוב סבא'לה, סבלנו מספיק. אפשר לצאת לקפוץ בטרמפולינה?".
"לא, ילדים יקרים. הפונקציה שכתבתם עובדת היטב, גמישה ועמידה בפני שטויות. אבל היא יותר מיושנת ממני. אנחנו רק התחלנו."
בפרק הבא אנחנו נביא את הקוד למאה ה-21.