שגרה (Routine, רוטינה) היא סדרת פקודות שמבצעת משימה מוגדרת. פונקציה היא שגרה שמחזירה ערך. פרוצדורה היא שגרה שאינה מחזירה ערך ומשמשת לשינויים במצב התוכנית, הדפסה או תוצאות לוואי.
קריאה לשגרה היא הפעלתה בזמן הריצה של התוכנית. קריאה של שגרה לעצמה נקראת רקורסיה. החלק המבוצע של השגרה נקרא גוף השגרה. שגרות יכולות לקבל אפס, פרמטר אחד או מספר פרמטרים.
שגרות הן לב התכנות הפרוצדורלי. שימוש נכון בהן משפר את מבנה הקוד, את הקריאות ואת הגמישות לשינויים. חלוקת קוד לשגרות קצרות מקילה על בדיקה ותיקון שגיאות, ומפחיתה עלויות פיתוח ותחזוקה.
בתכנות מונחה-עצמים שגרה השייכת לעצם נקראת מתודה (Method). מתודה מגדירה את התנהגות האובייקט ופועלת על המידע הכמוס שבתוך העצם. מתודות גם מהוות ממשק בין העצם לשאר התוכנית, לפי רמת החשיפה שלהן.
רוב שפות התכנות תומכות בשגרות, כולל שפות סף ושפות מכונה. מעבדים מודרניים ולרוב שפות ההרכבה תומכים בפקודות לסיוע בשגרות.
פרמטרים מועברים לשגרות בדרך כלל ברשימת ארגומנטים. העברה לפי ערך (By Value) מעתיקה את הערך למשתנים חדשים. העתק זה אומר שהמשתנה המקורי לא משתנה בתוך המתודה.
העברה לפי התייחסות (By Reference) שולחת שם נוסף או כתובת של המשתנה. כך שינוי בתוך המתודה משפיע על המשתנה המקורי. בשפת C, בה העברה לפי ערך היא ברירת המחדל, משתמשים במצביע (pointer) כדי לשלוח את הכתובת ולשנות את המשתנה המקורי.
העמסת פונקציות (function overloading) מאפשרת לתת אותו שם לכמה שגרות, כל אחת עם חתימה שונה. מצב פרטי הוא פרמטרים עם ערכי ברירת מחדל. שפות כמו #C ופייתון מאפשרות גם העברת פרמטרים לפי שם.
לשגרות עלולות להיות תוצאות לוואי, כלומר שינויים במצב התוכנית או במשתנים שנשלחו לפי התייחסות. פעולות קלט/פלט בדרך כלל נחשבות לתוצאות לוואי.
פונקציות בשפות תכנות נהנות מהשם של פונקציות מתמטיות, אך לא תמיד אפשר לתאר אותן כפונקציות מתמטיות טהורות. בשפות פרוצדורליות ההבדל בין פונקציה לפרוצדורה אינו תמיד תחבירי, אלא שימושי: פונקציה מחזירה ערך, פרוצדורה משמשת לפעולה.
בתכנות פונקציונלי (למשל LISP, Haskell, ML) פונקציות הן מרכז השפה. שם נשתדל שלא יהיו תוצאות לוואי, מה שמקל על הוכחת נכונות ועיבוד מקבילי.
הסגמנט שבו משתנה מוכר נקרא תחום הכרזה (scope). בדרך כלל תחום משתנה שהוגדר בתוך פונקציה הוא הבלוק או הפונקציה עצמה. יש שפות שמאפשרות משתנים סטטיים, שיש להם אורך חיים לכל אורך התוכנית, אך טווח ההכרה שלהם מוגבל.
פרוצדורה בשפת C בשם print_num מקבלת int ומדפיסה אותו בעזרת printf. קריאה כמו print_num(5) תגרום להדפסת המספר 5.
פונקציה בשפת C בשם sum מקבלת שני int ומחזירה את סכומם בעזרת return. קריאה print_num(sum(1,2)) תדפיס 3.
בדוגמה ב‑++C יש מבנה SumPrinter עם משתנים a ו‑b. המתודה set קובעת ערכים ל‑a ול‑b. המתודה printSum מדפיסה את סכום a ו‑b. שימוש: mp.set(1,2); mp.printSum(); ידפיס 3.
שגרה היא רצף פקודות שמבצעות מטלה אחת ברורה. פונקציה היא שגרה שמחזירה ערך. פרוצדורה היא שגרה שלא מחזירה ערך והיא עושה משהו בדרך כלל, כמו הדפסה.
קריאה לשגרה היא להפעיל אותה בזמן שהתוכנית רצה. כשהשגרה קוראת לעצמה זו רקורסיה. גוף השגרה הוא מה שמורץ בפועל.
שגרות עוזרות לחלק קוד לחלקים קצרים. זה מקל על תיקון שגיאות ושינוי בתוכנית.
אפשר לשלוח מידע לשגרות בפרמטרים. בהעברה לפי ערך נשלח עותק של המידע. בהעברה לפי התייחסות נשלח שם או כתובת של המשתנה. כך המתודה יכולה לשנות את המשתנה המקורי.
בשפות כמו C משתמשים במצביע. מצביע הוא מספר שמייצג את הכתובת של מקום בזיכרון.
שגרה עלולה לשנות דברים בתוכנית. זה נקרא תוצאת לוואי.
print_num בשפת C מקבלת מספר ומדפיסה אותו. אם קוראים print_num(5) יראו על המסך 5.
sum בשפת C מקבלת שני מספרים ומחזירה את סכומם. print_num(sum(1,2)) תדפיס 3.
ב־++C יש מבנה שנקרא SumPrinter. יש בו משתנים a ו‑b. קוראים mp.set(1,2) כדי להכניס ערכים. mp.printSum() מדפיס את הסכום שלהם.
תגובות גולשים