לדלג לתוכן

Inversion of control

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

בהנדסת תוכנה, היפוך שליטהאנגלית: Inversion of control; בראשי תיבות: IoC) היא תבנית עיצוב בתכנות מונחה-עצמים שבמסגרתה צימוד (coupling) האובייקטים מבוצע בזמן ריצה על ידי אובייקט הרכבה (assembler object), ובדרך כלל אינו ידוע מראש בזמן ההידור באמצעות ניתוח קוד סטטי.

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

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

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

שימוש בעקרונות העיצוב של היפוך שליטה משרת את המטרות הבאות:

  • משיגים הסרת צימוד (decoupling) בין הביצוע של משימה מסוימת מהמימוש שלה.
  • כל מודול יכול להתרכז במשימה שעבורה הוא תוכנן.
  • מודולים שונים אינם מתבססים על הנחות לגבי מה מערכות אחרות עושות, אלא מסתמכים על ה"חוזים" שלהן (ראו: Design by contract).
  • החלפת מודולים אינה גוררת תופעות לוואי במודולים אחרים.

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

טכניקות מימוש

טכניקות מימוש מושפעות משפת התכנות הנבחרת. ב-Java ישנן כמה טכניקות בסיסיות למימוש היפוך שליטה:

  1. שימוש בתבנית העיצוב Factory method
  2. שימוש בתבנית העיצוב Service locator
  3. שימוש ב-dependency injection, לדוגמה:
    • הזרקת constructor
    • הזרקת פונקציית (set (setter
    • הזרקת ממשק
  4. שימוש ב- contextualized lookup