Skip to content

Commit

Permalink
[website] Fix ja
Browse files Browse the repository at this point in the history
  • Loading branch information
hadashiA committed Aug 6, 2021
1 parent dd5a497 commit 7f64a08
Showing 1 changed file with 6 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ title: DIって何 ?

DI(=Dependency Injection) は、オブジェクト指向プログラミングにおける一般的なテクニック/パターンのことです。

あるクラスのコードの中から「委譲先のオブジェクトがどこからやってくるのか?」という情報を消すことで、クラスの実装同士を疎結合にする、というのが主なコンセプトです。
あるクラスのコードの中から「委譲先のオブジェクトがどこからやってくるのか?」という情報を取り除き、クラスたちと、それらの関係を結びつける設定とを分けてしまおう、というのが主なコンセプトです。

DIで参照関係を組み立てると、アプリケーションのコードを変更せずともクラス同士の依存関係をつなぎかえることができるので、テスタビリティやある種のメンテナンス性が改善する... とかとか一般的には言われています。

……そんな教科書的な話の全てがクライアントサイドでも強いメリットを持つとも限りませんが、依存関係を結びつけるやりかたに一貫したスタイルを持ち込むことにはある種の快適さがあることは確かです
……そんな教科書的な話の全てがクライアントサイドでも強いメリットを持つとも限りませんが、参照関係を結びつけるやりかたに一貫したスタイルを持ち込むことにある種の快適さがあることは確かです

:::note
C# では、サーバやコンソールアプリケーションを書くための 設定・ロギング・などなどを整備する標準的な仕組み [Generic Host](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0) がありますが、これはDIをベースにしたフレームワークとしてデザインされてます。
Expand All @@ -26,8 +26,8 @@ C# でDIを使用するプログラミングをするなら要チェックだ!
2. オブジェクトは自身の責務ではない仕事については、別のオブジェクトへ委譲する。

よさそうです。しかし実際にこれを完璧に行おうとするのは意外に簡単ではありません。
あるクラスのコードのなかに別のクラスへの委譲を書こうとすると、単純に考えれば、委譲先のオジェクトの生成方法または取得方法もそこに書くことになりそうです。しかし考えてみると、それは委譲元が委譲先の実装を選んでしまうことになりますし、委譲先のインターフェイスさえ知っていれば十分な場合でも、委譲元ではコードを書き換えないと実装が交換可能ではありません。
実を言うと、突き詰めていけば、これを避けるには外側からオブジェクトの参照を渡してあげるしかありません。DI っていうのはつまりそれを行うパターンのことです。
あるクラスのコードのなかに別のクラスへの委譲を書こうとすると、単純に考えれば、委譲先のオジェクトの生成方法または取得方法もそこに書くことになりそうです。しかしもう少し考えてみると、それは委譲元が委譲先の実装を選んでしまうことになりますし、委譲先のインターフェイスさえ知っていれば十分な場合でも、委譲元ではコードを書き換えないと実装が交換可能ではありません。
実を言うと、これをカンペキに避けるには外側からオブジェクトの参照を渡してあげるしかありません。DI っていうのはつまりそれを行うパターンのことです。

- 合わせて読みたい:
- [Manning | Dependency Injection in .NET](https://www.manning.com/books/dependency-injection-in-dot-net)
Expand All @@ -42,9 +42,9 @@ C# でDIを使用するプログラミングをするなら要チェックだ!

## なぜ Unity にDI ? {#whi-di-for-unity}

通常、Unityにおいては、 `MonoBehaviour` が アプリケーションの処理の起点になります。それと同時に、画面に表示するものを表現した 「Viewコンポーネント」の役割を持つのもまた `MonoBehaviour` です。
通常、Unityにおいては、 `MonoBehaviour` が アプリケーションの処理の起点になります。と同時に、画面に表示するものを表現した 「Viewコンポーネント」の役割を持つのもまた `MonoBehaviour` です。

アプリケーション設計においては、「ドメインロジックとプレゼンテーション(Viewコンポーネント)の分離」がとても大事です。`MonoBehaviour` が多くの役割(イベントハンドリング、制御フロー、ドメインロジック呼び出し、etc...)を担っていると、この原則は破綻してしまいます
アプリケーション設計においては、「ドメインロジックとプレゼンテーション(Viewコンポーネント)の分離」がとても大事です。`MonoBehaviour` が多くの役割(イベントハンドリング、制御フロー、ドメインロジック呼び出し、etc...)を担っていると、この原則が破綻してしまいがちです

DI の目的のひとつに IoC (制御の反転) があります。DIコンテナを使うと、参照関係の順番についていかようにでも主導権を握れるので、 `MonoBehaviour` のようなUnityに依存した末端のオブジェクトじゃなくて、自由に定義した C# クラスの方を処理のはじまりにすることができます。
これは、制御フローおよびその他のドメインロジックと、ViewコンポーネントとしてのMonoBehaviourの機能との分離に役立ちます。
Expand Down

1 comment on commit 7f64a08

@vercel
Copy link

@vercel vercel bot commented on 7f64a08 Aug 6, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.