💢

Zenjectってなんやねん

2022/04/15に公開

■何のためにあんの?

クラス間の密な結合を避けるためにあるらしい

→即ち疎結合な状態をを作り出すためにあるってこと?

■疎結合な状態って何?

お互いの関わりが薄くて「分けるのが楽チンだよ~」になっている状態

ということらしい

逆に密結合は

お互いがごちゃごちゃと絡み合っていて「分けるのが大変だよ~」になっている状態

即ちクラス間が疎結合な状態とは、クラス間の関わりが薄くて「分けるのが楽チンだよ~」になっている状態

...まだ分からんな

■クラス間が疎結合な状態とは

  • 密結合なコード
    PCクラスのインスタンスを他のクラス内で生成し、メソッドの中で利用している

    • 何があかんのか?
      • PCクラスに変更があったときにDoingProgramクラスに影響を及ぼす可能性がある
        例えばunderstandメソッドの名前を変えるとか?
      • なので保守運用する際にコード変更の影響範囲を考慮しなければならなくなるし、密結合なコードの数が増えすぎると追えなくなっていく

    最悪やんけ

  • 疎結合なコード
    同じInterfaceで実装されたメソッドを使用したいタイミングで呼び出す

    • ??????????????????????????????????????????????????
    • 言っている意味がわからん

    もうちょいいい説明を探そうかな...

    まさかのリプナイスな説明を受ける

    『呼び出し元が外部のクラスに定義された関数を呼び出す時はIFに定義された処理のみを呼び出す』
    というルールに則ってコードを書いていれば、『どんな引数を必要とするか』『戻り値は何か』が変わらないので、実装側の処理を書き換えても壊れないということっぽい。
    @kaipu1224さん感謝です。

    けどこれってインターフェースを上手く使えば、実装側のクラスに定義されたメソッドを変更しても『壊れない』って事を言ってるのであって、疎結合を説明したことにはならないのでは...?(『壊れない』= 疎結合ではない気がする。)

■Zenjectを使って結局何をするの?

クラスA内で必要となるクラスBの機能を、必要となったタイミングで引っ張ってくる感じです。そうすることで、クラス間での密な結合を防ぐことができます。

こんな感じのことをやるらしい。よくわからんけどチュートリアルやってみる。

  • チュートリアルでやること
    • キャラクターの移動処理を実装する
    • 現状は使うが、今後のUnityの仕様の変更を見越してUnityEngine.Inputに依存しない書き方をZenjectを利用して実現する

チュートリアル内容は割愛

■結論-Zenject使うと何がいいのか?

チュートリアルの感想は以下の通り

Extenject触ってみた。Interfaceを実装したクラスのインスタンスの扱いが、DIコンテナによって指定した文脈において一元化されるのが何か良さそう。あと、同じInterfaceで実装した別クラスに処理を切り替えたいときInstallerで実装側のクラス名を変えるだけでいいのが疎結合っぽいってことだけ感じた。

結論、疎結合になんか良さそう。

Discussion