フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

GoでDIを理解してみる(コードあり)

f:id:lirlia:20210818012402p:plain

DIとはなにか?

  • Dependency Injection の略(依存性の注入)
  • プログラミングのデザインパターンの一つ

DIが嬉しいこと

猿でも分かる! Dependency Injection: 依存性の注入 - Qiita で紹介されていた例がわかりやすかったです。

要点を摘むと以下の通り。

  • 作った車の動作テストをしたい。
  • いろんなテストをしたいので、無限に動くエンジンや摩耗しないタイヤなど商品には使わないけどテスト用に変更したい
  • ただ現状は、車のパーツはすべて溶接されてしまっているのでそんな柔軟なことはできない

この時にDIの考え方を入れると「車のパーツを取り外しできるようにして、必要な時に必要なパーツをくっつけられるようにしよう」ということにります。

これをソフトウェアにも当てはめて考えてみましょう。

実際に使ってみる

普通の場合

Car構造体を宣言する際にSuzukiShellを埋め込んでいるため、あとからWheelやGasを変更するのが難しくなります。(というより実質無理)こうなるとパーツを取り替えてCar構造体の動きを変えたいなあという時に困ります。

DIの場合

一方でこちらの場合はCarDI構造体は車が持つべきcarInterfaceのみが定義されています。そのためCarDIはcarInterfaceを満たす構造体であればなんでも入れることができます。


では、いろんなパーツの組み合わせの車をつくってみたいのでCarTest1~3までを用意してみます。

type CarTest1 struct {
    Honda
    Panasonic
}
type CarTest2 struct {
    Suzuki
    Panasonic
}
type CarTest3 struct {
    Suzuki
    Shell
}

CarDIを作成する時にどの構造体を突っ込むのか? によって出力を以下のように変えることができていますね!

go run di.go

-------DIしてみる-------
  
--Honda / Panasonic--
Wheel : Honda
Gas : Panasonic
  
--Suzuki / Panasonic--
Wheel : Suzuki
Gas : Panasonic
  
--Suzuki / Shell--
Wheel : Suzuki
Gas : Shell

このようにDIの考え方を使うと対象のクラスや構造体を依存関係が少なく管理することができるようになるわけです。