[Object-oriented] 控制反轉 (IoC)
前言 :
參加點部落的活動,關於IoC(控制反轉)大家有很多的討論。
本文排除物件生成的部份,單純解釋IoC。
本篇文章以之前寫的 [Object-oriented] : 重用內容來舉例。
套用IoC之前的物件圖 :
很明顯的
左邊的組件A,相依右邊的組件B。
左邊的物件,相依右邊的物件
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。(物件也是相依性反轉)
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)
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。