במחשוב, פרוצדורה (נקראת גם בטעות "פונקציה") היא כל פעולה מוגדרת היטב שתוכנה יכולה ואמורה לבצע כחלק משגרת השימוש בה.
כלומר, כל פעולה מוגדרת היטב שתוכנה יכולה ואמורה לבצע באופן "רוטיני" (שגרתי) לפי המילה routine (שגרה) באנגלית.
באופן כללי, כל "פרוצדורה" של תוכנה תהיה מוגדרת היטב בתוך קוד מקור של התוכנה.
פרוצדורה בקוד מקור
בקוד מקור פרוצדורה היא מבנה מידע (במובן של תחום) אשר הוא משוים (קיבל שם) או לא משוים (לא קיבל שם) ומבצע פעולה מוגדרת מסוימת.
אם הוא לא משוים אז נפוץ להגדירו כ"אנונימי".
כל פרוצדורה כוללת שורת קוד אחת או יותר בתוך עצמה (כלומר בתוך תחום הפרוצדורה) ובאופן כללי יכולה לקבל גם ארגומנט אחד או יותר (אם המונח ארגונט טרם נלמד זה לא משנה כרגע).
באופן כללי, שורת הפתיחה של פרוצדורה ושורת הסגירה שלה שתיהן ביחד הן ה"רוטינה" של הפרוצדורה והקוד שנכנס ביניהן (בתוך תחום הרוטינה הזה) הוא ה"סאב-רוטינה" שלה.
ככלל פרוצדורה יכולה לכלול תת-פרוצדורה (פרוצדורה פנימית) אחת או יותר ותת-פרוצדורה יכולה להכיל תת-תת-פרוצדורה אחת או יותר בעצמה וניתן בעיקרון ליצור שרשורים ארוכים ביותר של תתי-פרוצדורות כאשר לכל פרוצדורה תחום עצמאי.
קריאה (פיתוח תוכנה)
בפיתוח תוכנה, קריאה היא פקודה בשפת מחשב מסוימת, להרצת פרוצדורה (או מבנה מידע דומה אחר).
אם הפרוצדורה משוימת אז נוכל לקרוא לה פעם אחת או יותר, לפי שמה.
אם הפרוצדורה לא משוימת אז באופן כללי נוכל לקרוא לה רק פעם אחת (אלא אם נשכפל במדויק את קוד הקריאה) לפי סדר הופעתה בקוד מקור כפי שקוד מקור זה מופיע לקורא אנושי (פרוצדורת IIFE), כלומר Immediately Invoked Function Expression.
באופן כללי, קריאה יכולה להתבצע תוך כדי העברת ארגומנט אחד או יותר.
באופן כללי, כמו שפרוצדורה יכולה להיות "פרוצדורה מועברת" (קולבק-פרוצדורה) כך גם קריאה יכולה להיות "קריאה מועברת" (קולבק-קריאה), למשל, נקרא לפרוצדורה A שבעצמה תקרא לפרוצדורה B.
מבחינת בקרת זרימה קריאה מבוצעת לפי פיענוח מיידי ו\או לפי קומפילציה והדבר יכול להשתנות בין שפות מחשב שונות.
בשפת JavaScript למשל, אין בעיה שקריאה לפרוצדורה תופיע במסמך לפני הפרוצדורה בהקשרה, כי המסמך יעבור קומפילציה ולא פיענוח מיידי וכבר יהיה ברור למחשב מה בא לפני מה ולאן ניתן "לחזור" בריצה.
ייתכן שפרוצדורה משוימת או לא-משוימת תקרא לעצמה באופן אין סופי בעיקרון ← רקורסיה
דוגמה לפרוצדורה משפת JavaScript
function myfunction(integer1, integer2) { alert(integer1 * integer2); } myfunction(2, 5); // alerted result is "10";
בפרוצדורה זו תוכן פנימי שבו הודעת alert עם פעולת הכפלה.
המכפלה מבוססת על פרמטרים וארגומנטים תואמים.
הפרמטרים מועברים בפרוצדורה עצמה (integer1 ו-integer2)
הארגומנטים מועברים בקריאה לפרוצדורה (2 ו-5)
בעת הקריאה הארגומנטים המספריים הללו מוכפלים והרצת הקוד הזה בקונסולת דפדפן תתן לנו הודעת alert עם המכפלה של המספרים שהיא כמובן 10.
קוד זה מהווה תבנית כללית לפעולה בממשק משתמש בו מבקשים ממשתמש לבצע פעולה חישובית מסוימת, למשל לצורך אימות אנושיות.
לפעמים אפשר לשים פרמטרים ברוטינה
באופן כללי, פרוצדורה שנריץ דרך קריאה תניב פלט בהתאם לסאב רוטינה שלה.
- סאב רוטינה לא בהכרח תכלול פרמטר אחד או יותר שהועבר או הועברו אליה ברוטינה.
- קריאה לא בהכרח תכלול ארגומנטים התואמים לפרמטרים שהועברו בקריאה.
בשפות מחשב שונות, פרוצדורות יכולות לקבל פרמטר אחד, או שניים או יותר פרמטרים; פרמטר מאפשר לפרוצדורה לתת פלט מגוון יותר או כזה שמותאם לפעולה ספציפית בהקשר נתון..
אם מפתח תוכנה העביר פרמטר אחד או יותר לפרוצדורה בתוך סט פרמטרים, כלומר סט פרמטרים ריק שאולי יהיה חובה לצרף לפרוצדורה בעת הגדרתה (לפי התחביר של שפת תכנות שאיתה יוצרים את הפרוצדורה) ואחר כך הפרוצדורה נקראה על ידי משתמש בתוכנה דרך קריאה, בין אם המשתמש היה מודע לכך או לא, המשתמש יכול להעביר לה ארגומנט אחד או יותר כאשר כל ארגומנט כזה יהיה תואם ישירות לכל פרמטר כמוסבר להלן.
ברוב שפות ההתנהגות פרוצדורה תכלול שני תחומים; תחום אחד לפרמטרים ותחום שני לתוכן פנימי אם כי בשפות תכנות מסוימות כגון שפות שונות ממשפחת Algol ניתן לשים פרמטרים ותוכן פנימי בתחום אחד בלבד כך שאין חובה להעביר פרמטרים דווקא ברוטינה כמו ב JavaScript ולהלן פסאודוקוד הכולל העברת פרמטרים בסאב-רוטינה ולאחר מכן קריאה לפרוצדורה עם העברת ארגומנטים.
function myFunction { par myPar1 par myPar2 // some code } myFunction {myArg1,myArg2}
פרוצדורה משוימת
פרוצדורה משוימת היא כל פרוצדורה שקיבלה שם שמסביר על מהותה או על הפעולה הנקודתית שהיא מבצעת; השם יכול להיכתב בשיטת כתיבה מסוימת כגון שיטת camelCase.
על אף שבשפות תכנות מסוימות המממשות את מושג הפרוצדורה ניתן ליצור הן פרוצדורות משוימות והן פרוצדורות אנונימיות (כלומר פרוצדורות ללא שם) לצורך ארגון מינימלי יותר של הקוד, עדיין מקובל להרבות ביצירת פרוצדורות משוימות (בפרט אם התחביר בו זה נעשה נוח ואינטואיטיבי לצוות) שכן זה עוזר לארגן את הקוד לטווח ארוך (כך שבעתיד יהיה ברור מה מטרת כל פרוצדורה).
מניסיוני המועט עם שפת JavaScript פרוצדורה אנונימית נכתבת לרוב בתוך פרוצדורה משוימת בכדי לתאר פעולה משנית קצרה.
פרוצדורה אנונימית
פרוצדורה אנונימית (באנגלית: anonymous procedure וכן גם lambda expression) היא פרוצדורה שאיננה פרוצדורה משוימת.
פרוצדורה כזאת בדרך כלל תועבר כקולבק לפרוצדורה מסוימת (שהיא פרוצדורה אחרת או מתודה).
בשפת JavaScript למשל נעביר אותה כקולבק למתודת forEach()
.
document.querySelectorAll(".x").forEach( (element)=>{ element.style.display = "none"; });
בכל פעם שמתודת ה forEach()
תיקרא ← הפרוצדורה האנונימית (element)=>{CODE;});
תיקרא.
בקוד לעיל אנו רצים על כל האלמנטים במסמך ומסתירים את אלו מהם עם קלאס ה CSS ששמו x
.
זה שימושי כשיוצרים סקריפט שמסתיר תכנים מסוימים הנחשבים בלתי ראויים, כמו תכניי אלימות מילדים.
מתודה
מתודה (באנגלית: Method) אני מגדיר ככל ביטוי מפתח אשר הוא מובנה בשפת מחשב נתונה (כלומר, אין צורך ליצור קוד מקור שעושה את הפעולה שלו בעצמנו וניתן לקרוא לו ישירות).
בשפות התנהגות שונות מתודה היא פרוצדורה מובנית בשפה אך בניגוד לכלל הפרוצדורות האחרות שניתן להעביר להן פרמטרים (ובהתאם לכך להעביר ארגומנטים לקריאות שלהן) למתודה שהיא פרוצדורה לא ניתן להעביר פרמטרים (מפתחי שפות ההתנהגות השונות עשו זאת כבר עבורינו).
דוגמה למתודה משפת JavaScript
להלן מתודת round() המעגלת מספר מטה או מעלה לפי חוקי העיגול שנקבעו לה בשפת JavaScript. במקרה זה המתודה מעגלת מעלה את המספר 0.9 (אותו העברנו לקריאה שלה כארגומנט) כך שלאחר הרצה יתקבל המספר 1.
Math.round(0.9);
הערות כלליות
- לפעמים מתכנתים מכנים פרוצדורה "פונקציה" אבל זה במקרים רבים גורם בלבול עם המונח "פונקציה" ממתמטיקה אשר ברוב המקרים נכתב שונה מכפי שפרוצדורה בשפת מחשב נכתבת.