BIGBIG WON PC コントローラー LCDディスプレイ付き 1000Hzポーリングレート トリガー入力切替可能 PC/Switch/Android/iOS対応 2つ背面ボタン TURBO連射/HD振動機能付 mojhon aether ゲームパッド 有線/Bluetooth接続/2.4G無線接続可能
¥3,980 (2025年4月27日 13:11 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)タッチペン 【2025年革新版 全機種対応】タブレット ペン スタイラスペン スマホ Type-C充電 超高精度 極細 12g超軽量 3つ交換用ペン先付き 互換ペン 電量表示/磁気吸着機能対応 軽量 耐摩 耐久 iPad・iPhone・Android・スマホ・タブレット用ペンシル 日本語取扱説明書付き
¥2,099 (2025年4月27日 13:05 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)
「DI(依存性の注入)」って難しそう…と思っていませんか?
実は、DIはとてもシンプルな考え方です。
この記事では、DIを難しく感じていた人に向けて、
「DIは外部から参照をもらうだけ」
という本質をわかりやすくお伝えします。
※依存性の注入を以後「DI」と表記します。
-
今までサービスロケーターを使っていたけど、DIが気になっている人
-
昔DIに挑戦したが、メリットがわからずやめた人
-
これからDIを覚えたいと思っている人
DIの本質:「外部から参照をもらうだけ」
これだけです。
めちゃくちゃシンプルですよね。
では、なぜDIが難しく感じられるのでしょうか?
理由は主に3つあります。
1. 「DIにはコンテナが必須」と誤解している
DIは専用ライブラリ(DIコンテナ)がなくても、手動で実装できます。
まずはコンテナなしで、DIの雰囲気を掴んでみましょう!
サンプルコード
class Program
{
static void Main(string[] args)
{
ILogger logger = new LogSystem();
Hoge hoge = new Hoge(logger);
hoge.Execute();
}
}
public interface ILogger
{
void Log();
}
public class LogSystem : ILogger
{
public void Log()
{
Console.WriteLine("Hello, World!");
}
}
public class Hoge
{
private readonly ILogger _logger;
public Hoge(ILogger logger)
{
_logger = logger;
}
public void Execute()
{
_logger.Log();
}
}
このコードは、「ログを出力するだけ」のシンプルな例です。
ポイントは
「使う側(Hoge)が依存先(LogSystem)を直接 new していない」
ことです。
たったこれだけでDIは出来ています!
2. DIを「目的化」してしまっている
DIは目的ではありません。
疎結合でテストしやすいコードを書くための手段です。
たとえば、SOLID原則の「依存性逆転の原則(DIP)」ではこう述べています。
-
高水準モジュール(ビジネスロジック)は、低水準モジュール(詳細実装)に依存してはいけない。
-
両者は抽象(インターフェース)に依存すべきである。
DIでの依存性の逆転の実現方法としては
依存性の逆転は、何を達成したいのか(what)に対して
DIは依存性の逆転をどのように達成したいのか(how)
DIは手段なのです
DIを使えば、自然とこの形を実現できるのです。
3. 「どこにDIを使えばいいかわからない」
これもよくある難しい思うポイントです(正直、自分もよく悩みます)
そんなときは、「設計パターンや原則に沿うかどうか」 を判断基準にするとよいでしょう。
-
外部リソースを扱うクラス(例:DBアクセス、ファイル操作、ログ出力)
Repositoryパターン など -
動作を差し替えたい箇所(例:テスト時にモックを使いたい場所)
オープンクローズドの原則 や 依存性の逆転など
には、積極的にDIを使うべきです。
逆に、自明な内部処理(単純な計算など) には無理に使う必要はありません。
更にDIを何でもかんでも注入すると 網目の依存 になるので注意すべきです
DIを使うか迷ったら、こう考えてください。
-
DIの本質は**「外部から参照をもらうだけ」**です
-
DIコンテナが無くても手動DIで十分DIのやりたいことが出来ます!
-
DIは手段であり、疎結合でテストしやすい設計を助けるものです