[Object-oriented] 控制反轉 (IoC)

[Object-oriented] 控制反轉 (IoC)


前言 :

參加點部落的活動,關於IoC(控制反轉)大家有很多的討論。
本文排除物件生成的部份,單純解釋IoC。
本篇文章以之前寫的 [Object-oriented] : 重用內容來舉例。


套用IoC之前的物件圖 :

很明顯的
左邊的組件A,相依右邊的組件B。
左邊的物件,相依右邊的物件

image

public class Robot
{
    private Car _car = null;

    public Robot(Car car)
    {
        _car = car;
    }

    public void Work()
    {
        _car.Run();
    }
}

public class Car
{
    public void Run()
    {

    }
}

套用IoC之後的物件圖 :

很清楚的看到,組件A不再相依組件B。
反倒是組件B為了繼承ICar介面,相依了組件A。(物件也是相依性反轉)

image

public class Robot
{
    private ICar _car = null;

    public Robot(ICar car)
    {
        _car = car;
    }

    public void Work()
    {
        _car.Run();
    }
}

public interface ICar
{
    void Run();
}

public class Car : ICar
{
    public void Run()
    {

    }
}

後記 :

由上面的範例來看,
很明顯的物件的相依性方向改變了。
還有組件的相依性方向也改變了。


總的歸納起來。
狹義的說 : 在切割物件相依性的時候,可以套用IoC。
廣義的說 : 在架構子系統或是應用程式層的時候,也可以套用IoC。
他是一種實做『切割相依性』、『重用上層,抽換下層』這些目的的模式。


IoC不是很新奇的技術,甚至跟各種物件導向技術、設計模式都有點部份重合。
但是主要是讓我們在切割類別或是系統的時候,有個共同的名詞。


另外補充,學習模式是用來幫助設計、分析跟學習。
學完了之後實際在工作上去實做, 等寫到忘記這些模式名詞,
並且可以組合出自己需要的模式,才算真的有到一個段落。
(怎麼有點像倚天屠龍記的橋段...XD)

期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。