オブジェクト指向を分かりやすく例えて教えてくれ 2
■ このスレッドは過去ログ倉庫に格納されています
わかり易い例
class Dog extends Animal
class Cat extends Animal
オブジェクト指向とは 分かりやすく教えてくれ
https://medaka.5ch.net/test/read.cgi/prog/1521869966/ >>554
え?なんでDIコンテナの話しが出てきた?
DIコンテナじゃなくて、DIはなんなん? だから読もうな。話はそれから
以下が詳しい。みんな大好き、リファクタリングのマーチンファウラーさんの記事やでw
http://kakutani.com/trans/fowler/injection.html (一時的なエラーかもしれないが今アクセスできないので↓)
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html DIという用語を命名したのも、このマーチン・ファウラーだからね
> 本記事では、このパターンの働きについて掘り下げることで、より具体的に「Dependency Injection(依存オブジェクト注入)」と命名し、 >>558
> DIコンテナじゃなくて、DIはなんなん?
DIは "DIパターンを使用した時の" 依存の注入のことを言う
DIパターンでなければ、それは単にオブジェクトを引数でわたしただけ
DIパターンにはDIコンテナ(Assembler)が登場人物として含まれてる
> Dependency Injection の基本的な考え方は、独立したオブジェクトをAssembler(組み立て係)として用意し、 コレも読むと良いよ。この記事はさっき見つけたばかりだが、
同じようなことを考えている人はいるもんだw
(というか10年近く前にすでに言われていたことと
同じことを今更考えていたってだけなんだけどね)
依存性注入(DI)は成功したか?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
>
> しかしながら、DIが最近これほど引っ張りだこになった真の理由は、直交性やカプセル化、
> その他の「純粋な」アーキテクチャ上の問題に関係しているわけではまったくありません。
> 非常に多くのデベロッパがDIを利用している本当の理由は、モックオブジェクトを
> 使ったユニットテストを促進することです。好きなだけくどくど言っても構いませんが、
> 頭の切れるデベロッパを実際に説得して、もっと単純な実装よりもDIを選ばせるようにするのが、
> モックオブジェクトを使ったユニットテストという要因なのです。
>
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
>
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。 >>563
まさにその記事に
あなたがGoFのファンであるなら、これは実際Strategyパターンなのです。 依存性注入は(私の見るところ)基本的にひとまとめに使われるStrategyパターンです。
って書いてあるんだけど、どういうことです?? DI=ストラテジーパターンを使ってアプリケーションの依存性を一箇所にまとめる
って意味かと思ってた。別にDIコンテナ使ってもいいけど、俺使ったことないしな >>567
無駄な争いが繰り返されるから、メリットを説明するためにデメリット固めたいってずっと言ってんだろ
それなのに>>454をスルーしてるのはお前だろ? >>568
え?メリットが説明できないようなゴミのデメリット探して何がしたいのかわからない
デメリットが無いから利点しかないとか言い出す気?
もうそんなこと言い出したらプログラマっていうか技術者引退を考えたほうがいいよ >>568
メリットが説明できない技術を適用しようとしてるならお前もう死ね
救いようがないゴミ 人類にとってもお前がこれ以上地球にいても何の役にも立たないだろ とりあえずコイツは無視して
DIの定義から固めなければ話が進まない
>>564-566の回答誰かよろしく マーチンファウラー自体が意味のない技術をでっち上げて金を取る詐欺師じゃん
これまでの経歴がそう
これからの経歴もコイツの芸風がそうだから変わらないだろうな
コイツがいいと言っている技術はおそらくゴミ >>574
UMLやエクストリームプログラミング、アジャイルの人だな 外的コントロールによるプログラミングか
内的コントロールによるプログラミングか
の違いに思えてきた。
ほとんどの人間が「作れ!」と外的コントロールによってシステムを作る。
この場合、アジャイルも疎結合も、再利用性も意味がない。だって作れと言われたものを作るのがゴールなんだもん。
しかし、内的コントロールでプログラムしてるやつは「世の中にはこんなシステムが必要だ」とか
よくよく考えてみたら、この方法は良くない。とか、言われてやるんじゃなくて
自分のやってることがどのように繋がるか考えてやってるわけで、
安定した給料で働けばいいって思考してないわけだよ。失敗したらリスクが伴うわけだ。
だからDIによって得られるアプリケーションの柔軟性は、自分で行動してるやつには価値があり
言われるがままやってるやつには無価値なものとなる
...のかなあ??自分でも変なこと言ってるなとか思うけど >>580
コイツが外的コントロールによってプログラミングしてることが証明された件 外的コントロールでも最初に決まったものを作るだけでいいなんて所あるのか?
完璧な設計書なんて見たことない >>582
もちろん、そんな白黒した話ではないさ
でも、まとまったストラテジー(もうDIっていうとアンチ湧くからなるべく言わない)が
アプリケーションに柔軟性を持たせられるのは事実だし
そんな柔軟性イラネってプロジェクトがあるのも事実だろう DI(コンテナ)のメリットねぇ...
DBがあって、サーバーがあって、クライアント(当時流行ってたRIA)があって、クライアントとサーバーはRPCで通信して...
そんな業務システムを作るとき、役に立ったと思う
なお、リーダーとフレームワーク担当以外は、低スキル低コミュ力のSESガイジ部隊
サービスクラス、ロジッククラス、Daoクラス、状態を持たないこれらは、DIコンテナでシングルトンな物としてインジェクション。
・トランザクション管理、RPC公開なんかを、AOPのインターセプタに任せる事ができる
・new の手間やライフサイクル管理が省ける
本番、ステージング、開発など、環境別に定義が必要な物は外からインジェクション
・DB接続設定とか
・他所の会社のWebインターフェース呼び出し
品質は良いとは言えないけど、厄介な要素をDIコンテナで切り出したからそこそこ均質。
なんとかサービスインできて、保守もできてる。
それが10年くらい前の話で、今もっと良い解決策があるのかはわからない。
状態の無いサービスクラスと振る舞いの無いDto、これらをオブジェクト指向と呼んで良いかはわからない。 >>585
もはや、だまれしか言わねぇw
DIアンチってガイジなの??ww >>586
>>379
>>550
DIアンチなんてこの程度です >>587
せやなぁ
考える力失ったプログラマとかマジで害虫すぎィ
自分のとこには来ないよう塩まいとく必要あるかもしれない >>584
手続き型プログラミングにDIを足したみたいな 無能に工夫されても大弱りなんだがな、引き継がされた人が >>590
ほんとそれだよなあ
DIを無闇矢鱈に避ける工夫とか、ほんと迷惑だからやめてほしい >>584
久々に有益なレスが来て俺は感動しているよ >>589
まさにそれです...
結局、目先の問題をどう「オブジェクト指向」して良いかわからないんだよね
いつまでも手続きをダラダラ書いてるよ... >>592
君にはそのレスからDIのメリットが見えたのかい?
病院に行くことをオススメするよ >>594
なにいってんの?
お前の「黙れ!」よりよっぽど有益だって話ししてんだよ >>551
DOMはメソッド定義されているけど、だから何? >>564
ちゃんと引用しよう
> DIコードの例を示した後に、Kohari氏はDIが
> 本当は何であるか(source)について詳しく述べている。
>
> あなたがGoFのファンであるなら、これは実際Strategyパターンなのです。
> 依存性注入は(私の見るところ)基本的にひとまとめに使われるStrategyパターンです。
お前がDIって呼んでいるものは
本当はストラテジーパターンである。と書いてある
今度からストラテジーパターンと呼ぼうw
そして「基本的にひとまとめに使われるStrategyパターン」と書いてある
そう、ひとまとめ(原文では en masse)に使われるという条件つきのストラテジーパターン
(ひとまとめっていうのは、プログラム起動時にひとまとめに行われその後変更しないということ) つーか、今まで出かけてたんだよw
とりあえず>>601の内容でレスしたが
あとどれに対してレスしてほしい? >>601
そのあと変更されないってどういうこと? >>583
> でも、まとまったストラテジー(もうDIっていうとアンチ湧くからなるべく言わない)が
それがいい、本当はストラテジーパターンと呼ぶべき
で、ストラテジーパターンは戦略を切り替えたい時に使うパターン
戦略を切り替える予定はないけど、もしかしたら切り替えたくなるかもしれないじゃない?
だから予めストラテジーパターンを使っておこうよ!
といえば、それが良くないことが理解できるだろう。つまりYAGNI >>603
依存関係をコードではなくXML形式の設定ファイルから
読み込むことを想像してみたらわかると思う
(実際多くのDIコンテナはXMLファイルに依存関係を定義する)
1つのXMLファイルでアプリケーション全ての依存関係を定義する。(実際にそうなってる)
そして依存関係を定義したXMLファイルを読み込むのは1回だけ。
その後はプログラムが起動している間は依存関係の定義は変更しない >>604
なんかオブジェクト指向そのものを否定する話になってる気がするんだけど。
オブジェクト指向って、変更に柔軟に対応するためにクラスに抽出するプログラミングスタイルだろ??
100パーセント変更の無いものを想定するのはそりゃ過剰実装だけど、ストラテジーパターンを使った柔軟性くらいあってもよくね?
クラス内部で定義してるものを外に出すだけで、コード量がクソ複雑になったりしないし
やっぱり俺としては拡張に対して開ききってから閉じたほうが、柔軟性のあるアプリケーションが作れると感じてしまうわ >>606
何を言ってるのか分からんが、俺は最初から
ストラテジーパターンは問題なくて
DI(当然正しい用語の使い方のDI)はいらねって言ってる
>>53ぐらいのときから言ってるなw >>607
正しい用語の使い方のDIっておかしくね?
DIコンテナあってのDIみたいな主張じゃん
DI=まとまったストラテジー
だろう? ちなみにおれはDIを>>11から主張してるけどね!
ユニットテストとかDIコンテナとか言う奴は病気だって >>608
DI=まとまったストラテジー&DIコンテナ
誰がDIコンテナは含めないって言ったんだ? >>609
読んだら?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
>
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
>
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。 >>611
まあでもそれはProffittiさんはそう思うーって話でしょ?
それで、何故DI(まとまったストラテジー)が、いらない子なのかおれにはわからないので
この場で教えてもらいたいわけ。
で、DI嫌いな人がDIのメリットを上げられるわけもないので
まず、DIの欠点を一覧してくれって話しで、整理してたんじゃん。
>>454の続き再開したいんだけども > それで、何故DI(まとまったストラテジー)が、いらない子なのかおれにはわからないので
面倒くさいから。
まとまったストラテジーの「まとまった」の部分
private MutablePicoContainer configureContainer() {
MutablePicoContainer pico = new DefaultPicoContainer();
Parameter[] finderParams = {new ConstantParameter("movies1.txt")};
pico.registerComponentImplementation(MovieFinder.class, ColonMovieFinder.class, finderParams);
pico.registerComponentImplementation(MovieLister.class);
return pico;
} 多分わかってないのが、おれはDI(まとまったストラテジー)を好んでるけど
DIコンテナなんて作ったことも必要としたこともないからね
XMLを使ってアプリケーションの依存性を管理とかやりすぎだと思うし意味不明だわ
まあ、やったことないから知らんけど、その件はもうずっと>>2-11に書いてるのに
今更「おれの中でのDIはDIコンテナも含む」とか言われてもな... >>599
何が言いたいのかさっぱりわからん
俺が聞きたいのは、
DOMツリーはその名の通り木構造だし、
DOM操作用のメソッドが定義されているけど、
それを使ってDOMツリーにDOMオブジェクトを挿入するのはメソッドインジェクションなの?ってこと。 >>616
いやDOMオブジェクトのことをデータとかいい出すから >>540
その説明のポイントはどこなの?
何がdependencyで、何に対してinjectしてんの? >>617
えっ
DOMオブジェクトはデータじゃないの? >>618
DOMがdependencyで、Docmentオブジェクトにinjectしてる >>619
データじゃ無いだろ、オブジェクトだろ
え、オブジェクトはデータだよ?とかいうなよ
それいったら全てデータだから >>621
オブジェクトとデータを分けたいのはわかった。
俺の質問を修正するよ。
木構造にオブジェクトを挿入するのもメソッドインジェクションなの? >>622
appendChildって自身にしか備わってなかったっけ?
それならすまん
でも自身のクラス以外でDOMを引数に取るクラスとかあるでしょ domとか言い出すわかってないアホの登場でごちゃごちゃになった
明日また来るから沈静化しとけよ >>623
やっぱり何が言いたいのかわからない。
appendChildはメソッドインジェクションなの?
違うの?
木構造なんだから各ノードは別のノードを挿入するメソッドを持っているよ。
appendChildはどのDOMオブジェクトも持っている。
DOMオブジェクトを引数に取るオブジェクトもある。 インジェクションされたほうはインターフェースを実装したオブジェクトが
何であるかを気にせずに使う事ができるというだけの話だと思うんだが appendChildは、DOMの振る舞いを変えるために呼び出すのか?
→DOMが表現しているデータを操作する(子を追加する)ために呼び出すんだよね
appendChildをprivateにして、DOMのコンストラクタ内でappendChildすると、DOMは成り立つか?
→成り立たないよね
なぜDOMの話になったのか知らないけど、appendChildはストラテジーパターンの目的からは違うと思うよ
DIの話はぐちゃぐちゃで良く分からんが、やっぱ違うじゃないの >>625
> appendChildはメソッドインジェクションなの?
> 違うの?
どう見ても違うだろ・・・
appendChildはただのメソッドだし
DOMは複数のデザインパターンが使われてるが
お前が言いたいのは、Compositeデザインパターンだろ?
https://ja.wikipedia.org/wiki/Composite_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 >>615
> 多分わかってないのが、おれはDI(まとまったストラテジー)を好んでるけど
> DIコンテナなんて作ったことも必要としたこともないからね
お前がオレオレ用語としてDIを使ってるだけだな
DIの解説記事でDIコンテナに触れてないものがあるなら
教えてほしいぐらいだ
DIっていうのは「コンストラクタでオブジェクトを渡す」ことを
専門用語で言った言葉ではなくて、パターン名
DIパターンには必ずDIコンテナがでてくる オブジェクト指向を分かりやすく例えて教えようとすると話がまとまらない事だけはわかった DIコンテナもつかわず、依存関係も静的に決まらないオレオレDIって
それ単なるグローバル変数じゃん馬鹿なの? 相手を罵倒するためだけの人って生きてて楽しいのかな? お前ら>>584みたいにシングルトン、ステートレスなオブジェクトをDIすることが多い? >>625
>>627
>>628
全面的にすまんかった。
ただ、DOMを引数に取るクラスのメソッドやコンストラクタにインジェクションしたらDIなのでは? インジェクションおじさん
インジェクションという用語がカッコイイと
なんでもかんでもインジェクションという永遠の厨二病
関数にオブジェクトをインジェクション!
はがきをポストにインジェクション!
車庫に車をインジェクション!
などとよくわからない使い方をする
だが童貞のためエロネタとしては使わない
※ DI用語のインジェクションとは一切関係ありません オブジェクト指向はこんな不毛な争いを生むことは理解した >>642
理解の仕方がずれとるからいつまでたってもバカやねんw
正しくは「バカはいつも不毛な争いばかりしておる」やぞwww 比喩で教えて欲しいなら「喩えて」じゃないの?
それとも例示で理解できるの? >>646
例示ってclass Dogとかでしょ? >>648
その例だと汎化と特化、分解と集約、インスタンス化について教えるのは難しいんじゃないかなあ。 >>651
一つの例で全てを説明する必要はないんやで
DIの話に戻すと
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Kohari氏はのちのポストで、 DIはスケールしないというProffitt氏の元々の
> 主張(source)に対し、フレームワークを使う重要性を再度述べて返答している。
>
> 現実世界のシナリオでは、手動で行う依存性注入はただ単にスケールしないのです。
これも重要な所
フレームワークを使わないでDIをやっていますって主張をみたら
それはすごく小さなプロジェクトだと思ったほうが良い こんなとこで否定して俺が正しいやっててもスキル上がらんよ >>655
なぜ小さなプロジェクトかというと、スケールしないことに気づいてないから。
DIはコンテナを使ってようやく実用レベルになる
(俺に言わせればそれでも面倒なんだが) ■ このスレッドは過去ログ倉庫に格納されています