Inversion of control
ויקיפדיה האנציקלופדיה encyclopedia
בהנדסת תוכנה, היפוך שליטה (באנגלית: Inversion of control; בראשי תיבות: IoC) היא תבנית עיצוב בתכנות מונחה-עצמים שבמסגרתה צימוד (coupling) האובייקטים מבוצע בזמן ריצה על ידי אובייקט הרכבה (assembler object), ובדרך כלל אינו ידוע מראש בזמן ההידור באמצעות ניתוח קוד סטטי.
בתכנות מסורתי, בקרת הזרימה של הלוגיקה העסקית נקבעת על ידי אובייקטים שמוקצים סטטית אחד אל השני. לעומת זאת, כאשר עובדים עם היפוך שליטה, הזרימה תלויה בגרף האובייקטים שנוצר על ידי אובייקט ההרכבה, והיא מתאפשרת על ידי הגדרת האינטראקציות בין האובייקטים באמצעות אבסטרקציות. תהליך הקישור בין אובייקטים מושג באמצעות הזרקת תלויות (dependency injection). יש הטוענים כי ניתן להשיג היפוך שליטה גם על ידי שימוש בתבנית העיצוב service locator.
על מנת שאובייקט ההרכבה יקשור אובייקטים אחד אל השני, לאובייקטים חייבות להיות קיימות אבסטרקציות מתאימות. לדוגמה, מחלקה A
יכולה להאציל (delegate) את הפונקציונליות שלה לממשק מסוים I
. כלומר המחלקה A
הופכת להיות תלויה במחלקה אחרת כלשהי שתממש את הממשק I
ותספק לה את הפונקציונליות המוגדרת על ידי ממשק זה. מחלקות B
ו-C
יכולות לממש את הממשק I
, כל אחת בצורה שונה; אובייקט ההרכבה יוצר מופע של A
ושל אחת מהמחלקות B
או C
, בהתאם ללוגיקה בזמן הריצה או בהתאם להגדרה בקובץ קונפיגורציה, ואז "מזריק" את B
(או את C
) ל-A
, ובכך מספק לה את הפונקציונליות הנדרשת. (להסברים ודוגמאות מפורטים יותר, ראו: הזרקת תלויות).
למעשה, היפוך שליטה הוא סגנון של עיצוב תוכנה שבו קוד הניתן לשימוש חוזר שולט בביצוע של קוד המיועד לפתרון של בעיות ספציפיות. המשמעות היא שהקוד שניתן לשימוש חוזר והקוד המיועד לפתרון של בעיה ספציפית מפותחים בנפרד, ולבסוף מאוחדים לקבלת יישום אחד כולל, המשלב את חלקי הקוד השונים.
שימוש בעקרונות העיצוב של היפוך שליטה משרת את המטרות הבאות:
- משיגים הסרת צימוד (decoupling) בין הביצוע של משימה מסוימת מהמימוש שלה.
- כל מודול יכול להתרכז במשימה שעבורה הוא תוכנן.
- מודולים שונים אינם מתבססים על הנחות לגבי מה מערכות אחרות עושות, אלא מסתמכים על ה"חוזים" שלהן (ראו: Design by contract).
- החלפת מודולים אינה גוררת תופעות לוואי במודולים אחרים.
לעיתים מתייחסים בהומור להיפוך שליטה כאל עיקרון הוליווד: "אל תתקשר אלינו, אנחנו נתקשר אליך", בגלל שהלוגיקה של התוכנה רצה כנגד אבסטרקציות כדוגמת פונקציות callback.