מה הן פונקציות אנונימיות ואיך הן השתלטו לנו על החיים?

פונקציה אנונימית טיפוסית נראית בסגנון של x+1 <= (x) ומציינת פונקציה שמקבלת ערך כלשהוא, מוסיפה לו 1, ומחזירה אותו. בסינטקס הזה אין לה שם, ואנחנו מוותרים על המילים return, function וברוב השפות גם על הטייפים של המשתנים. אנחנו בעצם מפשיטים פונקציה עד שמגיעים אל לוגיקה זריזה וקטנה, שאפשר לכתוב מהר עם מינימום חזרה על קוד וסינטקס ככל הניתן (מי יודע, אולי נוותר בעתיד גם על הסוגריים).

פונקציות אנונימיות צריכות לקבל הרבה יותר קרדיט על השינוי שהן “אפשרו” בעולם התכנות הפרגמטי. הרבה שפות החלו להביע תמיכה בפונקציות first class citizen, שמשמעותן: לקבל את אותן זכויות של תכונות ואובייקטים אחרים. הכוונה היא שפונקציות יכולות להישלח כפרמטרים, לשמור אותן במבני נתונים, ולשמור אותם כמשתנים- ממש כמו כל תכונה של אובייקט. ופונקציות אנונימיות הפכו את זה לכל כך הרבה יותר קל.

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

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

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

בשפות תכנות שתומכות בfirst citizen function, אנחנו יכולים לשחק עם פונקציות כמו עם לגו. אנחנו יכולים לשמור אותם בדיוק כמו שאנחנו שומרים אובייקטים- כמשתנה, או ברשימה או מילון. עם פונקציות אנונימיות קל ונוח להעביר אותם כפרמטרים בפונקציות, בדיוק כמו הפונקציות הפופולאריות כיום, map & filterהמקבלות פונקציה ורשימה כפרמטרים, ומפעילות את הפונקציה על כל אחד מהאיברים ברשימה (ובסוף מחזירים את הרשימה החדשה). כך, אנחנו יכולים לכתוב שרשור של פונקציות בשורה או שתיים, ולחסוך 10 שורות. הפונקציות הנ"ל נקראות גם high order functions, כלומר פונקציות המקבלות פונקציה כפרמטר או מחזירות פונקציה. במקרה שלנו, הן מקבלות פונקציה המופעלת על כל איבר ברשימה.

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

לטעון תגובות?