לדלג לתוכן

תכנות פונקציונלי מוסבר בפשטות

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

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

מה זה בעצם תכנות פונקציונלי

תכנות פונקציונלי הוא גישה לכתיבת קוד שמתבססת על שני רעיונות מרכזיים. הראשון הוא פונקציות טהורות (pure functions) - פונקציה שתמיד מחזירה את אותה תוצאה עבור אותו קלט, ולא "נוגעת" בשום דבר מחוץ לעצמה (לא משנה משתנה גלובלי, לא כותבת לקובץ, לא משנה נתון שהועבר אליה). השני הוא אי-מוטביליות (immutability) - במקום לשנות נתונים קיימים, יוצרים תמיד גרסה חדשה שלהם.

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

למה אכפת לכם מזה בכלל

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

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

דוגמאות שכבר מוכרות לכם

אם כתבתם אי פעם JavaScript מודרני, כנראה כבר השתמשתם ברעיונות פונקציונליים בלי לקרוא להם כך. פונקציות כמו map, filter ו-reduce על מערכים הן דוגמה קלאסית - במקום לולאה שמשנה משתנה שלב אחר שלב, אתם מעבירים פונקציה שמתארת "מה לעשות עם כל איבר", והשפה מטפלת בשאר. גם ריאקט, שמעודד ניהול state בצורה שבה לא "משנים" ישירות נתונים אלא יוצרים גרסה חדשה שלהם, שאוב במידה רבה מרעיונות פונקציונליים.

שפות שמחויבות לגישה הזאת

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

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

האם צריך ללמוד שפה פונקציונלית "טהורה"

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

איך זה קשור אלינו

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

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

לסיכום

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

יש לכם שאלות על עקרונות תכנות? בואו לדבר בקהילה שלנו.

הצטרפו לקהילה בדיסקורד