オブジェクト指向とDIを分かりやすく例えて教えてくれ 3
■ このスレッドは過去ログ倉庫に格納されています
■ オブジェクト指向・デザインパターン(有用) わかり易い例 class Dog extends Animal class Cat extends Animal ■ DI(ゴミ) DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン https://web.archive.org/web/20170707082300/http ://kakutani.com/trans/fowler/injection.html > Dependency Injection の形式 > Dependency Injection の基本的な考え方は、独立したオブジェクトを > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を > MovieLister クラスのフィールドへ適切に設定させるというものだ。 > 依存関係は図2のようになる。 前スレ オブジェクト指向とは 分かりやすく教えてくれ https://medaka.5ch.net/test/read.cgi/prog/1521869966/ オブジェクト指向を分かりやすく例えて教えてくれ 2 https://medaka.5ch.net/test/read.cgi/prog/1525660302/ 設定をコードに散らばらせずに一箇所にまとめるメリットは分かるのに クラスの依存関係をコードに散らばらせずに一箇所にまとめるメリットは分からないの? 設定だから一箇所にまとめることにメリットあるわけで、 設定じゃないものは、一箇所にまとめるメリットないぞ? すべての処理を一箇所にまとめたらデメリットだってわかるだろ? 一箇所にまとめる = メリットなんじゃなくて 設定を一箇所にまとめる = メリットなんだよ 「設定」は一箇所だろではなく 「シングルトン」は一箇所だろに 話が変わっているところに注意 今話をしているのは「設定」だから 一箇所にすることにメリットが有るという話で 設定じゃないもの(クラスやシングルトン)は 一箇所にしたところでメリットはない データベースも最終的に呼び出す場所は1箇所だけどな。 なるほど、設定だから、一箇所にまとめるわけですね。 設定じゃないものは、まとめないしDIを使う必要もないと DI厨の基本能力が低すぎる。 すぐ矛盾点が露呈するし 言ってることの辻褄が合ってない たぶんなにも考えずいわれるがまま DIを使ってるんだろうな >>678 >すべての処理を一箇所にまとめたらデメリットだってわかるだろ? クラスの依存関係は処理じゃない 一種の設定です クラスの依存関係は、アプリの利用者が 変更するものではないので設定ではありません えっ? じゃあ定数とか設定に追い出さないで 全部コードにマジックナンバー埋め込むってこと? DI否定厨は凄いなぁw >>688 マジックナンバーは定数にはしますが 設定にはしませんよw 定数と設定を並べて書いても、 私は引っかかりませんwww またDI厨の行き当たりばったり感あふれるレスが 一瞬で潰されたのかw いや、お前が定数を設定を呼ぼうが何と呼ぼうが勝手だが 定数は一箇所にまとめるだろ?メリットあるだろ? DIも一緒だからね 言葉遊びで逃げないで、このメリット否定してみてよ 設定は一箇所にまとめる。そんだけ 設定じゃないもの話を持ってくるな 連想ゲームやってるんじゃねーんだ > 定数は一箇所にまとめるだろ 普通モジュールごとに定義する場所を分けるわなw じゃあ定数をモジュール別にわけるメリットを言ってみろよ! という感じで、なし崩し的に、 わけたほうが良いという話題に持っていきません?w 夢見がちな設定まとめ厨には残念なお知らせだが、現実の世界では設定は一箇所にはまとめんよ クラウド、データベース、レジストリ、ローカルファイル、定数クラス、エントリーポイント、、、 目的や要件によってどこに設定を置くべきかは変わってくるし、置き場によって取得方法は異なる でも設定を利用する側のクラスは設定値だけが欲しいのであって、設定がどこにあるか、どうやってとってくるのかは意識したくない なので設定読み取りをクラスにしてインジェクションするんだよ 設定読み込みにDIは必須と言える DIは素晴らしい!最高だ! ということで、設定でも まとめたりしないということで、 DI厨はピンチに陥りましたw common.Constantsスタティッククラスに定数を一生懸命集める香具師、オブジェクト指向全くわかってない モジュール毎にまとめるか、アプリの単位でまとめるかは、システムによるからなぁ newでインスタンス生成ってマジックナンバー埋め込みと一緒じゃん >>701 変更したくなったときに全体調べて書き換えていく必要がある点が一緒じゃん DBのドライバをクラス名で設定ファイルに書くのはDI? DBのドライバは、アプリの利用者が 変更するものではないので設定ではありません 我々が設定ファイルと呼んでるものはDI否定厨にとっては設定ファイルじゃないらしいが、 じゃあ何て名前で呼んでるんだろう? 一時的なものならハードコートした方が手っ取り早いのは当たり前だあな >>702 > 変更したくなったときに全体調べて書き換えていく必要がある点が一緒じゃん マジックナンバーを変更したいととなんてないんですが? >>703 > DBのドライバをクラス名で設定ファイルに書くのはDI? 全く違う DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン >>705 > 我々が設定ファイルと呼んでるものはDI否定厨にとっては設定ファイルじゃないらしいが、 設定ファイルと読んでいるものではなくて、 その設定ファイルそのものを見せてくれませんかね? どう見ても設定ファイルではないと一蹴してあげますんでw 有名なフレームワークは様々な需要に応えなきゃならん 本来不要なDIも一部のワガママで削除することができない >>710 SpringのapplicationContext.xmlは設定ファイルじゃなかったら何なの? >>715 あー、そういうこと? アプリの動作を変えるために、アプリの利用者が設定するファイルと アプリをビルドするのに必要なファイルをごっちゃにしてるのか。 今の話は、アプリ利用者が設定するファイルの話 その設定ファイルは一つにまとめるメリットは有るが アプリをビルドするのに必要なファイルはそうする必要ないでしょってこと 設定を1ファイルに書くとめちゃくちゃになる 使うクラスごとに設定ファイルを分けろ >>716 お前以外はアプリ利用者の設定なんて話はしてなかったぞ ていうかDIの分脈でアプリ利用者の設定ファイルなんて出てくるわけないじゃん お前ワザと話を逸らしてるんじゃなかったら頭の病気を疑った方が良いぞ DIは依存関係を集約するが、それを1ファイルに書かなきゃいけないなんて決まりはない >>716 結局>>715 は設定ファイルなんですか?はっきり答えてください。 そして>>703 をapplicationContext.xmlに書いたらDIにならないのは何故ですか? >>718 は? 接続先DBとか、アプリをビルドするために必要なものじゃなくて アプリのユーザーが指定するものじゃん (ローカルデータベースじゃなくて、DBサーバーを指定する場合) 設定ファイルってこういう物の話でしょ? で、話を戻すけど、そういうアプリのユーザーが決める設定ファイルは 一箇所で指定する必要あるけど、そうでないものは一箇所で指定しなくていい だからDIを使って一箇所に依存関係をまとた方が良いという理由にはならんのだ >>720 > 結局>>715 は設定ファイルなんですか?はっきり答えてください。 わかったわかった。設定ファイルでいいよ アプリをビルドするのに必要な設定ファイル。 ただしこのタイプの設定ファイルは一箇所にするメリットはない > そして>>703 をapplicationContext.xmlに書いたらDIにならないのは何故ですか? それは話が変わってる。依存関係を一箇所にまとめるメリットがないという話をしている。 依存関係を一箇所にまとめるメリットがないから、DIを使うメリットもないという話 しかし、おかしいな。 > 677 名前:仕様書無しさん[sage] 投稿日:2018/06/25(月) 09:50:30.59 > 設定をコードに散らばらせずに一箇所にまとめるメリットは分かるのに ここでいう「設定」がDIコンテナのための設定であるならば、 DIコンテナの設定を一箇所のまとめるメリットがあるから、 DIコンテナの設定を一箇所にまとめよう。という事になって、 おいおい、話が循環してるじゃねーかwって事になってしまう。 その流れで行くならそのそも「設定」は一箇所にまとまってないよね ってことになる 装備に含まれるデータは、半分以上が、日付と製作者・錬金者の情報と思われます。 (こちらにもう少し詳しく書きました。 https://hiroba.dqx.jp/sc/diary/278225439938/view/5325444 ) 初めて装備した時に職人評判が上がるシステムのため、製作者情報は必須ですが、 装備後は必要無い情報ではあります。 フレンドに作ってもらった物は名前を残したいという気持ちはありますが。 提案です。 「装備圧縮袋」 ・装備済の物のみ入れる事ができる。 ・入れた装備は「装備の履歴」の情報が消える。 ・パルプンテや強化した紫文字の情報も(システム的に問題無ければ)消す。 これにより装備品データの約8割が削減されることになるはずです。 10枠の容量で50個の装備が入れられるのです。 ぜひご検討お願いします。 ↑ オブジェクト指向プログラミングを知っている人へ。 勝手にDBのドライバの話(>>703 )をDBの接続先サーバの話に変えるなよ >>703 の話なら、DIではないです。が答えですね。 DBのドライバをクラス名でapplicationContext.xmlに書くのはDI? という質問にしてくれればわかりやすい。 「意味不明な質問であること」がわかりやすい 何が意味不明かと言うと、 DIを使うから、applicationContext.xmlに書くのであって applicationContext.xmlに書くからDIになるのでは無いとういこと。 そもそもの発端は、一箇所にまとめることがメリットであるかどうかという話で、 DBのドライバのクラス名を一箇所に書いておくことにメリットはありません。 DBのドライバのクラス名を一箇所に書いておくことにメリットはないので applicationContext.xmlに書く必要もないということね 何も考えないで言われたことをやってる人は、DI使うのは当たり前、 applicationContext.xmlに書くのが常識。で終わっちゃってるけど なぜそれが必要か?の理由まで考えると、DIを使わなくていいし 一箇所にまとめる必要もないことに気づくはず DI否定厨の無駄に長い話をまとめると、 設定ファイルの話は完全敗北で分が悪いから DIのメリットの有無に話を逸らしたい、だね DIが本題で設定ファイルの話にすり替えられていたのが もとに戻ったというところか 設定ファイルについて双方の意見をまとめて 流れがめちゃくちゃで何を言ってるかわからん 結論 DIで書く理由が宗教的なものでしか無いので却下 >>730 設定ファイルについては忘れていいよ。 本来コードの中から分離すべきでないクラス間の依存情報を 設定情報として分離したら(←そもそもこれが間違い) 一箇所にまとめるのはメリットが有ることでしょう。なぜなら 設定情報はメリットがあるから一箇所にまとめてあるんだからという理屈 (↑この理屈も、設定情報は必ずしも一箇所にまとまってるわけじゃないのだからおかしい) どんなものでも設定情報という扱いにしてしまえば 一箇所にまとめるメリットがある!という暴論になってる DIを否定する人は、どういう理由で否定してるの? 以下に当てはまる理由はありますか? (1) クラスAに依存してるコードをクラスA'に書き換えたいとき、DIなら設定してる一箇所を変えるだけで良いと言われてるが、それは事実と異なる (2) A'に書き換えたいケースなんて存在しない (3) Aに依存してる全てのコードをA'に書き換えて回る方がコストが安い クラスAに依存してるコードをクラスA'に書き換えたいとき、DIを使わずともnewしている所を一箇所を変えるだけで良い 「一箇所を変えるだけで良い」というのはDI特有の話ではないので、二度と言うな >>736 確かにね >>737 DIにユニークな特性じゃなかったら主張しちゃダメってのもよく分からん理屈だが、例えばDIの他では何がある? >>737 おおっと、完全に誤読してた >クラスAに依存してるコードをクラスA'に書き換えたいとき、DIを使わずともnewしている所を一箇所を変えるだけで良い newしてるところを書き換えるということは、Aをnewしてる箇所が100箇所あれば100回書き換えるということね DIなら100箇所でAが使われてても修正は1箇所だよ >>738 だからnew。newする場所はコンストラクタでもメソッドでもいいが、 クラスAに依存したコードを、クラスA'に変えるんだろ? 以下のコードを見れば分かる通り、一箇所しか書き換えていない class My { private InterfaceA a; public My() { a = new A(); } public void method() { a.method(); } } class My { private InterfaceA a; public My() { a = new ADash(); } public void method() { a.method(); } } >>739 > newしてるところを書き換えるということは、Aをnewしてる箇所が100箇所あれば100回書き換えるということね プログラミング初めて1ヶ月の初心者か何かですか? まさかこんなコードかいてんの? class My { public void method1() { InterfaceA a = new A(); a.method(); } public void method2() { InterfaceA a = new A(); a.method(); } public void method3() { InterfaceA a = new A(); a.method(); } } こう書けば終わる話。newしてるのは一箇所だけにできる class My { private InterfaceA createA() { return new A(); } public void method1() { InterfaceA a = createA(); a.method(); } public void method2() { InterfaceA a = createA(); a.method(); } public void method3() { InterfaceA a = createA(); a.method(); } } >>742 そのcreateAはMyクラス以外でも、Aを必要とするクラス全てで利用するという理解であってますか? そもそも、DIでは「Aをnewしてる箇所が100箇所」というコードを 書けないという問題があるんだよ。 できるって? まあそうだね(笑) どういうコードになるか書いてみ。 >>742 と同じようなコードになるからさ >>743 Aを必要とするクラスが複数ある場合、 DIでも「一箇所書き換えるだけ」にはならないってこと わかってますか? >>743 具体的に書きますね? DIを使った場合 クラスMy1がクラスAを使います。 クラスMy2がクラスAを使います。 クラスMy3がクラスAを使います。 クラスMy4がクラスAを使います。 クラスMy5がクラスAを使います。 と5箇所、書かないといけない。 DIでこれを全部A'に書き換える場合 クラスMy1がクラスA'を使います。 クラスMy2がクラスA'を使います。 クラスMy3がクラスA'を使います。 クラスMy4がクラスA'を使います。 クラスMy5がクラスA'を使います。 と5箇所書き換えなければならない >>745 つまり貴方の主張は>>734 の(1)ですね? >>748 YES / NO じゃ正確に答えられない ようするに、DIでn箇所書き換えるなら、DIを使わなくてもn箇所書き換えればいい DIで1箇所書き換える例を出してきたなら、DIを使わないで1箇所書き換えればいい例を出してやるし、 DIを使わないで100箇所書き換える例を出してきたら、DIを使っても100箇所書き換えることを示してやる >>749 貴方はDIで1箇所の修正で済む方法は知らないが、もしあるなら別の方法でも実現してみせる、と言っているのですか? つまり貴方はDIについて無知なのに批判してるということになりますが、それで良いですか? >>750 DIで1箇所の修正で済む方法を出してきたら、 それと同じ方法がDIを使わなくてもできる。 型情報を潰してるだけだからな メリットがあったらスゲーよ インターフェース使ってもいいけど 元の型も容易に取れる仕組みを入れて欲しい DIは所詮依存情報を外出ししただけに過ぎないんだよ それ以外の違いは副次的なもので、DIを使ってできるから 使ってみましたと言うだけで、DIを使わなくてもできる ていうか、ごった煮リストだよね 別にごった煮リストじゃなくてもいいと思うんだけど ごった煮リスト作っちゃうんだよね C#やjavaのようなインターフェースや予測入力がしっかりした言語じゃないとDIの意味なくて、phpなんかでDIって言われても「はぁ?」ってなる >>755 なにを言ってるのかまったくわかりません >>751 ご自身が無知であることを認めて頂き、誠にありがとうございます。 おかげでDIに対する貴方の意見には何の価値もないことが分かりました。感謝します。 批判してる対象の技術で何ができるか、 それも主題としてる問題に対して何ができるかも知らずに 厚かましくも批判するなんて、 どういう神経してるんですかね?その点は興味深いです。 お前らがやりたいことって いつも連想配列な気がする >>757 どういうこと? 今はお前のターンで、DIで1箇所で済む方法を出さなきゃいけないはずなんだが? まだ?まってるよ? アンチが何度もマーチンファウラーのやつ貼ってるのに >>746 これクソわろた 晒し上げとこ アンチアホすぎでしょw アンチ本人は崖っぷちで耐えてると勘違いしてるけど とっくの昔に崖の下に落ちてるパターンw DIは無意味 普通にnewすればいい 実装の差し替えも簡単にできる class A { public void method() { puts "hello" } } class B { public void aaa() { new A().method(); } ここでAをA'にしたくなったら Aをコピペして片方のAをAoriginに改名する もう片方のAの実装をこう差し替える class A { // private Aorigin a = new Aorigin(); private Adash a = new Adash(); public void method() { a.method(); } } また気がかわってAoriginに戻したくなったらコメントアウトを切り替えるだけ Bのほうを直す必要は一切ない クソみたいなフレームワークを覚える労力はいらない 初心者でもわかるほどシンプルで簡単な実装 頭が悪すぎる巨大な泥だんご設定ファイルはいらない 参照ジャンプが有効なのでデバッグも楽々 仮装テーブル挟まないので速い >>765 デザインパターンとして相応しい名前つけてやるよ ドカタコメントパターン >>765 設定ファイルそんなでかくなる? 差し替えが必要な要素は設定ファイル使うけど、大半のクラスはアノテーションとかメタデータで済ませるし >>772 覚えたての巨大な泥団子ってワードを使ってみたかっただけだよ 察してあげてよ >>772 アノテーション使うと一元管理できないですよね? 何に依存するかを、クラスの中に書くことになってしまう >>774 >何に依存するかを、クラスの中に書くことになってしまう ならない >>775 なんで? ちょっとサンプルコード書いてみてよ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる