【せいぎょのはんてん】

制御の反転(IoC) とは?

最終更新:
💡 処理を書く側から、呼び出しを管理する側へ主導権を移す

処理の呼び出しや部品の組み立てなどの制御を、利用するコード自身からフレームワークなどの外側へ移す設計原則。イベント処理の呼び出しや依存性注入(DI)が例。どの制御を外へ移すかを考えると理解しやすい。

📌 このページのポイント
誰が処理を呼び出すか 自分で呼ぶ形 IoCの一例 アプリ側の コード フレームワーク 呼ぶ 呼ぶ ライブラリ 登録した 自分のコード 処理の中で何をするかは、自分が書く
矢印は呼び出し方向で、青はライブラリやフレームワーク、緑は開発者のコードです。右はコールバックなどを登録する例です。DIでは依存するオブジェクトの用意を外へ移します。IoCのすべてが処理全体の順番を任せることを意味するわけではありません。
ひよこ ひよこ
制御の反転って何がひっくり返るの?
ペンギン先生 ペンギン先生
たとえば自分のコードがライブラリを呼んで進める形から、フレームワークが自分のコードを必要なタイミングで呼ぶ形へ変わるんだ。処理の流れを管理する側が変わることを「反転」と呼ぶよ。
ひよこ ひよこ
自分で処理の順番を決めなくていいの?
ペンギン先生 ペンギン先生
全部を任せるわけではないよ。ボタンのイベント処理を登録すると、イベントのときに呼ぶのは仕組み側。でも、その処理の中で何をどの順番で行うかは自分で書く。任せる部分と自分が決める部分を区別しよう。
ひよこ ひよこ
どうやって自分の処理を渡すの?
ペンギン先生 ペンギン先生
コールバックを登録したり、フレームワークの拡張用メソッドを実装したりする方法があるよ。「こちらから連絡します」というハリウッド原則は、この呼ばれる関係を表す言い方なんだ。
ひよこ ひよこ
IoCとDIは同じものなの?
ペンギン先生 ペンギン先生
IoCは広い原則で、DIはその一例だよ。DIでは部品が依存先を自分で作る代わりに、必要なオブジェクトを外からコンストラクタなどで受け取る。イベントの呼び出しを任せることと、依存する部品を用意することは違う制御なんだ。
ひよこ ひよこ
使えば必ずテストしやすくなる?
ペンギン先生 ペンギン先生
依存先を外から渡せる設計なら、テスト用の部品へ差し替えやすくなるよ。ただしIoCという名前だけでは保証されない。依存関係や呼び出し規約を理解し、処理内部の責任も整理する必要があるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「制御の反転」って出てきたら「呼び出しや部品の用意を外側の仕組みに任せる設計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Inversion of Control」 = 制御の反転
💬 従来はアプリケーションがライブラリを呼んでいたのを「逆転(Inversion)」させるという意味だよ

参考資料

← 用語集にもどる