質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

サービス

サービスとはバックグラウンド上に常駐し、長時間稼動し続ける実行可能ファイルを指します。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2640閲覧

Larvalの仕組みであるファサード(オブジェクト注入、サービスコンテナ、サービスプロバイダー)について

earnest_gay

総合スコア615

DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

サービス

サービスとはバックグラウンド上に常駐し、長時間稼動し続ける実行可能ファイルを指します。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

3クリップ

投稿2017/06/01 15:27

編集2017/06/01 15:28

Larvalの仕組みであるファサード(オブジェクト注入、サービスコンテナ、サービスプロバイダー)について

まずはこちらをご覧いただきたい。

依存性の注入とは

Messengerクラスのreturnで使っているsendメソッドは、

SenderInterfaceインターフェイスを継承しているMailSenderクラスとBikeSenderクラスのsendメソッドだと思いますが、
MailSenderクラスとBikeSenderクラスのsendメソッドをmailtransmissionというメソッドに修正した場合、
Messengerクラスのreturnで使っている箇所も、
return $this->sender->mailtransmission($message);に修正しないといけませんよね。

まず、依存性注入やDIコンテナを導入する観点として保守性や柔軟性の向上という点が思想とされていますが、参照URL先の依存性の注入を使っていないケースと依存性の注入を使っているケースの話では柔軟性についてはとてもわかります。

そもそも依存性の注入を使っていないケースで
BikeSenderクラスはデッドロジックになってますよね。。。
あえて、わかりやすくするためにそうしてるのかもですが。

そこは置いといて話は戻り、依存性注入の話とはズレますが
MailSenderクラスとBikeSenderクラスのメソッド名を修正したら
Messengerクラスで、MailSenderクラスとBikeSenderクラスの使用するメソッド名も修正しないといけない点は、柔軟性とはいえないと思います。

そもそも、参照URL先の内容に対する私の観点が違うのでしょうか?
一応、参照URL先の内容はファサードまで読みました。
最終的にファサードを使うと何が嬉しいのかというところで、柔軟性が上がった結果、メモリー効率やパフォーマンス効率がよくなるという理解はあるのですが、もう一度、依存性の注入から見返していくと、そもそもMessengerクラスが、MailSenderクラスに依存しているから柔軟性がないっていうけど、依存性の注入を使ったケースでもメソッド名修正したらその箇所修正しなきゃいけないから、その点柔軟ではないよね。って思ってるのですが、結局、依存性の注入という概念でも最小限の修正は必要なのでしょうか?

何が知りたいとかではなく、ただ思ったことを質問してみました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/06/05 02:22

色々と質問立てられていますが、こちらは解決したのでしょうか?
guest

回答2

0

ベストアンサー

質問内容対する私の理解に誤解があったらごめんなさい。

MailSenderクラスとBikeSenderクラスのメソッド名を修正したらMessengerクラスで、MailSenderクラスとBikeSenderクラスの使用するメソッド名も修正しないといけない点は、柔軟性とはいえない

が意味する所は、例えば…

PHP

1class MailSender implements SenderInterface { 2 public function send($message) { 3 // ここで、メールでメッセージを送る 4 return "メールで送りました。"; 5 } 6}

におけるクラスのメソッド名が下記の様にsendからMessageSendに変わったとすると、

PHP

1class MailSender implements SenderInterface { 2 public function MessageSend($message) { 3 // ここで、メールでメッセージを送る 4 return "メールで送りました。"; 5 } 6}

利用する側が

PHP

1echo $messenger->send("合格通知") . "\n";

ではなく、

PHP

1echo $messenger->MessageSend("合格通知") . "\n";

としなければいけない事を指して、「柔軟性が無い」と仰っているのでしょうか?
(Interfaceも修正しなければいけないのですが…)

これは、流石にどうしようも無いと思います…何を呼んだら良いのか分からなくなりますからね。
(でも、IDEのリファクタリングとかで一括で変更できるかもしれません)

私は参照先HPの筆者ではないので正確なことは言えませんが、「柔軟性」といっているのは下記の部分ではないかと理解しました。

DIコンテナを導入したことで、MessengerクラスとSenderInterfaceを持つクラスの生成を1箇所に集約することができました。また、MailSenderやBikeSenderクラスが他のクラスに依存するなどして、構造に変更があった場合でも、DIコンテナへのバインド部分(Config部分)だけを修正すればよくなります。Main部分において、どのようにクラスをnewするかといったクラス構造は隠蔽されます。

というわけで、

結局、依存性の注入という概念でも最小限の修正は必要なのでしょうか?

という問いに対しては、「必要です」という事になると思います。(そもそも、Configは直さなければいけませんし…)
ただ、修正範囲が小さくなることとテストしやすくなることで、品質は向上する。これがDIを利用するメリットになるのではないでしょうか。

投稿2017/06/02 00:34

motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

依存性の注入という概念も結局は単一責任の原則の延長にある様な気がします。継承でもだめ、インターフェイスでもダメ、じゃーDIだ。それでもだめならアスペクト指向で補おう的な。とただ思ったことですが。

投稿2017/07/21 12:56

tacozu

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問