Inversion Of Control – IOC

29 בJanuary 2013

תגובה אחת

IOC Design Pattern

בעבר כתבתי על dependency injection ולמעשה IOC  או בשמו המלא Inversion of Control שזה נשמע כמו “היפוך שליטה” זה
חלק מהעניין.

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

בשביל הדוגמא נניח
שיש לי קוד שמתאר כלב. לכל כלב (חמוד) יש שדה שמתאר את הבעלים שלו. בקונסטרקטור של
הכלב  אני יוצר אינסטנס של הבעלים ומאתחל
את המשתנה הפנימי:

public class Dog

    {

        private Owner _owner;

        public Dog()

        {

            _owner = new Owner(“johnnie walker”);  

        }

    }

 

    public
class Owner

    {

        public string Name;

        public Owner(string name)

        {

            Name = name;

        }

    }

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

כדי לפתור את הבעיה אני
יוצר ספריית שירות חיצונית שאינה תלויה בכלום, שימוש ב
static הוא בד”כ anti Pattern אבל פה הוא דוקא רעיון
טוב,

public static class
IoCContainer

    {

        public static Owner GetOwner()

        {

            return new Owner(“johnnie
walker”
);

        }

    }

ואני קצת משנה את
התנהגות בקלאס כלב שישתמש בשירות שהגדרתי

public class Dog

    {

        private Owner _owner;

        public Dog()

        {

            _owner = IoCContainer.GetOwner();

         

        }

    }

ישנם כמה שיטות שונות
לממש את הרעיון של
Inversion Of Control, אחת הפופולריות היא
באמצעות
dependency Injection, כמו שהזכרתי בהתחלה.

המימוש הספציפי
שהצגתי כאן אני דוקא קרוב יותר לשימוש ב
service Locator . בכל מקרה מה שחשוב כאן זה לא המימוש אלא הבנת הבעיה שישנה בתלות
בין אובייקטים (
coupeling)

 

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *

תגובה אחת

  1. deecytheoft11 בFebruary 2013 ב 15:02

    you’ve got a fantastic weblog here! would you like to make some invite posts on my blog?

    [url=http://blog.bitcomet.com/post/3027359/]jordans cheap[/url]

    http://airjordanshli.webstarts.com/

    Reply