オブジェクト指向と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/ DI不要派はどんな物を作るケースを想定してるの?
HelloWordやfibなら、DI不要には賛成だけど マイクロサービスで作ってるけど?
DI推奨派は各々のマイクロサービスが各自で生成するインスタンスを決めるんじゃなくて
どこか一箇所にまとめておくべきって言ってるんだよね?アホすぎw >>377
お前はDIを否定するな。関係ない話だ。
DIの使えなさは、マイクロサービスとは関係ない ドカタしかいない場所でマイクロサービスとか言い出したら
嫉妬で狂いそうな子が沢山出ちゃうから止めよう >>376
どんな規模でも他プロジェクトのメインを使い回すなんて新規プロジェクトは無いだろ。 >>381
今話をしてるのはmainの中のコードではなく、
(mainで書いていることにしている)
オブジェクトの依存関係の定義の話やで?
まあ「DIを採用したプロジェクト」では一般的に
mainで依存関係を定義したりしないがな。
そのDIフレームワークのやり方で定義するので
それでだ、プロジェクトの依存関係全体が全く同じになることはないが
局所的に見た場合、あるオブジェクトに対する依存関係は
だいたい同じになるわけで、オブジェクトが
使いまわしできるならば依存関係も同じになるはずだ >>382
DIじゃなければそもそも依存関係をいちいち記述し直す必要もない箇所の話?
それこそDIのメリットって何? >>381
「メインを使いまわす」の意味が分からない
具体的にどういうこと? DI使わん派ってどうやって分業してんの?
リポジトリの実装タスクが終わるまでドメインサービスの実装タスクはストップ? >>385
へ? DI使っていても、ダミーのオブジェクト作って作るんだろう?
同じやり方でいいじゃん え?
じゃあ本実装が出来上がったらダミーは用済みなの? >>387
残したければ残せば?
でもダミーオブジェクトを使ったらテストに通りますが
本実装を使ったらテストには通りません
ってことがないなら、消しても問題ないでしょ? え?
開発用サーバーが障害でたら本実装コードをダミー実装に書き換えて作業するの? >>389
そこまで馬鹿だとはw
テスト用サーバーで作業するに決まってるだろw テスト用サーバーと書いてしまったが、
開発用サーバーやステージングサーバーもありだな。
ようは本番用サーバーでやらなければいい >>390
え?
テスト用サーバーやステージングサーバーに迷惑かけるの?
ネットワーク死んだらどうするの?
遊びじゃないんだよ? ローカルにテスト用サーバーやステージングサーバー立てればいいだけだろ?
てか普段どうやって開発してるんだよw
まさか、みんなでサーバーを共有してんのか?
迷惑かけたらどうするんだよw
ネットワーク死んだらどうするの?w テスト・ステージング用サーバに繋いでデータを書き換える迷惑な人が後を絶たないから開発者を重要なサーバーから隔離するのが現代のシステム開発の定石になってる その定石だと、なにをやっても迷惑はかからない
だからDIとは関係ない話だな >>393
え?
そんなリソースの余裕あるとは限らないよ?
DI使えばサーバーもネットワークもリソースも気にしなくていいのになあ >>397
サーバー立て直せば?
っていうか、開発サーバー使わずに作っても
動くことは保証できないよ。
なぜかって?いやアホかお前
例えば開発サーバーのバージョンが変わったとき
同じように動くと思ってんの?
そう思うなら、サーバーのバージョン
気軽に上げてみやがれってんだ
実機と同じものを使わないと動くことなんて保証できないんだが ローカルサーバーを使うとなるとそこそこスペック必要だよな
派遣にはIDEとエクセルが動く最低限のスペックしか貸し出さないからローカルサーバーなんて動かせんよ >>398
DIしていれば簡単に実装を切り替えて作業ができる >>400
真の問題はマシンスペック不足ということですね。
はい、次 >>401
DIしなくても簡単に実装を切り替えられるだろ
そういうのもわからないのは
本当に馬鹿なんだなぁって思う >>399
サーバー直すまで待ってるの?
結合テストは他にやるに決まってるでしょ?
まさか君の会社はユニットテストやったら結合テストやらんの?
それはちょっと非常識すぎないかね? 実装を簡単に切り替えられるが、
それはそれとして、本番で使わないものを使ってテストしても
本番で使うもので正しく動くとは限らないぞ >>402
次はネットワーク障害
本実装コードしかないと対応大変よ? >>404
> サーバー直すまで待ってるの?
サーバーなんて一瞬で作れるじゃん
Dockerとか知らないの? >>407
ローカルでサーバー建ててテストするんで関係ないなw >>406
もちろんいずれ本実装で結合したものを使ってテストを行う
でもそれまでは別に本実装で結合したまま開発する必要は全くない
本実装で結合したままだとインフラの影響を受けるから開発の邪魔になる >>410
はい、だからDI使わなくても、
それを使えばいいだけの話ですね >>408
どの現場でもDockerをインストールできると思ってるの?
開発者がDockerインストールして自由にコンテナ動かせるなんてセキュリティ意識の低いWeb系かよほど強い政治力もった開発者じゃないとね >>412
本当の問題がわかってきたかい?
お前の環境が悪いんだよ >>409
取引企業「セキュリティ上の都合で許可しませーんwww」 >>414
技術の問題と、お前の会社の問題を
区別してくれない?
そのうち、お前
「パソコンはウイルスに感染するから許可しませーんwww」
とか言いそうだから >>416
? DIを使って切り替えするのって、クラス名を変更するだろ?
DI使わなくても、クラス名を変更するだけだろ?
どちらも同じなんだが >>413
そう
環境は自由にならない
なので設計で対処する
そのためのDI
DI要らんとか言ってる子はいままで運が良かっただけ >>416
話をすり替えるな。
DIを使わなくても同じことはできると言ってる
DIを使ってコードを複雑にして理解を困難にしてまで
やることじゃない >>415
技術とビジネスは表裏一体
ビジネスの都合が何も無いと考えるのは子供だけ
ホビーの世界なら何の制約もなく(金という制約があるが)環境を選べるだろう
しかしビジネスの世界はそうではないのだ >>421
ならDIを使わないほうがいいな。
DIを使うとメモリを食うんだ >>417
変えんよ?
ありがちなパターンだと環境変数とか設定ファイルをちょっと変えるだけ
それで開発用のDIとテスト用のDI、ステージング用のDI、本番用のDIが切り替わる データベースサーバー作る代わりに
データベースサーバーのモックを作るほうが
コストかかるだろw >>419
いやいや
DIを使わないとめんどくさくなるよ
君は使ったことないからわからないんでしょ? >>423
> 変えんよ?
> ありがちなパターンだと環境変数とか設定ファイルをちょっと変えるだけ
変えんよ→変えるだけ
笑うところかな?w
> それで開発用のDIとテスト用のDI、ステージング用のDI、本番用のDIが切り替わる
private hoge = is本番 ? new Hoge() : new HogeTest()
これだけの話をしていたわけねw >>422
サービス起動する方がメモリ食う
>>424
そうでもない
例えばリポジトリをサーバー用の実装からローカルSQLite用の実装に変えるのは比較的容易(設計がマトモなら) > 例えばリポジトリをサーバー用の実装からローカルSQLite用の実装に変えるのは比較的容易(設計がマトモなら)
SQLの文法違うんですが? >>426
君「クラス名変わるだろ」
僕「変わらんよ」
僕「クラス名じゃなく設定が変わるだけ」
君「クラス名変わっとるやん。笑うとこかな」どやーん
笑っちゃったごめん
>>428
今時のFWはSQL書かんし
どうしてもマニュアルで書きたい時もビルダーパターン挟むんで文法の差異は吸収されるんすわ
なんか連投規制うっといからそろそろ消えるわ
DIの炎上学習法、頑張ってや!バイバイ! >>429
・・・あぁ、設定を変えることで
使用するクラス名を変えてるってことに、
自分で気づいてないのか。
ちょっと可愛そうになった > なんか連投規制うっといからそろそろ消えるわ
それはお前が連投しているだけだろw
必死すぎの証 結局またDIのメリットも言えずにトンズラか
いつものパターンだな >432
プログラマなら自分で考えろよそんくらい…
DIなんてただの道具やテクニックなんだから、適用できるケース、使いこなすための知識や技術、効果の得られる規模、そういった物がプロダクトとチームにマッチして初めて使えるわけじゃん。
自分達に必要無いならそれはそれでOK。
ただ、お前よりよっぽど頭の良いセンセイ達が、何かしらの問題を解決するために作り上げて、世界でそれなりに使われてる存在なんだから、もうちょっと謙虚に学んでみれば? つか、スタブや別クラス使ってテストするのは単体テストまでだろ?
以降は物理的もしくは論理的に隔離された完全同一環境でテストするだろ。 >>433
お前まだ理解してないのか?
DIを使うとコードが複雑化する上に、DIで解決できるとされるものは
DIを使わなくても解決できるんって話なんだが それが理想だけどそうもいかない部分もあるよ
システム外に影響でちゃう所とか
他所のサービスAPIでテスト契約が限られてたり
メールやSMSが変なところに飛ばないようにしたり
帳票にサンプルマーク出るようにしたり >>436
>DIを使うとコードが複雑化する
これはわからん
もしかしてフレームワークやライブラリのコードを足してる?
>DIを使わなくても解決できる
まあわかる
江戸時代の人は新幹線使わずに京都へ行ったし
原始の人はスマホ無くても生きてけた >>438
>>DIを使わなくても解決できる
>まあわかる
>江戸時代の人は新幹線使わずに京都へ行ったし
>原始の人はスマホ無くても生きてけた
どう考えても、DIが出てきて以降の技術(Dockerとかね)に
ついてこれずに古臭いやり方に固執してるのがDI派なんだが...w DockerがDIを置き換えるってこと?
そこは勉強不足だったわ >>438
> >DIを使うとコードが複雑化する
> これはわからん
マイクロソフトがそう言っている
https://msdn.microsoft.com/ja-jp/library/ff921152.aspx
> デメリット
> 依存関係の挿入パターンには、次のようなデメリットがあります。
>
> 管理するソリューション要素が増える。
> オブジェクトを初期化する前に、依存関係の挿入フレームワークがオブジェクトに必要な依存関係を解決できることを確認する必要がある。
> ソース コードの複雑さが増し、理解が困難になる。 >>440
DockerがDIを置き換えるわけじゃないぞ?
モックなどの偽物を使ってテストするということは
それで動いたとしても、それは偽物を使って正しく動くことを
証明しただけで、本物を使った場合に正しく動く証明にはならない
できる限り本物を使ってテストするのが良いということだ
特にデータベースなんかは、十分な品質の偽物を難しいので
素直に単体テストの段階から本物を使ったほうがいい
Railsなんかもそれが基本となっている あぁ、でDockerを使うのは、
その本物のデータベースサーバーなどを
すぐに用意できるって話ね DIとDockerじゃ全く関心ごとが違う。同時に使用できる
DIはアプリサービス層やドメイン層からインフラ層を分離して疎結合にする仕組み
ちゃんと契約プログラミングしてれば、アプリサービス層やドメイン層のテストには本物のDB使う必要なんか別にない
データベース使うインフラ層は本物のDB使ってテストしないといけない
テスト時だけ起動する使い捨てのDBはDocker使ったらいい > ちゃんと契約プログラミングしてれば、アプリサービス層やドメイン層のテストには本物のDB使う必要なんか別にない
それは偽物のDBが本物のDBと同じように動くことが担保できていることが条件
でないと、いくら偽物のDBを使って動くことを保証しても
本物のDBで動くことの保証にはならない
偽物のDBが本物と同じようになればいいと思うが、
そのために時間と偽物のDBのテストが必要になる ほぼ9割ぐらいはDIなんか使わないで普通のインターフェースで事足りないか そう、俺もDIなんていらないと思うんだけどね。
どうしてもDIパターンでなければだめだって思ってる人がいるようだ
挙句の果てに何でもかんでもインジェクションといって
これもDIなんだって嘘をつく DIが疎結合だって?あはは、ご冗談を。
テンプレートでも使ってどんなクラスでも取り込んじゃうならそう言ってもいいけどさ。 このスレのDI否定厨は、ストラテジーパターンも意味ないと思ってる人たちなの? いらないのはDIパターンであってストラテジーではない
DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン
ストラテジーパターンを使うときは、そうしなければいけないという
目的が最初にあって使うものだが、DIはその目的がない DIなんていらない。
バージョンに合わせるほうが苦労する。
プログラマなら自分で作ったほうが速い。 なんか400ぐらいからDIと関係ない開発環境の話が出てきてるので。
・特殊なセキュリティの案件を主体の開発会社でなければ、ローカルVMは当たり前。vagrantでもdockerでもなんでもok。そもそもセキュリティ厳しかったらネットが隔離される
・i5第3世代以降+メモリ8GB有れば十分なスペックなのにそれすら満たせない開発PCしかない会社は、根本的に開発する気がない。人を雇うよりまずPCを買い直すべき
・VMツールのインストール禁止は聞いたことがない(申請制は良くある)。セキュリティ的に考えても、オンプレ開発サーバに接続するよりミニマムだから、適切に申請すれば必ず通る。
んで、これが出来ないからDIってのはだいぶ暴論だしそもそも飛躍しすぎかな。 セロリン メモリ2G 14インチデスプレー ボール型マウス
IE8 派遣社員はネット接続不可 全てのフロア、トイレの前に監視カメラ
by 金融系案件請負系の某会社 金が良くなかったらPC変えられないのがわかった時点で転職活動開始だな... Docker知ってる人殆どいなかった弊社
転職したいけどコミュ障だから面接がこわい docker for windowsきどうしたらメモリが足りないって言われた
i5, 8Gは貴族階級の戯言だわ >>462
適当に買っても6万ちょいなんですがそれは... class Foo {
private Bar b = new Bar();
public void aaa() => b.Method();
}
class Bar {
public void Method() {
if (ENV.IsDev) ...;
else ...;
}
}
使う側は何も考えずnewすりゃいい
実装を切り替えたければ使われる側が透過的に対応すればいいだけ
interfaceもDIも不要 流石に通常のコードとdebug用コードが高頻度に混在してたら消せよバカって思いたくなるし、
根本的にモックと差し替えるのを素直に表現できん 某メーカーの仕事した事あるけど、歴代の機種の差分が全部#ifdefで括られてたぞ。
実コード半分以下の超大作が何本も…。 >>467
その話の結論は、機種ごとにファイルに分けろで終わるので
ぶっちゃけどうでもいい >>466
ここで書くことじゃないけど
デバッグコードとログコードの違いを知らないやつが多いんですわ
まあ、ログ機能をデバッグに使えてしまうし、
ログレベルにdebugとかあるから勘違いしやすいんですが
デバッグコードっていうのは開発時のデバッグに
一時的に入れて最終的には消すもの。だから最終的残ってるのはおかしい
ログっていうのは製品版でもそのまま使われるコードで機能の一つ
適当に入れるものじゃないし、これはコードと混在させるしかない
混在させると言っても、 log(ERROR, 'メッセージ'); みたいな感じで一行になってる
if(DEBUG_MODE) printf('メッセージ')みたいな条件文があったらおかしい
ちなみにDIを使えばログを入れられると思うかもしれないが、
インターフェースの関数呼び出しのログしか出力できない
コードの途中のログは出せないし、ログレベルごとに出力内容を
変えるときには使えない(複雑になりすぎる)
本質的にはログはモジュールの機能の一つなのでDIで入れるべきものではないんだ
かといってデバッグのために使えるかと言うと・・・
素直にデバッガの関数呼び出しのトレース機能を使ったほうが良いかな Logじゃなくてグローバルイベントにして
依存してないものをもたせちゃだめh そうするとグローバルイベントを発生させる
オブジェクトに依存するんだけどなw
Logger.log(ERROR, 'メッセージ');
が
Event.raise('log', ERROR, 'メッセージ');
になるだけというw JavaScriptだとconsole.logがどこからでも使えるように、
ログ出力機能っていうのは、言語の基本ライブラリ
(デフォルトでimportされるライブラリ)
として使えるべきなんだよな
そうなってないからDIでインジェクションとかするはめになる ログに関しては収集解析するサービスもセットだよね
なのでメインの開発者と実行時にできるだけ負荷かからないシンプルな構成でいい
となるとインジェクションは選択肢から消える >>468
そんな事したら似たようなソースファイルが沢山出来て管理出来なくなるじゃん。 >>474
同じところがあるならまとめればいい
違う所だけ抜き出してファイルに分けろと 国内のシステムはオブジェクト指向もDIもいらない
オブジェクト指向とDIは画面とエンティティとテーブルに綺麗な対応関係があるって前提からスタートしてるから現実の世界では役に立たない
非正規型のデータウェアハウスみたいなDB、あらゆるところからあらゆるデータにアクセスする複雑怪奇なな業務ルール、多数のエンティティをバラバラに引き裂いて混ぜ合わせたようなぐちゃぐちゃな画面要求
こういうシステムは人海戦術で複雑なSQLとhtmlを書きまくってダイレクトに結合させるほうがうまくいく ■ このスレッドは過去ログ倉庫に格納されています