控制反轉- 維基百科,自由的百科全書
文章推薦指數: 80 %
控制反轉(英語:Inversion of Control,縮寫為IoC),是物件導向程式設計中的一種設計原則,可以用來減低電腦代碼之間的耦合度。
其中最常見的方式叫做依賴 ...
控制反轉
維基百科,自由的百科全書
跳至導覽
跳至搜尋
此條目需要精通或熟悉計算機科學的編者參與及協助編輯。
請邀請適合的人士改善本條目。
更多的細節與詳情請參見討論頁。
此條目已列出參考文獻,但因為沒有文內引註而使來源仍然不明。
(2021年3月22日)請加上合適的文內引註來改善這篇條目。
控制反轉(英語:InversionofControl,縮寫為IoC),是物件導向程式設計中的一種設計原則,可以用來減低電腦代碼之間的耦合度。
其中最常見的方式叫做依賴注入(DependencyInjection,簡稱DI),還有一種方式叫「依賴尋找」(DependencyLookup)。
目次
1起源
2技術描述
3實現方法
3.1依賴注入
3.2依賴查找
4控制反轉應用實例
4.1C++
4.2Java
4.3.NET
4.4PHP
5參考文檔
6外部連結
起源[編輯]
早在2004年,MartinFowler就提出了「哪些方面的控制被反轉了?」這個問題。
他總結出是依賴物件的獲得被反轉了,因為大多數應用程式都是由兩個或是更多的類通過彼此的合作來實現業務邏輯,這使得每個物件都需要取得與其合作的物件(也就是它所依賴的物件)的參照。
如果這個取得過程要靠自身實現,那麼這將導致代碼高度耦合並且難以維護和除錯。
技術描述[編輯]
ClassA中用到了ClassB的物件b,一般情況下,需要在A的代碼中顯式地用new建立B的物件。
採用依賴注入技術之後,A的代碼只需要定義一個private的B物件,不需要直接new來獲得這個物件,而是通過相關的容器控制程式來將B物件在外部new出來並注入到A類里的參照中。
而具體取得的方法、物件被取得時的狀態由設定檔(如XML)來指定。
實現方法[編輯]
實現控制反轉主要有兩種方式:依賴注入和依賴尋找。
兩者的區別在於,前者是被動的接收物件,在類A的實例建立過程中即建立了依賴的B物件,通過類型或名稱來判斷將不同的物件注入到不同的屬性中,而後者是主動索取相應類型的物件,獲得依賴物件的時間也可以在代碼中自由控制。
依賴注入[編輯]
主條目:依賴注入
依賴注入有如下實現方式:
基於介面。
實現特定介面以供外部容器注入所依值型別的物件。
基於set方法。
實現特定屬性的publicset方法,來讓外部容器呼叫傳入所依值型別的物件。
基於建構函式。
實現特定參數的建構函式,在新建物件時傳入所依值型別的物件。
基於註解。
基於Java的註解功能,在私有變數前加「@Autowired」等註解,不需要顯式的定義以上三種代碼,便可以讓外部容器傳入對應的物件。
該方案相當於定義了public的set方法,但是因為沒有真正的set方法,從而不會為了實現依賴注入導致暴露了不該暴露的介面(因為set方法只想讓容器存取來注入而並不希望其他依賴此類的物件存取)。
依賴尋找[編輯]
依賴尋找更加主動,在需要的時候通過呼叫框架提供的方法來取得物件,取得時需要提供相關的設定檔路徑、key等資訊來確定取得物件的狀態
控制反轉應用實例[編輯]
C++[編輯]
PocoCapsuleIoCandDSMframework(頁面存檔備份,存於網際網路檔案館)LGPL開源的,支援完全非侵入C++的控制反轉(IoC)及領域特定建模(DSM)容器
hypodermic(頁面存檔備份,存於網際網路檔案館)MIT開源協定,Hypodermic是一個基於C++11開發的控制反轉(IoC)容器,它為你的C++物件協同運作提供依賴注入。
Hypodermic靈感來自著名的.NETIoC專案Autofac。
Java[編輯]
使用Java語言寫成的程式在控制反轉容器(InversionofControlContainer)裡應用了控制反轉(Martin2004)。
軟體需要一個來自容器的物件,而容器自行建構物件和它的附屬物。
ATG(英語:ArtTechnologyGroup)的Dynamo應用程式伺服器是第一個利用這途徑的環境之一,近來關於這些容器的例子包含了HiveMind、PicoContainer(頁面存檔備份,存於網際網路檔案館)、SpringFramework(注意Spring是一個完整的企業平台,而非IOC容器)、ApacheExcalibur、Seasar和DPMLMetro.
.NET[編輯]
Ninject(頁面存檔備份,存於網際網路檔案館)
Spring.NET(頁面存檔備份,存於網際網路檔案館)
ObjectBuilder(頁面存檔備份,存於網際網路檔案館)
Structuremap(頁面存檔備份,存於網際網路檔案館)
CastleProject
Seasar(頁面存檔備份,存於網際網路檔案館)
Autofac(頁面存檔備份,存於網際網路檔案館)
Unity(頁面存檔備份,存於網際網路檔案館)
MET
PHP[編輯]
PhalconPHP框架中應用了依賴注入:DIinPhalcon(頁面存檔備份,存於網際網路檔案館)
LaravelPHP框架核心的服務容器支援依賴注入:ServiceContainer
參考文件[編輯]
^RobertCecilMartin.AgileSoftwareDevelopment:Principles,PatternsandPractices.PearsonEducation.2002.ISBN978-0-13-597444-5.
^RobertCecilMartin.TheDependencyInversionPrinciple(PDF).[2005-11-15].(原始內容(PDF)存檔於2004-12-21).
^MartinFowler.InversionofControlContainersandtheDependencyInjectionPattern.2004[2005-11-15].(原始內容存檔於2020-05-30).
^SonyMathew.ExaminingtheValidityofInversionofControl.2005[2005-11-16].(原始內容存檔於2005-11-29).
^KeJin.DomainSpecificModeling(DSM)inIoCframeworks.2007[2007-11-13].(原始內容存檔於2007-11-15).
外部連結[編輯]
AnotherdescriptionofIOC
Alistof"OpenSourceInversionofControlContainers(頁面存檔備份,存於網際網路檔案館)"
AsimpledemoofInversionofControl(usingSpringframework)
InversionofControlContainersandtheDependencyInjectionpatternbyMartinFowler(頁面存檔備份,存於網際網路檔案館)
Needle,adependencyinjection(inversionofcontrol)containerforRuby(頁面存檔備份,存於網際網路檔案館)
DripIoC(頁面存檔備份,存於網際網路檔案館),adependencyinjection(inversionofcontrol)containerforPHP4(頁面存檔備份,存於網際網路檔案館)
PyContainer(頁面存檔備份,存於網際網路檔案館),adependencyinjection(inversionofcontrol)containerforPython(頁面存檔備份,存於網際網路檔案館)
QtIocContainer(頁面存檔備份,存於網際網路檔案館),adependencyinjection(inversionofcontrol)containerforC++(頁面存檔備份,存於網際網路檔案館)
IntroducingCastle,explainstheproblemsthatInversionofcontrolcontainerstrytosolve(usingCastleProject)
PocoCapsule(頁面存檔備份,存於網際網路檔案館)AnopensourceIoCandDSMframeworkforC++
DomainSpecificModeling(DSM)inIoCframeworks(頁面存檔備份,存於網際網路檔案館)
閱論編軟體設計模式設計模式建立型
抽象工廠
生成器
工廠方法
惰性初始
原型
單例
結構型
配接器
橋接
Composite(英語:Compositepattern)
修飾
外觀
享元
代理
行為型
責任鏈
命令
Interpreter(英語:Interpreterpattern)
迭代器
中介者
Memento(英語:Mementopattern)
觀察者
Specification(英語:Specificationpattern)
State(英語:Statepattern)
策略
模板方法
存取者
函數式
么半群
函子
應用式
單子
Comonad
Freemonad
HOF
柯里化
函式複合(英語:Functioncomposition(computerscience))
閉包
生成器
並列模式
主動物件(英語:Activeobject)
阻止(英語:Balkingpattern)
Bindingproperties(英語:Bindingpropertiespattern)
雙重檢查鎖定模式
非同步方法呼叫
Future與promise
Guardedsuspension(英語:Guardedsuspension)
Join(英語:Join-pattern)
鎖
Messaging(英語:Messagingpattern)
監視器
Proactor(英語:Proactorpattern)
反應器
讀寫鎖
排程
執行緒池
Thread-localstorage(英語:Thread-localstorage)
架構模式
ADR(英語:Action–Domain–Responder)
主動記錄
Broker(英語:Brokerpattern)
主從式架構
cbd
DAO
DDD
Datatransferobject(英語:Datatransferobject)
Frontcontroller(英語:Frontcontroller)
Identitymap(英語:Identitymappattern)
Interceptor(英語:Interceptorpattern)
控制反轉
MVC
微服務
MVP
單體式應用程式
多層架構
n-tier(英語:Multitierarchitecture)
Nakedobjects(英語:Nakedobjects)
P2P
發布/訂閱
REST
SOA
Specification(英語:Specificationpattern)
執行緒局部儲存
雲分散式
斷路器
CQRS(英語:Command–queryseparation)
補償交易(英語:CompensatingTransaction)
索引表
領導者選舉(英語:Leaderelection)
MapReduce
物化視圖(英語:Materializedview)
管道
過濾器(英語:Filter(software))
發布/訂閱
分片(英語:Shard(databasearchitecture))
節流(英語:Throttlingprocess(computing))
其他模式
Blackboard(英語:Blackboarddesignpattern)
Businessdelegate(英語:Businessdelegatepattern)
Compositeentity(英語:Compositeentitypattern)
委託
依賴注入
Interceptingfilter(英語:Interceptingfilterpattern)
惰性載入
Methodchaining(英語:Methodchaining)
類比物件
空物件
物件池
Servant(英語:Servant(designpattern))
Twin(英語:Twinpattern)
Typetunnel(英語:TypeTunnelpattern)
書籍
設計模式:可復用物件導向軟體的基礎
企業整合模式(英語:EnterpriseIntegrationPatterns)
人物
克里斯托佛·亞歷山大
埃里希·伽瑪
RalphJohnson(英語:RalphJohnson(computerscientist))
JohnVlissides(英語:JohnVlissides)
葛來迪·布區
肯特·貝克
沃德·坎寧安
馬丁·福勒
RobertMartin(英語:RobertCecilMartin)
JimCoplien(英語:JimCoplien)
DouglasSchmidt(英語:DouglasC.Schmidt)
LindaRising
社群
TheHillsideGroup(英語:TheHillsideGroup)
ThePortlandPatternRepository(英語:PortlandPatternRepository)
取自「https://zh.wikipedia.org/w/index.php?title=控制反转&oldid=69160247」
分類:物件導向的程序設計基於組件的軟體工程Java編程原則軟體架構軟體設計模式隱藏分類:需要計算機科學專家關注的頁面自2021年3月缺少註腳的條目含有英語的條目使用ISBN魔術連結的頁面
導覽選單
個人工具
沒有登入討論貢獻建立帳號登入
命名空間
條目討論
臺灣正體
不转换简体繁體大陆简体香港繁體澳門繁體大马简体新加坡简体臺灣正體
查看
閱讀編輯檢視歷史
更多
搜尋
導航
首頁分類索引特色內容新聞動態近期變更隨機條目資助維基百科
說明
說明維基社群方針與指引互助客棧知識問答字詞轉換IRC即時聊天聯絡我們關於維基百科
工具
連結至此的頁面相關變更上傳檔案特殊頁面靜態連結頁面資訊引用此頁面維基數據項目
列印/匯出
下載為PDF可列印版
其他語言
العربيةDeutschEnglishEspañolفارسیFrançaisעבריתMagyarItaliano日本語한국어PolskiPortuguêsРусскийSvenskaУкраїнська
編輯連結
延伸文章資訊
- 1控制反轉- 維基百科,自由的百科全書
控制反轉(英語:Inversion of Control,縮寫為IoC),是物件導向程式設計中的一種設計原則,可以用來減低電腦代碼之間的耦合度。其中最常見的方式叫做依賴 ...
- 2ROD IOC FOK 是什麼?差在哪? - Fugle 富果客服中心
ROD IOC FOK 是什麼?差在哪? 新手投資人在剛接觸股市時,經常會疑惑ROD、IOC 以及FOK 分別是什麼意思呢?因為台股在2020 年3 月底時, ...
- 3International Olympic Committee - Wikipedia
The International Olympic Committee is a non-governmental sports organisation based in Lausanne, ...
- 4【Day4】淺談威脅情報,TTPs 與IOC - iT 邦幫忙
IOC(Indicators of Compromise) ... 入侵威脅指標。 當攻擊的行為已造成時,IOC包含了網域名稱和IP位址、檔案的HASH值, 有了這些資訊,可以讓使用者在防火牆、...
- 5ROD / IOC / FOK差在哪? 最完整的逐筆交易教學懶人包
ROD、IOC、FOK是什麼?台股在將盤中原本的集合競價方式改為逐筆交易,逐筆交易制度意思是種快速配對交易的方式,下單委託方式也變成市價 ...