はじめに
最近 symfony(php) を仕事で使うようになって出てくるようになったDIをまとめる。
例によって3分程度で読む記事です。この記事の目的は、DI自体を理解するための前準備です。DIの記事には単体テストしたいよねという記事がよく出てくるが、そもそもDIに紐づく『インターフェース』がよくわかってなかったんだよな。妙に遠回りするような物言いで。なら実際のもので置き換えてみようと思いました。
DJ機材の中心といえばこれ
https://www.soundhouse.co.jp/products/detail/item/226510/
DJ機材にものすごく入れ込んでるときはチャンネル数が多いものを『いいものだ』と思ってどんどん買い換えようとするんだけどスキルがこなれるほど2chでいんじゃね?ってなるよね。まぁそれはどうでもいいんだけど
キー・アイテムはこれ
NEUTRIK ( ノイトリック ) / NDJ
そう、別名ダミーキャップだ。
インターフェースとは
インターフェースとはギアスです。最大に効果を発揮する場面は、大規模開発で人がたくさんいるような場合に、取り決めだけを作ることができるということです。取り決めをしたメソッドが無いような場合に、コンパイラが「エラーを出すことができる(そんな命令ねーよ!)」これがインターフェースの最大の利益です。人為的なコンパイルエラーを作ることができる、と。
public interface IDataGenerator
{
int[] Generate();
}
ダミーキャップの目的とインターフェース、DIの関係
さてダミーキャップは、機材を守るという意味もあるが、今回のダミーキャップと機材の関係の本質は「あたかもそこに機材がつながっているように振る舞う」ことです。プログラミングで使われる「インターフェース」とは、『端子の構造(=型)を守れという抽象的な取り決め』だ。プラグの型さえ合っていれば、たとえ今はダミーで意味はなくてもそこに『phone端子のなにかとつながった!』という関係性が成立します。全く意味はないけどそういうふうに作れば、phone端子の先にアイロンがくっついててもいいわけです。
Dependency Injection(DI)について
DI
は「依存性の注入」と書かれますが、これは非常にわかりにくいことで有名な表現です。DI
の本質は「オブジェクトを(クラスの中に)インストールする」ことです(別の言い方をすると責任の外だし)。「依存性の注入」を別のものに例えると「ロックマン」です。敵の能力をDI
(武器をロックマン用に合わせ(interface
)こんで)して、敵の武器(method
)を扱います。これがDI
の勘所であります。責任を外出しするという表現が使われるのは、抽象的な概念(interface
)しかそこにはないからです。
public interface IDataGenerator
{
int[] Generate();
}