withアプリーチWiki:依存性の注入アプリ開発で「DI」と言う言葉に触れるようになり、実際に意識した開発を心掛けたいと思ったので自分なりにまとめていきたいと思います。間違っている点や誤解を招く表現があるかも知れませんが、何かありましたら教えていただけると嬉しいです。Injectionの略称であり日本語では依存性注入という意味で、アプリ開発などのオブジェクト指向型のソフトウェア開発における基本的な考え方や設計原則を表現しパターン化したデザインパターンの1つになるようです。デザインパターンにも様々な種類がありますがその中でもDIの特徴は「依存関係をオブジェクト外に持たせて外部から注入するような設計にする」です。依存関係とは?そもそも依存関係とはオブジェクト同士が依存している関係のことです。ここでいうオブジェクトはクラスや構造体、メソッドなども当てはまります。結合が強い状態のことを密結合と呼んだりします。以下にはUserクラスとActionGameクラスが定義されていますがここで依存関係が生まれています。10Userクラスの中でActionGameクラスがインスタンス化されているため、UserクラスはActionGameクラスが存在しないとクラスとしての機能を保てません。これがまさしく依存している状態です。これでもコードは動作するし問題がないといえばそれまでです。新しくRacingGameを増やすことを考えてみます。今のままだとUserクラス内に新しくメソッドを追加するしかなくなってしまいます。これでは拡張性がありません。protocolを使用して抽象的なオブジェクトを作り、それをUserクラスに注入するように変更してみます。5依存がなくなったわけではないですが依存度はだいぶ軽減されたかと思います。これが完璧にDIのサンプルとして正しいわけではないと思いますがDIの雰囲気は掴めたかと思います。導入するメリットDIを導入すれば必ずメリットが生まれる訳ではありません。規模や環境によって導入するメリットがあるかないかは考える必要があるかと思います。そこはさておき、DIを導入することで生まれるメリットをまとめてみます。単体テストの効率化オブジェクト同士の結合度が低下することで再利用性や拡張性がと高まります。依存関係を外部から受け取る方式にすることでモックやスタブへの置き換えがしやすくなり、結果テストの効率性が向上します。DIの種類プログラムに依存性を注入する方法としてDIでは3種類の方法が挙げられています。Injection(インターフェイスインジェクション)インターフェイス(プロトコル)を用意しそれに準拠させることで専用のインターフェースを介して注入。最初にやったのはこれに近いです。Injection(コンストラクタインジェクション)コンストラクタ(イニシャライザ)としてクラスをインスタンス化して注入。Injection(フィールドインジェクション)プロパティ内に変数を定義しておきsetterメソッド経由でインスタンス化して注入。オブジェクトのインスタンスが作成された後に依存関係を注入できるDIを意識した開発DIについて長々と色々な説明がありましたが、結局のところなんなのか分かりにくい部分が多いです。私的にとりあえず以下のポイントに気をつけていればDIを意識した開発(あくまで意識したです)ができると思います。wikipediaの記事を参考にしましたが意外と分かりやすかったです。勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。ご覧いただきありがとうございました。友達や家族の誕生日を登録しておくと当日に通知が届きお知らせしてくれるiOSアプリです。貸し借り管理アプリお金の貸し借りを管理するためのアプリです。貸借の色が分かれているので識別しやすく、使いやすさを求めてできるだけシンプルなUIにしています。カシホン人に貸すことが多く、誰に貸したか忘れがちな本の貸し借りを記録できるアプリです。