わかり易い例
class Dog extends Animal
class Cat extends Animal
オブジェクト指向とは 分かりやすく教えてくれ
https://medaka.5ch.net/test/read.cgi/prog/1521869966/
探検
オブジェクト指向を分かりやすく例えて教えてくれ 2
レス数が1000を超えています。これ以上書き込みはできません。
2018/05/07(月) 11:31:42.02
2018/05/07(月) 12:17:46.61
>>961
次スレ立てるのはいいけどアンチパターンを>>1に書くのは、ほんとにやめて。
オブジェクト指向を考えるときに動物を持ち出してはならない。
何故なら、プログラミングは人によるものづくりであり、動物は神によって作られた代物で人間によって作られたものでは無いからだ。
だから、オブジェクト指向に動物を持ち出すと、オブジェクト指向が余計にわからなくなる問題が起こってしまう。
オブジェクト指向の基本は、車とか自転車のように作りたいオブジェクトをパーツを組み合わせて作り上げるのが基本だ。
そして、オブジェクト指向でそれを実現するにはコンポジションを使う。
このことを知らない、動物に惑わされたプログラマは、クラスが別のクラスの機能を使う手段として継承を選択する過ちを犯す。
コンポジションとは、オブジェクトが必要とするパーツをオブジェクトに装着することであり、これは自転車のフレームにタイヤをつけて自転車が完成することととてもよく似ている。
しかし、動物で同じようなことを考えると、動物のお腹にメスを入れて胃袋を取り替えるといった奇妙な発想をすることになり、コンポジションというオブジェクト指向に必須と言える概念が、見えなくなってしまうのだ。
よって、オブジェクト指向の世界に動物を持ち出してはならない。
次スレ立てるのはいいけどアンチパターンを>>1に書くのは、ほんとにやめて。
オブジェクト指向を考えるときに動物を持ち出してはならない。
何故なら、プログラミングは人によるものづくりであり、動物は神によって作られた代物で人間によって作られたものでは無いからだ。
だから、オブジェクト指向に動物を持ち出すと、オブジェクト指向が余計にわからなくなる問題が起こってしまう。
オブジェクト指向の基本は、車とか自転車のように作りたいオブジェクトをパーツを組み合わせて作り上げるのが基本だ。
そして、オブジェクト指向でそれを実現するにはコンポジションを使う。
このことを知らない、動物に惑わされたプログラマは、クラスが別のクラスの機能を使う手段として継承を選択する過ちを犯す。
コンポジションとは、オブジェクトが必要とするパーツをオブジェクトに装着することであり、これは自転車のフレームにタイヤをつけて自転車が完成することととてもよく似ている。
しかし、動物で同じようなことを考えると、動物のお腹にメスを入れて胃袋を取り替えるといった奇妙な発想をすることになり、コンポジションというオブジェクト指向に必須と言える概念が、見えなくなってしまうのだ。
よって、オブジェクト指向の世界に動物を持ち出してはならない。
2018/05/07(月) 12:35:38.47
例えば車というobjectにはタイヤというobjectを着けることが出来る
ね、簡単でしょう
ね、簡単でしょう
2018/05/07(月) 12:39:40.98
例えば猫objectと犬objectを作ってワンワンニャーニャー鳴かせるのがオブジェクト指向
ね、簡単でしょ
ね、簡単でしょ
2018/05/07(月) 12:51:07.28
>>5
オブジェクト指向で、継承を利用して犬猫をワンワンニャーニャー言わせると言う話はよく聞く。
しかし、継承を使わなくとも、自転車にタイヤを装着するように、ヌイグルミにスピーカーを装着する作り方がある。
もちろん、ワンと鳴るスピーカーを取り付ければ、犬のようにワンと鳴き、ニャーと鳴るスピーカーを取り付ければ猫のようにニャーと鳴くのだ。
つまり、クラスが別のクラスの機能を使う手段は「継承」と「コンポジション」があり、コンポジションの方が頻繁に使われる。
この使い分けを謝るとオブジェクト指向はあなたに牙を剥くだろう。
オブジェクト指向で、継承を利用して犬猫をワンワンニャーニャー言わせると言う話はよく聞く。
しかし、継承を使わなくとも、自転車にタイヤを装着するように、ヌイグルミにスピーカーを装着する作り方がある。
もちろん、ワンと鳴るスピーカーを取り付ければ、犬のようにワンと鳴き、ニャーと鳴るスピーカーを取り付ければ猫のようにニャーと鳴くのだ。
つまり、クラスが別のクラスの機能を使う手段は「継承」と「コンポジション」があり、コンポジションの方が頻繁に使われる。
この使い分けを謝るとオブジェクト指向はあなたに牙を剥くだろう。
2018/05/07(月) 12:58:17.89
うちの開発はオブジェクト指向禁止手続き型オンリーだから関係ない
2018/05/07(月) 22:28:41.05
クラスが別のクラスを利用する方法にコンポジションがあり、継承より使える子であることは説明済みだ。
しかし、これからのスレの流れの中で、確実に混乱は繰り返されるだろう。
そこで、もう少し踏み込んでコンポジションについて解説しておこうと思う。
しかし、これからのスレの流れの中で、確実に混乱は繰り返されるだろう。
そこで、もう少し踏み込んでコンポジションについて解説しておこうと思う。
10仕様書無しさん
2018/05/07(月) 22:32:42.66 まず、コンポジションの方法には種類がある
1. クラス内部でnewして持たせる
2. メインでnewしてコンストラクタで渡す(コンストラクタインジェクション)
3. メインでnewしてメソッドで渡す(メソッドインジェクション)
この3つのうち、2と3を依存性の注入(Dependency injection、DI)と言う。
DIはクラスの疎結合性と柔軟性の両方が得られるため、プログラマにとても好まれる代物だ。
中でもとくに好まれるのは2のコンストラクタインジェクション
なぜなら、3のメソッドインジェクションは、オブジェクトが不完全な状態を一時的に許すことになってしまうからだ。
これは、タイヤの付いてない自転車の利用を一時的に許すことを考えてみればその危険性がわかる。
つまりまとめると、継承よりコンポジションが好まれ、またコンポジションの手段としてはコンストラクタインジェクションが特に好まれると言うわけだ。
1. クラス内部でnewして持たせる
2. メインでnewしてコンストラクタで渡す(コンストラクタインジェクション)
3. メインでnewしてメソッドで渡す(メソッドインジェクション)
この3つのうち、2と3を依存性の注入(Dependency injection、DI)と言う。
DIはクラスの疎結合性と柔軟性の両方が得られるため、プログラマにとても好まれる代物だ。
中でもとくに好まれるのは2のコンストラクタインジェクション
なぜなら、3のメソッドインジェクションは、オブジェクトが不完全な状態を一時的に許すことになってしまうからだ。
これは、タイヤの付いてない自転車の利用を一時的に許すことを考えてみればその危険性がわかる。
つまりまとめると、継承よりコンポジションが好まれ、またコンポジションの手段としてはコンストラクタインジェクションが特に好まれると言うわけだ。
11仕様書無しさん
2018/05/07(月) 22:43:48.82 そして、DIという言葉を出すと、必ずと言っていいほど「ユニットテスト」や「DIコンテナ」の話を出してくる人が現れる。
この人たちは、DIの本質を理解しておらず、DIをユニットテストを行う目的でしかたなく勉強してきた人たちだ。
そしてイケてると思い込んでいる疎結合性に欠けるプログラムを後から大量に書き換える必要が生まれ、DIトラウマになったのだ。
もちろん大量にコードを書き換えると、その後プログラムが安定するまでデバッグ地獄に落ちることは言うまでもない。
そのため、DIの話した時にユニットテストがどうこう言いだし、DIを拒絶する人を見かけたら
「DIの本質を理解せずに組んでしまったために、とても苦労した可哀想な人なんだな」と
温かい目で見守ってあげるようにしましょう!
この人たちは、DIの本質を理解しておらず、DIをユニットテストを行う目的でしかたなく勉強してきた人たちだ。
そしてイケてると思い込んでいる疎結合性に欠けるプログラムを後から大量に書き換える必要が生まれ、DIトラウマになったのだ。
もちろん大量にコードを書き換えると、その後プログラムが安定するまでデバッグ地獄に落ちることは言うまでもない。
そのため、DIの話した時にユニットテストがどうこう言いだし、DIを拒絶する人を見かけたら
「DIの本質を理解せずに組んでしまったために、とても苦労した可哀想な人なんだな」と
温かい目で見守ってあげるようにしましょう!
12仕様書無しさん
2018/05/07(月) 22:48:00.84 お前らの話は受け売りばかりで実体験が透けて見えないから面白くない
13仕様書無しさん
2018/05/07(月) 22:49:06.01 まず、コンポジションの方法には種類がある
1. クラス内部でnewして持たせる
2. メインでnewしてコンストラクタで渡す(コンストラクタインジェクション)
3. メインでnewしてメソッドで渡す(メソッドインジェクション)
この3つのうち、2と3を依存性の注入(Dependency injection、DI)と言う。
DIはクラスの疎結合性と柔軟性の両方が得られるため、プログラマにとても好まれる代物だ。
中でもとくに好まれるのは2のコンストラクタインジェクション
このコンストラクタインジェクションが使われてるライブラリは何かと聞いてくるやつがいる
だがそんなライブラリは存在しない。
なぜだ?なぜなんだ。矛盾してしまうではないか
1. クラス内部でnewして持たせる
2. メインでnewしてコンストラクタで渡す(コンストラクタインジェクション)
3. メインでnewしてメソッドで渡す(メソッドインジェクション)
この3つのうち、2と3を依存性の注入(Dependency injection、DI)と言う。
DIはクラスの疎結合性と柔軟性の両方が得られるため、プログラマにとても好まれる代物だ。
中でもとくに好まれるのは2のコンストラクタインジェクション
このコンストラクタインジェクションが使われてるライブラリは何かと聞いてくるやつがいる
だがそんなライブラリは存在しない。
なぜだ?なぜなんだ。矛盾してしまうではないか
14仕様書無しさん
2018/05/07(月) 22:52:53.0615仕様書無しさん
2018/05/07(月) 22:53:16.73 そもそもだ、メインでnewしてコンストラクタで渡すと言っても
渡すオブジェクトは決まっている。
なぜなら別のオブジェクトを渡したら、それはまったく
別の動きをするからだ。
DIがテスト以外で使える場合は限られていて、
処理に互換性がある場合のみだ。
例えば、ソースのアルゴリズムを変えても
ソートの結果は同じになる。処理のやり方が変わるだけで
結果が同じにならないかぎりDIで入れ替え可能になることはない
だからテストにしか使えないのだ
渡すオブジェクトは決まっている。
なぜなら別のオブジェクトを渡したら、それはまったく
別の動きをするからだ。
DIがテスト以外で使える場合は限られていて、
処理に互換性がある場合のみだ。
例えば、ソースのアルゴリズムを変えても
ソートの結果は同じになる。処理のやり方が変わるだけで
結果が同じにならないかぎりDIで入れ替え可能になることはない
だからテストにしか使えないのだ
16仕様書無しさん
2018/05/07(月) 22:56:29.85 オブジェクト指向の話はどこいったんやw
17仕様書無しさん
2018/05/07(月) 22:56:56.55 オブジェクト指向の欠点を補うものがDI
18仕様書無しさん
2018/05/07(月) 22:57:57.78 >>15
> なぜなら別のオブジェクトを渡したら、それはまったく
> 別の動きをするからだ。
何当たり前なこと言ってんの?
自転車のタイヤを取り替えて、何も変わらなかったら意味ないじゃん。
あなたが指摘してるそれはプログラムの柔軟性でありメリットなんですけど
> なぜなら別のオブジェクトを渡したら、それはまったく
> 別の動きをするからだ。
何当たり前なこと言ってんの?
自転車のタイヤを取り替えて、何も変わらなかったら意味ないじゃん。
あなたが指摘してるそれはプログラムの柔軟性でありメリットなんですけど
20仕様書無しさん
2018/05/07(月) 23:01:05.80 > 自転車のタイヤを取り替えて、何も変わらなかったら意味ないじゃん。
自転車のタイヤを取り替えても、車を走らせることには変わらない
つまりソートアルゴリズムの話と一緒。
アルゴリズムは違うが結果は同じになる
タイヤを取り替えてもなにも変わっていない
自転車のタイヤを取り替えても、車を走らせることには変わらない
つまりソートアルゴリズムの話と一緒。
アルゴリズムは違うが結果は同じになる
タイヤを取り替えてもなにも変わっていない
21仕様書無しさん
2018/05/07(月) 23:25:18.4622仕様書無しさん
2018/05/07(月) 23:29:05.34 >>19
プログラミング黎明期からのプログラミングの基本なんやけれどもw
プログラミング黎明期からのプログラミングの基本なんやけれどもw
24仕様書無しさん
2018/05/07(月) 23:32:48.17 >>21
レースゲームの車のパーツなんて
単なるデータの集まりだよw
グラフィックとあとは速度や曲がりやすさの
パラメータに対して補正がかかるだけ
レースゲームのパーツをいちいちオブジェクトにはしない
レースゲームの車のパーツなんて
単なるデータの集まりだよw
グラフィックとあとは速度や曲がりやすさの
パラメータに対して補正がかかるだけ
レースゲームのパーツをいちいちオブジェクトにはしない
28仕様書無しさん
2018/05/07(月) 23:49:20.68 >>24
仮に車のパーツがデータの集まりだったとしよう。
例えばスタッドレスタイヤを車に装着したとする。
スタッドレスタイヤには、おそらく摩擦力とか、大きさとか、重さとかのデータが含まれているだろう。
で、そのスタッドレスタイヤはデータしか持たないのでJSONで管理してましたと。
そのJSONを読み込んだ後、CarクラスにそれをそのままDIするわけ?そんなことしないよね。
car.changeWheel()メソッドに渡せるデータ型はWheelクラスとそのサブクラスだ
そうしなければ、タイヤ部分にバックミラーのJSON装着して悲惨なことになるよ??ww
仮に車のパーツがデータの集まりだったとしよう。
例えばスタッドレスタイヤを車に装着したとする。
スタッドレスタイヤには、おそらく摩擦力とか、大きさとか、重さとかのデータが含まれているだろう。
で、そのスタッドレスタイヤはデータしか持たないのでJSONで管理してましたと。
そのJSONを読み込んだ後、CarクラスにそれをそのままDIするわけ?そんなことしないよね。
car.changeWheel()メソッドに渡せるデータ型はWheelクラスとそのサブクラスだ
そうしなければ、タイヤ部分にバックミラーのJSON装着して悲惨なことになるよ??ww
29仕様書無しさん
2018/05/07(月) 23:53:16.7530仕様書無しさん
2018/05/07(月) 23:54:20.58 > そのJSONを読み込んだ後、CarクラスにそれをそのままDIするわけ?そんなことしないよね。
バカっぽい。DIって言葉を知って、なんでもDIって言ってるやつっぽい。
JSONってのも意味不明。これもJSONって言葉を最近知ったんだろうなw
単にデータを構造体でも何でもよくて普通に持たせて
メソッドの引数で渡せばいいだけ
(お前は引数渡しのことをDIって呼んでるなw)
> タイヤ部分にバックミラーのJSON
笑えば良いのか? 意味不明すぎる
バカっぽい。DIって言葉を知って、なんでもDIって言ってるやつっぽい。
JSONってのも意味不明。これもJSONって言葉を最近知ったんだろうなw
単にデータを構造体でも何でもよくて普通に持たせて
メソッドの引数で渡せばいいだけ
(お前は引数渡しのことをDIって呼んでるなw)
> タイヤ部分にバックミラーのJSON
笑えば良いのか? 意味不明すぎる
32仕様書無しさん
2018/05/07(月) 23:55:49.98 つーか、単なる引数渡しのことをDIって言ってたのか
話が通じないわけだw
話が通じないわけだw
33仕様書無しさん
2018/05/07(月) 23:59:10.89 >>30
なんでJSON最近知ったんだろうなとか、そういう低レベルな方法で返すの?
多分あなたが最近JSONを知ったんだろうけど、JSONが嫌ならCSVでもYamlでもなんでもいいよ。
それに、構造体にして外から注入してんならそれDIじゃんww
なんでJSON最近知ったんだろうなとか、そういう低レベルな方法で返すの?
多分あなたが最近JSONを知ったんだろうけど、JSONが嫌ならCSVでもYamlでもなんでもいいよ。
それに、構造体にして外から注入してんならそれDIじゃんww
36仕様書無しさん
2018/05/08(火) 00:04:57.57 この程度でパーツを全部クラスにするとか頭おかしいw
https://game-e.com/mario-kart-8/tire.php
https://game-e.com/mario-kart-8/tire.php
37仕様書無しさん
2018/05/08(火) 00:08:50.33 >>35
調べれば?
https://www.weblio.jp/content/D.I.?edc=BINIT
> DIとは、プログラミングにおけるデザインパターン(設計思想)の一種で、
> オブジェクトを成立させるために必要となるコードを実行時に
> 注入(Inject)してゆくという概念のことである。
この実行時っていうのが重要で、コードで静的に書いて
単にnewの引数渡しすることはDIじゃない
調べれば?
https://www.weblio.jp/content/D.I.?edc=BINIT
> DIとは、プログラミングにおけるデザインパターン(設計思想)の一種で、
> オブジェクトを成立させるために必要となるコードを実行時に
> 注入(Inject)してゆくという概念のことである。
この実行時っていうのが重要で、コードで静的に書いて
単にnewの引数渡しすることはDIじゃない
38仕様書無しさん
2018/05/08(火) 00:12:38.30 >>36
ゲーム作ったことないでしょ?
ゲームでオブジェクトを作る時、そのクラスはなんらかの描画モデルを継承することが多い。
例えばFlashであればMovieClipというクラスを継承して様々なオブジェクトを作る。
だからタイヤ自体はデータの集まりでも、プログラムに組み込んだ時はオブジェクトにして使うんだよバーカ
ゲーム作ったことないでしょ?
ゲームでオブジェクトを作る時、そのクラスはなんらかの描画モデルを継承することが多い。
例えばFlashであればMovieClipというクラスを継承して様々なオブジェクトを作る。
だからタイヤ自体はデータの集まりでも、プログラムに組み込んだ時はオブジェクトにして使うんだよバーカ
39仕様書無しさん
2018/05/08(火) 00:15:14.41 はい、継承は重要ですね
42仕様書無しさん
2018/05/08(火) 00:29:55.17 >>36
それに全部クラスにする必要はないからね?
今回の例ではそう言ったけど、Wheelクラスのコンストラクタの引数のバリエーションでカバーできるならWheelクラスのサブクラスは要らないよ?
でも考えてみ?もし、タイヤがパンクしたときに起こる演出や効果が
全てのタイヤで異なっていたら、全部サブクラスにする可能性は十分あるよ?
それに全部クラスにする必要はないからね?
今回の例ではそう言ったけど、Wheelクラスのコンストラクタの引数のバリエーションでカバーできるならWheelクラスのサブクラスは要らないよ?
でも考えてみ?もし、タイヤがパンクしたときに起こる演出や効果が
全てのタイヤで異なっていたら、全部サブクラスにする可能性は十分あるよ?
43仕様書無しさん
2018/05/08(火) 00:30:37.8244仕様書無しさん
2018/05/08(火) 00:32:55.1145仕様書無しさん
2018/05/08(火) 00:32:56.9547仕様書無しさん
2018/05/08(火) 00:35:26.13 ご存知あるなら説明初めて良いぞ。はいどうぞ
48仕様書無しさん
2018/05/08(火) 00:39:18.6949仕様書無しさん
2018/05/08(火) 00:40:10.66 パーティクル関数ですね。
50仕様書無しさん
2018/05/08(火) 00:53:28.27 >>49
ごめん話脱線しすぎた。
とりあえずパーツごとにクラスを大量に作ることはあるよ。
もちろん、コンストラクタに渡すデータを変えるだけで完結できるならサブクラスを大量に作る必要はない。
サブクラスを大量に作る必要が生まれるのは、サブクラス毎に異なるコードを書く必要性が生まれたときだろうね。
また、今は必要ないけど将来的にサブクラス特有のコードを書く可能性が高い時なんかは
ほとんど空っぽだけどサブクラスを大量に作る人もいるんじゃないかな?
そういう作り方は嫌いだけどね。
また、スクリプトの利用が許されるならサブクラス毎にコード書きたい場合でも
データにスクリプト書いてサブクラスをいらない子にするテクニックもある
ごめん話脱線しすぎた。
とりあえずパーツごとにクラスを大量に作ることはあるよ。
もちろん、コンストラクタに渡すデータを変えるだけで完結できるならサブクラスを大量に作る必要はない。
サブクラスを大量に作る必要が生まれるのは、サブクラス毎に異なるコードを書く必要性が生まれたときだろうね。
また、今は必要ないけど将来的にサブクラス特有のコードを書く可能性が高い時なんかは
ほとんど空っぽだけどサブクラスを大量に作る人もいるんじゃないかな?
そういう作り方は嫌いだけどね。
また、スクリプトの利用が許されるならサブクラス毎にコード書きたい場合でも
データにスクリプト書いてサブクラスをいらない子にするテクニックもある
52仕様書無しさん
2018/05/08(火) 01:29:57.87 実際バズワードだからなw
クラスの中でしか使わないものなら
クラスの中で生成すりゃいいんだよ。
もともとクラスの中でnewしてるものは
それ以外のクラスを使うことなんか想定してないんだから
そういうものをわざわざコンストラクタで渡す?
なぜ? テスト以外考えられない
クラスの中でしか使わないものなら
クラスの中で生成すりゃいいんだよ。
もともとクラスの中でnewしてるものは
それ以外のクラスを使うことなんか想定してないんだから
そういうものをわざわざコンストラクタで渡す?
なぜ? テスト以外考えられない
53仕様書無しさん
2018/05/08(火) 01:31:46.28 もちろんアルゴリズムを入れ替え可能にしたいのであれば、
ストラテジーパターンを使えばいい。
DIじゃない、ストラテジーパターン
DIはテストのために全てのクラスに
ストラテジーパターンを適用するとかいう
愚かな行為
本来は不要な過剰な設計
ストラテジーパターンを使えばいい。
DIじゃない、ストラテジーパターン
DIはテストのために全てのクラスに
ストラテジーパターンを適用するとかいう
愚かな行為
本来は不要な過剰な設計
54仕様書無しさん
2018/05/08(火) 01:43:45.64 テストのためだけじゃねーよカス
55仕様書無しさん
2018/05/08(火) 01:44:17.79 DI理解できずに発狂してるだけ
56仕様書無しさん
2018/05/08(火) 01:57:50.46 今はDIしなくてもモックでオブジェクトの挙動をテスト向けに変更できるから、無駄にDIしなくなってきたね
DIはほぼユニットテストのために使われてたようなもんだってことだよ
DIはほぼユニットテストのために使われてたようなもんだってことだよ
57仕様書無しさん
2018/05/08(火) 02:13:18.56 クラスの中で別のクラスをnewしてます。
それをコンストラクタのnewで渡すようにすることでー
することで?
テストではなくー
テストではなく?
別のクラスに入れ替え可能にー
いや、別のクラスに入れ替えることなんて無いから
大抵の場合、別のクラスに入れ替えることなんて無いんだよな
それをコンストラクタのnewで渡すようにすることでー
することで?
テストではなくー
テストではなく?
別のクラスに入れ替え可能にー
いや、別のクラスに入れ替えることなんて無いから
大抵の場合、別のクラスに入れ替えることなんて無いんだよな
58仕様書無しさん
2018/05/08(火) 02:36:46.86 もう少しわかりやすく説明してやるか。
そもそもDIってのはクラス内部でnewしているものを外から渡すという話だ
もともとクラス内部でnewしていれば十分だった。これが重要な所
システム上クラスを入れ替え可能にしたいなら
最初からストラテジーパターンなりを使っていたはずだ
つまりもともとクラス内部でnewしていれば十分だった場所は
もともと入れ替え可能にする理由なんて無い場所ってことだ
そこに理由をつけるならばテスト以外ありえない
テストのために不合理な設計変更を押し付けられ、
コードが不必要に複雑になる
内部で隠蔽されていたはずのクラスを、外に持ち出す必要が出てくる
そもそもDIってのはクラス内部でnewしているものを外から渡すという話だ
もともとクラス内部でnewしていれば十分だった。これが重要な所
システム上クラスを入れ替え可能にしたいなら
最初からストラテジーパターンなりを使っていたはずだ
つまりもともとクラス内部でnewしていれば十分だった場所は
もともと入れ替え可能にする理由なんて無い場所ってことだ
そこに理由をつけるならばテスト以外ありえない
テストのために不合理な設計変更を押し付けられ、
コードが不必要に複雑になる
内部で隠蔽されていたはずのクラスを、外に持ち出す必要が出てくる
62仕様書無しさん
2018/05/08(火) 02:44:13.63 まあテストばっか書かされて発狂してるだけやろな
63仕様書無しさん
2018/05/08(火) 02:46:41.45 長文はキチガイ
64仕様書無しさん
2018/05/08(火) 03:18:42.48 >>59
> え、Frameworkで用意されてる規定のものを独自実装にDIで簡単に切り替えることなんてよくあるやろ
ないなぁ。設定ファイルで別のクラスを使うように
することはあるけどそれは別にDIとは関係ない話だし
そもそもDIで簡単に切り替えられるようになっているとしたら
それはそのフレームワークがDIコンテナを使っているからで
どんなフレームワークでもDIで簡単に切り替えられるなんてことはない
つまりはDIがフレームワークに含まれているようなもので
DIで簡単に切り替えというよりも、フレームワークの機能で
簡単に切り替えと言ったほうが良いだろう
DIを使っていたからと言って、呼び出し側でハードコーディングされている
newをすげ替えることはできないんだからね
> え、Frameworkで用意されてる規定のものを独自実装にDIで簡単に切り替えることなんてよくあるやろ
ないなぁ。設定ファイルで別のクラスを使うように
することはあるけどそれは別にDIとは関係ない話だし
そもそもDIで簡単に切り替えられるようになっているとしたら
それはそのフレームワークがDIコンテナを使っているからで
どんなフレームワークでもDIで簡単に切り替えられるなんてことはない
つまりはDIがフレームワークに含まれているようなもので
DIで簡単に切り替えというよりも、フレームワークの機能で
簡単に切り替えと言ったほうが良いだろう
DIを使っていたからと言って、呼び出し側でハードコーディングされている
newをすげ替えることはできないんだからね
66仕様書無しさん
2018/05/08(火) 03:24:34.17 じゃあチュートリアルじゃないレベルの話をどうぞ
68仕様書無しさん
2018/05/08(火) 04:04:05.43 DIに依存してる人ってやっぱりJavaとか使ってんの?
モダンな言語、例えばScalaならDIなんてほとんど使わないけど
モダンな言語、例えばScalaならDIなんてほとんど使わないけど
70仕様書無しさん
2018/05/08(火) 06:53:03.87 >>53
>>58
こういう間違った意見を堂々と言ってくれるのは助かる。
本当にクズなのは否定だけして、理由を話さない奴だからね。
言いたいことや君がどういう風に考えているかはわかった。
ストラテジーパターンというワードを出してきたのもナイスだ。
しかし、プログラミングや現実世界というものは常に流動変化するものであり、その変化に対応するため
前もって交換可能な柔軟性を持たせることがオブジェクト指向の意味なんだよ。
そしてDIはその柔軟性を持たせる大きな手段となるため、ほとんどDIすることが多い。
もちろん、交換してはならないものが存在することもある!そう言ったものは内部でnewすれば良いだろう。
しかし、大抵の場合内部でnewしたクラスというのは、標準で用意されているクラスか、フレームワークで用意されているクラスか、ライブラリのクラスなのではなかろうか?
これらのクラスはテストを行う必要がない。なぜなら、これらのクラスはプロジェクトをまたいで
世界中の人が利用している比較的完成されたものであり
テストを行ってバグがみつかることはほぼ無い。たとえ見つかっても自分たちで修正できるものではないからだ。
(もちろんバグがあり、報告したけど対応が遅いので無理やり書き換えることはあるが、そんなこと頻繁に起こらない)
何でもかんでもストラテジーするアンチパターンを適応する愚かな行為というのは、一見納得できそうな主張だ。
しかし、実際にDIするのは、自分や同僚が作ったクラスに対してだ。
そして我々が触れるプログラムは自分や同僚が作ったプロジェクトのプログラムが大半を占める。
DIによって得られる柔軟性と我々が求めている柔軟性は、アプリケーションの柔軟性であり
ライブラリやフレームワークは関係ないのだよ。
だから大体DIになるのだ。
>>58
こういう間違った意見を堂々と言ってくれるのは助かる。
本当にクズなのは否定だけして、理由を話さない奴だからね。
言いたいことや君がどういう風に考えているかはわかった。
ストラテジーパターンというワードを出してきたのもナイスだ。
しかし、プログラミングや現実世界というものは常に流動変化するものであり、その変化に対応するため
前もって交換可能な柔軟性を持たせることがオブジェクト指向の意味なんだよ。
そしてDIはその柔軟性を持たせる大きな手段となるため、ほとんどDIすることが多い。
もちろん、交換してはならないものが存在することもある!そう言ったものは内部でnewすれば良いだろう。
しかし、大抵の場合内部でnewしたクラスというのは、標準で用意されているクラスか、フレームワークで用意されているクラスか、ライブラリのクラスなのではなかろうか?
これらのクラスはテストを行う必要がない。なぜなら、これらのクラスはプロジェクトをまたいで
世界中の人が利用している比較的完成されたものであり
テストを行ってバグがみつかることはほぼ無い。たとえ見つかっても自分たちで修正できるものではないからだ。
(もちろんバグがあり、報告したけど対応が遅いので無理やり書き換えることはあるが、そんなこと頻繁に起こらない)
何でもかんでもストラテジーするアンチパターンを適応する愚かな行為というのは、一見納得できそうな主張だ。
しかし、実際にDIするのは、自分や同僚が作ったクラスに対してだ。
そして我々が触れるプログラムは自分や同僚が作ったプロジェクトのプログラムが大半を占める。
DIによって得られる柔軟性と我々が求めている柔軟性は、アプリケーションの柔軟性であり
ライブラリやフレームワークは関係ないのだよ。
だから大体DIになるのだ。
71仕様書無しさん
2018/05/08(火) 07:18:36.90 そしてオブジェクト指向ももちろん関係ないけどなw
72仕様書無しさん
2018/05/08(火) 07:25:40.94 関数型言語でもオブジェクト指向って通用するんですか
関数型やったことないのでまた新しい概念を覚えるのかと思うと漠然とした不安があり
関数型やったことないのでまた新しい概念を覚えるのかと思うと漠然とした不安があり
73仕様書無しさん
2018/05/08(火) 07:37:29.27 >>70
テストがちゃんと行われていればDIで入れ込まないでいいってこと?
つまりテストがちゃんと行われてないからDI使うってこと?
つまりDIが必要なのはテストするため?
やっぱりDIはテストのためか
テストがちゃんと行われていればDIで入れ込まないでいいってこと?
つまりテストがちゃんと行われてないからDI使うってこと?
つまりDIが必要なのはテストするため?
やっぱりDIはテストのためか
74仕様書無しさん
2018/05/08(火) 07:44:06.31 >>72
関数型とオブジェクト指向は別の概念
だけど一般に使われている言語は純粋なオブジェクト指向や純粋な関数型じゃなくてそれらのいいところをちょっとずつ含むマルチパラダイムだから今までやってきたこととまるで違うことにはならんと思う
でも新しい概念やプログラミング作法は覚えなきゃならんよ
逆に今までやってきたことが邪魔になったりもする
関数型とオブジェクト指向は別の概念
だけど一般に使われている言語は純粋なオブジェクト指向や純粋な関数型じゃなくてそれらのいいところをちょっとずつ含むマルチパラダイムだから今までやってきたこととまるで違うことにはならんと思う
でも新しい概念やプログラミング作法は覚えなきゃならんよ
逆に今までやってきたことが邪魔になったりもする
76仕様書無しさん
2018/05/08(火) 07:55:18.71 DI使っていればアプリケーションに柔軟性を
もたらされるっていうのも、眉唾ものだな
DIでできるのは所詮クラスの挿げ替えだけで
すげ替えででできることしかできない
最初から完璧な設計をすることはないんだから
すげ替える必要性が出てきた時というのは設計の変更が必要
すなわちリファクタリングが必要
結局の所ソースコードに修正ができればいいわけだ
もたらされるっていうのも、眉唾ものだな
DIでできるのは所詮クラスの挿げ替えだけで
すげ替えででできることしかできない
最初から完璧な設計をすることはないんだから
すげ替える必要性が出てきた時というのは設計の変更が必要
すなわちリファクタリングが必要
結局の所ソースコードに修正ができればいいわけだ
80仕様書無しさん
2018/05/08(火) 08:27:52.98 ユニットテストをしっかりやったクラスは
DIで外から入れる必要はない
DIで外から入れる必要はない
82仕様書無しさん
2018/05/08(火) 08:32:58.5383仕様書無しさん
2018/05/08(火) 08:42:50.62 >>82
それは違うよ
抽象に対してプログラムすることで多態性が生まれる話はわかるよね?
しかしnewっていうのは具象度MAXのオブジェクトを生成するため、疎結合性を一気に崩壊させる接着剤のような代物だ。
newする場所は限られていて、それを注意しなければ疎結合は一気に破壊されるのだ。
しかし例外がって、Stringなど言語自体に定義されたクラスは言語に依存しているためどこでnewしても構わない。
フレームワークを使ったら、フレームワークで定義されているクラスもある程度自由にnew可能だ。
つまり、newするクラスのレイヤーが表面的なものであればあるほどnewの被害を受けることとなる。
だから自分や同僚が作成したクラスは大体メインクラスでnewしてコンストラクタインジェクションするんだよ
それは違うよ
抽象に対してプログラムすることで多態性が生まれる話はわかるよね?
しかしnewっていうのは具象度MAXのオブジェクトを生成するため、疎結合性を一気に崩壊させる接着剤のような代物だ。
newする場所は限られていて、それを注意しなければ疎結合は一気に破壊されるのだ。
しかし例外がって、Stringなど言語自体に定義されたクラスは言語に依存しているためどこでnewしても構わない。
フレームワークを使ったら、フレームワークで定義されているクラスもある程度自由にnew可能だ。
つまり、newするクラスのレイヤーが表面的なものであればあるほどnewの被害を受けることとなる。
だから自分や同僚が作成したクラスは大体メインクラスでnewしてコンストラクタインジェクションするんだよ
88仕様書無しさん
2018/05/08(火) 08:49:46.2592仕様書無しさん
2018/05/08(火) 09:56:09.42 >>88
それこそ言語の問題だとしか思えないよねw
newの代わりに、Interface i = GlobalClassFactory.create("クラス名") とか
やれば解決できるじゃんw
newキーワードをフックできればDIはいらないってことになる
それこそ言語の問題だとしか思えないよねw
newの代わりに、Interface i = GlobalClassFactory.create("クラス名") とか
やれば解決できるじゃんw
newキーワードをフックできればDIはいらないってことになる
93仕様書無しさん
2018/05/08(火) 10:04:54.11 × newキーワードをフック
○ newキーワードをオーバーライド
まあ訂正するほどのことじゃないけど
○ newキーワードをオーバーライド
まあ訂正するほどのことじゃないけど
94仕様書無しさん
2018/05/08(火) 10:06:15.7095仕様書無しさん
2018/05/08(火) 10:07:21.90 >>92
初めからそういう風に言い返してくれるとたすかる。
ファクトリはAbstruct FactryやらFactry methodやらあるけど、どちらもファクトリを使うクラスはファクトリのスーパークラスをコンポジションするものだよ
直接newするよりかいくらかマシだけど、それやったら今度はファクトリの具象に依存してるじゃん。
だからその場合ファクトリをDIするんだよ
初めからそういう風に言い返してくれるとたすかる。
ファクトリはAbstruct FactryやらFactry methodやらあるけど、どちらもファクトリを使うクラスはファクトリのスーパークラスをコンポジションするものだよ
直接newするよりかいくらかマシだけど、それやったら今度はファクトリの具象に依存してるじゃん。
だからその場合ファクトリをDIするんだよ
96仕様書無しさん
2018/05/08(火) 10:13:07.9398仕様書無しさん
2018/05/08(火) 10:15:44.71 >>95
> 直接newするよりかいくらかマシだけど、それやったら今度はファクトリの具象に依存してるじゃん。
依存すればいいだろう?
たかが文字列からクラスを生成するだけのコード
バグなんてまず起きないし、どうせDateとかStringとかはDIしませーんっていうんだろ?
それと同じに考えればいい
手段と目的が逆になってる
依存を無くすのが目的となってるな
> 直接newするよりかいくらかマシだけど、それやったら今度はファクトリの具象に依存してるじゃん。
依存すればいいだろう?
たかが文字列からクラスを生成するだけのコード
バグなんてまず起きないし、どうせDateとかStringとかはDIしませーんっていうんだろ?
それと同じに考えればいい
手段と目的が逆になってる
依存を無くすのが目的となってるな
99仕様書無しさん
2018/05/08(火) 10:17:39.80 >>96
> まあ、ファクトリのサブクラスを大量に作る予定なんてありませんのでって話ならそれでもいいかもしれない
何のために作るんだ?w
文字列からクラスをnewするだけの唯一の
グローバルなシングルトンクラスだよ
> まあ、ファクトリのサブクラスを大量に作る予定なんてありませんのでって話ならそれでもいいかもしれない
何のために作るんだ?w
文字列からクラスをnewするだけの唯一の
グローバルなシングルトンクラスだよ
100仕様書無しさん
2018/05/08(火) 10:18:23.23 で、結局DIはテストするためだけなんだろう?
101仕様書無しさん
2018/05/08(火) 10:19:30.03102仕様書無しさん
2018/05/08(火) 10:20:27.12 > シングルトンのメリットは、それがインスタンスであるために拡張可能なことにある。
それ誰がいってんの?
参考資料持ってきて
それ誰がいってんの?
参考資料持ってきて
103仕様書無しさん
2018/05/08(火) 10:25:07.36 >>102
資料探すのがめんどくさいのでこのまま話すけど
シングルトンのいいところは静的クラスのような単一性と
継承して拡張可能なこと、そしてそれがインスタンスとして扱えることが利点だろう。
もしシングルトンが静的クラスと同じなら、シングルトンなんかいらないでしょ
資料探すのがめんどくさいのでこのまま話すけど
シングルトンのいいところは静的クラスのような単一性と
継承して拡張可能なこと、そしてそれがインスタンスとして扱えることが利点だろう。
もしシングルトンが静的クラスと同じなら、シングルトンなんかいらないでしょ
104仕様書無しさん
2018/05/08(火) 10:27:03.40 実質いらないと思うけど?
ほんと無駄な拡張性持たせるの好きだよねw
YAGNI(笑)
ほんと無駄な拡張性持たせるの好きだよねw
YAGNI(笑)
105仕様書無しさん
2018/05/08(火) 10:30:20.70 >>104
開放/閉鎖原則ってのがあるからな。
君の静的クラスファクトリを使った方法は閉じるのがちと早いかな。
まあでも実装としては嫌いではない!そこ勘違いしないでほしい。直接newされてないのでマシ
開放/閉鎖原則ってのがあるからな。
君の静的クラスファクトリを使った方法は閉じるのがちと早いかな。
まあでも実装としては嫌いではない!そこ勘違いしないでほしい。直接newされてないのでマシ
106仕様書無しさん
2018/05/08(火) 10:32:48.43 はぁ? 閉じてて問題が出たら
開ければいいだけじゃんか
最初から時間がかかることやるなって言ってんの
開ければいいだけじゃんか
最初から時間がかかることやるなって言ってんの
111仕様書無しさん
2018/05/08(火) 10:45:17.28 >>106
まあでも言い争うようなことでもない。
ファクトリを使ってるのでマシだから、君の実装が酷いとは思ってない。
また、不必要な柔軟性を取り入れて、メンテナンス性が悪くなることがイケてないことは十分承知している。
たとえば、タイヤの種類が一つしかないゲームで「将来スタッドレスタイヤが追加されるかもしれない!」と
99.9%起こらない変更の柔軟性に対応して、タイヤクラスをスーパークラスにしたりするのは間違っている。
しかしDIの場合はどうだ?コンストラクタに渡すだけで拡張に対して開けるわけだ。これを面倒とか思う人はDIのメリットをちゃんと理解していない。
それに、そのオブジェクト何を使って動いてるかコンストラクタの引数に一覧されるので、中で何やってるのか、中を見なくてもわかりやすくなるというメリットがある。
まあでも言い争うようなことでもない。
ファクトリを使ってるのでマシだから、君の実装が酷いとは思ってない。
また、不必要な柔軟性を取り入れて、メンテナンス性が悪くなることがイケてないことは十分承知している。
たとえば、タイヤの種類が一つしかないゲームで「将来スタッドレスタイヤが追加されるかもしれない!」と
99.9%起こらない変更の柔軟性に対応して、タイヤクラスをスーパークラスにしたりするのは間違っている。
しかしDIの場合はどうだ?コンストラクタに渡すだけで拡張に対して開けるわけだ。これを面倒とか思う人はDIのメリットをちゃんと理解していない。
それに、そのオブジェクト何を使って動いてるかコンストラクタの引数に一覧されるので、中で何やってるのか、中を見なくてもわかりやすくなるというメリットがある。
112仕様書無しさん
2018/05/08(火) 10:48:38.58 んーでも、静的クラスでファクトリを作るのはイケてないと思うけど。
113仕様書無しさん
2018/05/08(火) 10:56:31.98 スタティックファクトリメソッドパターンでさえ
シングルトン使ってるしなぁ
うーん
シングルトン使ってるしなぁ
うーん
114仕様書無しさん
2018/05/08(火) 11:33:22.09 >>111
> しかしDIの場合はどうだ?コンストラクタに渡すだけで拡張に対して開けるわけだ。これを面倒とか思う人はDIのメリットをちゃんと理解していない。
例えメリットが有ったとしても、面倒なことは面倒だろ。
面倒がなくなるって話をするならまだしも、
「面倒を上回るメリットが有る」があるという主張は
面倒がなくなったわけじゃない
で、DIのメリットって結局はテストで便利って話だろ?
> それに、そのオブジェクト何を使って動いてるかコンストラクタの引数に一覧されるので、中で何やってるのか、中を見なくてもわかりやすくなるというメリットがある。
普段はブラックボックスとして使えよ。
なんで中でなにをやってるかを、コンストラクタの引数で
毎回みなきゃならんのだよ?使うたびだろ?アホらしい。
中でなにをやってるか見たくなった時に、そのクラスの
ソースコードを見ればいいだけの話だろ
> しかしDIの場合はどうだ?コンストラクタに渡すだけで拡張に対して開けるわけだ。これを面倒とか思う人はDIのメリットをちゃんと理解していない。
例えメリットが有ったとしても、面倒なことは面倒だろ。
面倒がなくなるって話をするならまだしも、
「面倒を上回るメリットが有る」があるという主張は
面倒がなくなったわけじゃない
で、DIのメリットって結局はテストで便利って話だろ?
> それに、そのオブジェクト何を使って動いてるかコンストラクタの引数に一覧されるので、中で何やってるのか、中を見なくてもわかりやすくなるというメリットがある。
普段はブラックボックスとして使えよ。
なんで中でなにをやってるかを、コンストラクタの引数で
毎回みなきゃならんのだよ?使うたびだろ?アホらしい。
中でなにをやってるか見たくなった時に、そのクラスの
ソースコードを見ればいいだけの話だろ
115仕様書無しさん
2018/05/08(火) 11:59:13.57 >>114
> >>111
> で、DIのメリットって結局はテストで便利って話だろ?
なんでそうなるのww
テストで便利なんて話、おれは一切してないからね!
DIのメリットはそこじゃねぇよ
> 中でなにをやってるか見たくなった時に、そのクラスの
> ソースコードを見ればいいだけの話だろ
なぜそこもそうなるのww
関数に渡す引数で、その関数が何やるか大体認識できるのと一緒!
まあおれがいうコンストラクタ一覧メリットは、そんなに絶賛されるようなことではなくて
面倒面倒っていうけど味方変えたらわかりやすさと、柔軟性に貢献してるよねってこと。
大体、コンストラクタに引数渡すのが面倒なんてメインクラスて一回やるだけだし、そんなに面倒ならDIコンテナ使えよ
あなた好きでしょファクトリ。
> >>111
> で、DIのメリットって結局はテストで便利って話だろ?
なんでそうなるのww
テストで便利なんて話、おれは一切してないからね!
DIのメリットはそこじゃねぇよ
> 中でなにをやってるか見たくなった時に、そのクラスの
> ソースコードを見ればいいだけの話だろ
なぜそこもそうなるのww
関数に渡す引数で、その関数が何やるか大体認識できるのと一緒!
まあおれがいうコンストラクタ一覧メリットは、そんなに絶賛されるようなことではなくて
面倒面倒っていうけど味方変えたらわかりやすさと、柔軟性に貢献してるよねってこと。
大体、コンストラクタに引数渡すのが面倒なんてメインクラスて一回やるだけだし、そんなに面倒ならDIコンテナ使えよ
あなた好きでしょファクトリ。
116仕様書無しさん
2018/05/08(火) 12:03:48.04 >>114
それに、場合によりDIが過剰実装になることもかんがえられるけど、それどんだけ小さい規模のプロジェクトだよって話。
あなたの静的ファクトリ実装は、完全に間違ってると思ってないよ?
けどあなたは、DIを完全否定するわけ?多少なり認めてる部分があるならそこ話してよ、キリないから
それに、場合によりDIが過剰実装になることもかんがえられるけど、それどんだけ小さい規模のプロジェクトだよって話。
あなたの静的ファクトリ実装は、完全に間違ってると思ってないよ?
けどあなたは、DIを完全否定するわけ?多少なり認めてる部分があるならそこ話してよ、キリないから
117仕様書無しさん
2018/05/08(火) 12:08:15.22 今頃気付いたけどスレタイが
分かりやすく教えてくれ
から
分かりやすく例えて教えてくれ
に改変されてるな
分かりやすく教えてくれ
から
分かりやすく例えて教えてくれ
に改変されてるな
121仕様書無しさん
2018/05/08(火) 12:58:46.22 >>118
別に信者ではない。
クラスが別のクラスの機能を使うのにコンポジションが使えるのに
継承を選択してしまう人たちが多いからコンポジション目線で言ってるだけ。
そしてコンポジションの中でもコンストラクタインジェクションが好まれるからDIの話になってるだけや
新スレになって、犬猫に踊らされた人たちは消え去ってしまったようだが...
別に信者ではない。
クラスが別のクラスの機能を使うのにコンポジションが使えるのに
継承を選択してしまう人たちが多いからコンポジション目線で言ってるだけ。
そしてコンポジションの中でもコンストラクタインジェクションが好まれるからDIの話になってるだけや
新スレになって、犬猫に踊らされた人たちは消え去ってしまったようだが...
123仕様書無しさん
2018/05/08(火) 13:39:48.46 「継承を使うのは非推奨」じゃなくて、「設計ができない奴に継承を使わせるのは非推奨」だからな
そこんとこ勘違いしないように
そこんとこ勘違いしないように
124仕様書無しさん
2018/05/08(火) 14:42:56.54 >>118
別にアンチではない
クラスが別のクラスの機能を使うのにコンポジションが使えるのに
テストがし辛いという理由でクラスの中でnewしないで
クラスの外でnewして入れるのが無駄なことだって言ってるだけ
クラスが別のクラスの機能を使うのにコンポジションが使えるという段階で
別のクラスの機能を変更できるようにしたら便利じゃね?なんて要求はなかった
単純にクラスのコンストラクタなりでnewするだけだったのに
コンストラクタを醜く変更しインターフェースを作り必要もないのに
渡すクラスを変更すれば処理が変えられるんだぜ(ドヤァ)が
やらなくても良いことだって話をしてる
無駄に複雑な仕組みに変えてしまってる。
別にアンチではない
クラスが別のクラスの機能を使うのにコンポジションが使えるのに
テストがし辛いという理由でクラスの中でnewしないで
クラスの外でnewして入れるのが無駄なことだって言ってるだけ
クラスが別のクラスの機能を使うのにコンポジションが使えるという段階で
別のクラスの機能を変更できるようにしたら便利じゃね?なんて要求はなかった
単純にクラスのコンストラクタなりでnewするだけだったのに
コンストラクタを醜く変更しインターフェースを作り必要もないのに
渡すクラスを変更すれば処理が変えられるんだぜ(ドヤァ)が
やらなくても良いことだって話をしてる
無駄に複雑な仕組みに変えてしまってる。
125仕様書無しさん
2018/05/08(火) 15:26:46.45127仕様書無しさん
2018/05/08(火) 15:30:06.38 そもそもコンストラクタインジェクションで外から注入するのって複雑なの??ww
その辺の感覚から食い違ってる
その辺の感覚から食い違ってる
128仕様書無しさん
2018/05/08(火) 15:36:43.66 >>125
だからテスト以外で使うことないでしょ?
クラスを入れ替えたりしないんだから
>>127
今までだと処理は内部に隠蔽されブラックボックスとして扱えばよかったので
new Klass(123) ってしていればいいだけだったのに、
Klassは内部でHogeとHageを使います。
new Klass(123, new Hoge(), new Hage())
そのHogeは、AとBを使います
new Klass(123, new Hoge(new A(1), new B(2)), new Hage())
今度からKlassを使う時は、必ず
new Klass(123, new Hoge(new A(1), new B(2)), new Hage())
と書きましょう
いやはや酷い、酷いw
だからテスト以外で使うことないでしょ?
クラスを入れ替えたりしないんだから
>>127
今までだと処理は内部に隠蔽されブラックボックスとして扱えばよかったので
new Klass(123) ってしていればいいだけだったのに、
Klassは内部でHogeとHageを使います。
new Klass(123, new Hoge(), new Hage())
そのHogeは、AとBを使います
new Klass(123, new Hoge(new A(1), new B(2)), new Hage())
今度からKlassを使う時は、必ず
new Klass(123, new Hoge(new A(1), new B(2)), new Hage())
と書きましょう
いやはや酷い、酷いw
129仕様書無しさん
2018/05/08(火) 15:47:29.28 >>127は簡単な例しか使ったことがないんだろうね
新たにHageがAを使うようになりました
new Klass(123, new Hoge(new A(1), new B(2)), new Hage(new A(2)))
このようにHageに依存(笑)している部分をすべて書き換えてください
これがHageの中でAをnewしていれば、Hage以外どこも書き換える必要がなかったわけだよ
新たにHageがAを使うようになりました
new Klass(123, new Hoge(new A(1), new B(2)), new Hage(new A(2)))
このようにHageに依存(笑)している部分をすべて書き換えてください
これがHageの中でAをnewしていれば、Hage以外どこも書き換える必要がなかったわけだよ
130仕様書無しさん
2018/05/08(火) 16:06:54.00 >>129
簡単なのじゃなくて実戦でやってるから。
それにそれの何が酷いの?>>83でも書いたけど
HogeとHageってプロジェクトのクラスでしょ?
DIしたほうが絶対いいじゃん
また、そうしておけば他のクラスにもHogeとかHageを渡して使いまわすことができるよ。
あと複雑に見せるように一行で書いてるけど、そんな一行で書かないから。
コードコピペする
Engine engine = new JetEngine();
Handle handle = new QuickHandle();
Brake brake = new AntilockBrake();
Wheel wheel = new StudlessWheel();
Car car = new Car(engine, handle, brake, wheel);
簡単なのじゃなくて実戦でやってるから。
それにそれの何が酷いの?>>83でも書いたけど
HogeとHageってプロジェクトのクラスでしょ?
DIしたほうが絶対いいじゃん
また、そうしておけば他のクラスにもHogeとかHageを渡して使いまわすことができるよ。
あと複雑に見せるように一行で書いてるけど、そんな一行で書かないから。
コードコピペする
Engine engine = new JetEngine();
Handle handle = new QuickHandle();
Brake brake = new AntilockBrake();
Wheel wheel = new StudlessWheel();
Car car = new Car(engine, handle, brake, wheel);
131仕様書無しさん
2018/05/08(火) 16:19:48.53 DI無駄言うてる人はinterfaceすら知らなそう
132仕様書無しさん
2018/05/08(火) 16:22:18.96 >>131
クラス内部でnewしていれば不要だったのに
DIを使うがために、クラスのメソッドをピックアップしただけの
インターフェースを作って、ほら同じインターフェースなら
入れ替え可能なんです。でもそんな事しないですけどね
どうですあなたもクラスファイルからインターフェースファイルを作りませんか?
っていうやつですねw
クラス内部でnewしていれば不要だったのに
DIを使うがために、クラスのメソッドをピックアップしただけの
インターフェースを作って、ほら同じインターフェースなら
入れ替え可能なんです。でもそんな事しないですけどね
どうですあなたもクラスファイルからインターフェースファイルを作りませんか?
っていうやつですねw
133仕様書無しさん
2018/05/08(火) 16:27:47.04 >>130
あ、ついでにそれぞれのパーツが複数のネジを使うことを考慮しておきますね
Screw engine_screws[] = new Screw[100];
Engine engine = new JetEngine(engine_screws);
Screw handle_screws[] = new Screw[20]
Handle handle = new QuickHandle(handle_screws);
Screw brake_screws[] = new Screw[10]
Brake brake = new AntilockBrake(brake_screws);
Screw wheel_screws[] = new Screw[50]
Wheel wheel = new StudlessWheel(wheel_screws);
Screw car_screws[] = new Screw[1000]
Car car = new Car(car_screws, engine, handle, brake, wheel);
VS
Car car = new Car()
どっちが簡単かは言うまでもないw
あ、ついでにそれぞれのパーツが複数のネジを使うことを考慮しておきますね
Screw engine_screws[] = new Screw[100];
Engine engine = new JetEngine(engine_screws);
Screw handle_screws[] = new Screw[20]
Handle handle = new QuickHandle(handle_screws);
Screw brake_screws[] = new Screw[10]
Brake brake = new AntilockBrake(brake_screws);
Screw wheel_screws[] = new Screw[50]
Wheel wheel = new StudlessWheel(wheel_screws);
Screw car_screws[] = new Screw[1000]
Car car = new Car(car_screws, engine, handle, brake, wheel);
VS
Car car = new Car()
どっちが簡単かは言うまでもないw
134仕様書無しさん
2018/05/08(火) 17:17:46.87137仕様書無しさん
2018/05/08(火) 18:00:30.56 開発と保守が楽になるよう、良い塩梅を探るのがオブジェクト指向なんじゃないの?
138仕様書無しさん
2018/05/08(火) 18:01:23.10140仕様書無しさん
2018/05/08(火) 18:01:54.16 そしてオブジェクト指向の範囲ではできないから
DIなんてものが作られたんじゃないの
DIなんてものが作られたんじゃないの
142仕様書無しさん
2018/05/08(火) 18:03:33.89 コンストラクタをインジェクションするために
使うんじゃなくて、クラスにインジェクションのための機能が必要
使うんじゃなくて、クラスにインジェクションのための機能が必要
146仕様書無しさん
2018/05/08(火) 18:12:41.17 >>144
オブジェクトを共有したいときは共有を前提につくるわけで、「使い回すこともできる」はメリットよりむしろ、
使い回してほしくないオブジェクトも使い回せる状態になっているというデメリットの方が大きい
ほんとセンスねえなぁお前
オブジェクトを共有したいときは共有を前提につくるわけで、「使い回すこともできる」はメリットよりむしろ、
使い回してほしくないオブジェクトも使い回せる状態になっているというデメリットの方が大きい
ほんとセンスねえなぁお前
148仕様書無しさん
2018/05/08(火) 18:24:07.16149仕様書無しさん
2018/05/08(火) 18:28:05.26150仕様書無しさん
2018/05/08(火) 18:30:20.59 使いまわしできるようにしたいときだけやればいいだろう
152仕様書無しさん
2018/05/08(火) 21:00:01.75 シングルトンって静的クラスの一形態だよな?
154仕様書無しさん
2018/05/08(火) 21:12:56.34 Car car = createCar();
完璧
完璧
157仕様書無しさん
2018/05/08(火) 21:54:47.82 オブジェクトの相互作用で処理を行うのはもう古いよ
どうせお前ら状態に振り回されてバグ量産しまくってるんだろ
時代はストリームだよストリーム
どうせお前ら状態に振り回されてバグ量産しまくってるんだろ
時代はストリームだよストリーム
158仕様書無しさん
2018/05/08(火) 21:57:34.57 Java8のstreamのこと?
160仕様書無しさん
2018/05/08(火) 22:37:21.35163仕様書無しさん
2018/05/08(火) 22:56:46.02 お前と、お前が見下してる奴
164仕様書無しさん
2018/05/08(火) 23:17:24.99 >>163
別に見下してないから
静的クラスを使う方法もマシなんじゃない?ってずっと言ってる。
ただ、おれは拡張に対して開き切ってから最終的に閉じるほうがいいと思ってるので
静的クラスのメソッドじゃなくて、スタティックファクトリメソッド使うけどとは思ってる。
ただ、それだけじゃ拡張に対して開ききれてないので、通常の静的でないファクトリにして、DIするわかなって話。
おれはコンストラクタに渡すのが手間とか面倒とか思わないし、わかりやすさに貢献してると思ってるからDIの方がメリットだと思ってるだけ。
メインクラスてnewしてコンストラクタに渡すだけで、過剰実装とは思わない。普通によくやること。
でも、そうは言いつつも結局どっちもアリなんじゃん?って話してるのに
アンチがDIはテストするためにあるとか、コンストラクタに渡すのは面倒だとか言うから変な空気になってるだけ
別に見下してないから
静的クラスを使う方法もマシなんじゃない?ってずっと言ってる。
ただ、おれは拡張に対して開き切ってから最終的に閉じるほうがいいと思ってるので
静的クラスのメソッドじゃなくて、スタティックファクトリメソッド使うけどとは思ってる。
ただ、それだけじゃ拡張に対して開ききれてないので、通常の静的でないファクトリにして、DIするわかなって話。
おれはコンストラクタに渡すのが手間とか面倒とか思わないし、わかりやすさに貢献してると思ってるからDIの方がメリットだと思ってるだけ。
メインクラスてnewしてコンストラクタに渡すだけで、過剰実装とは思わない。普通によくやること。
でも、そうは言いつつも結局どっちもアリなんじゃん?って話してるのに
アンチがDIはテストするためにあるとか、コンストラクタに渡すのは面倒だとか言うから変な空気になってるだけ
165仕様書無しさん
2018/05/08(火) 23:21:41.30 オブジェクトを使う側が、そのオブジェクトがコンポジションする他のオブジェクトのことまで考えるとか、アホくさ〜
167仕様書無しさん
2018/05/08(火) 23:27:12.43 メインクラスてnewしてコンストラクタに渡すだけで、過剰実装とは思わない。普通によくやること。
どーん(笑)
Screw engine_screws[] = new Screw[100];
Engine engine = new JetEngine(engine_screws);
Screw handle_screws[] = new Screw[20]
Handle handle = new QuickHandle(handle_screws);
Screw brake_screws[] = new Screw[10]
Brake brake = new AntilockBrake(brake_screws);
Screw wheel_screws[] = new Screw[50]
Wheel wheel = new StudlessWheel(wheel_screws);
Screw car_screws[] = new Screw[1000]
Car car = new Car(car_screws, engine, handle, brake, wheel);
VS
Car car = new Car()
どーん(笑)
Screw engine_screws[] = new Screw[100];
Engine engine = new JetEngine(engine_screws);
Screw handle_screws[] = new Screw[20]
Handle handle = new QuickHandle(handle_screws);
Screw brake_screws[] = new Screw[10]
Brake brake = new AntilockBrake(brake_screws);
Screw wheel_screws[] = new Screw[50]
Wheel wheel = new StudlessWheel(wheel_screws);
Screw car_screws[] = new Screw[1000]
Car car = new Car(car_screws, engine, handle, brake, wheel);
VS
Car car = new Car()
171仕様書無しさん
2018/05/08(火) 23:33:28.12172仕様書無しさん
2018/05/08(火) 23:38:19.83 わかりやすくというか直感的かつ現実的な話として、
オブジェクト指向は
function(pointer, arguments...)
を
instance.method(arguments...)
にしたがる手法だよね。
メリットは事前に参照関係を整理しやすい。
デメリットは後で網羅的な参照関係が理解しにくくなる。
実践ではそれだけのことであって、
カプセル化とか多態性とか考える意味も必要性もない。
参照関係の整理をひたすら追求する、
使用言語の機能はクラス化以外にもいろいろあるだろうけど、
それらもフル活用してとにかく参照関係を整理する、
ってのがオブジェクト指向プログラミングだと思っている。
C言語から移行する人間には、
変な概念や喩えよりこっちの方がわかりやすい。
参照関係の整理を妥協すると、
後で参照関係を理解する必要性が発生しやすくなるから、
網羅的には理解しにくくなっても妥協せず整理した方がいい。
それで結果的にカプセル化される。
(多態性も備わる。)
オブジェクト指向は
function(pointer, arguments...)
を
instance.method(arguments...)
にしたがる手法だよね。
メリットは事前に参照関係を整理しやすい。
デメリットは後で網羅的な参照関係が理解しにくくなる。
実践ではそれだけのことであって、
カプセル化とか多態性とか考える意味も必要性もない。
参照関係の整理をひたすら追求する、
使用言語の機能はクラス化以外にもいろいろあるだろうけど、
それらもフル活用してとにかく参照関係を整理する、
ってのがオブジェクト指向プログラミングだと思っている。
C言語から移行する人間には、
変な概念や喩えよりこっちの方がわかりやすい。
参照関係の整理を妥協すると、
後で参照関係を理解する必要性が発生しやすくなるから、
網羅的には理解しにくくなっても妥協せず整理した方がいい。
それで結果的にカプセル化される。
(多態性も備わる。)
173仕様書無しさん
2018/05/08(火) 23:41:43.30 >>172
多分分かってないんだろうけど、
DIっていうのは、function(pointer, arguments...) の中で
別のライブラリを使っている時、includeを
関数の呼び出し元で行うようなものだぞ
多分分かってないんだろうけど、
DIっていうのは、function(pointer, arguments...) の中で
別のライブラリを使っている時、includeを
関数の呼び出し元で行うようなものだぞ
176仕様書無しさん
2018/05/09(水) 00:11:05.36 参照関係ってなんのこと言ってんの
なにからなにに対する参照?
なにからなにに対する参照?
177仕様書無しさん
2018/05/09(水) 00:22:02.11 >>175
そういうことだね。
オブジェクト指向のメリットは実はあまり大きくないと思っている。
上級者が大規模ライブラリを開発をする場合は別だけど、
そういう場合はあまりない。
しかもそういうプロジェクトではオブジェクト指向を嫌う人が集まっていたりするし。
普通の現場ではオブジェクト指向プログラミングが中途半端なコーダーばかりだし、
もっと別の考え方が必要だよ。
それでもある程度の要件の場合は、
今のところはオブジェクト指向を選ぶしかないのが辛い。
>>176
ありとあらゆる参照だよ。
関数から引数、ポインタ、インスタンスからプロパティ、メソッド、サブクラスからスーパークラス、構造体やインスタンスからメンバーの型、外部クラスから内部クラス・・・
参照の種類の多さからも、
後から網羅的に理解することを犠牲にして、
とにかく整理するための手法であることが伺える
そういうことだね。
オブジェクト指向のメリットは実はあまり大きくないと思っている。
上級者が大規模ライブラリを開発をする場合は別だけど、
そういう場合はあまりない。
しかもそういうプロジェクトではオブジェクト指向を嫌う人が集まっていたりするし。
普通の現場ではオブジェクト指向プログラミングが中途半端なコーダーばかりだし、
もっと別の考え方が必要だよ。
それでもある程度の要件の場合は、
今のところはオブジェクト指向を選ぶしかないのが辛い。
>>176
ありとあらゆる参照だよ。
関数から引数、ポインタ、インスタンスからプロパティ、メソッド、サブクラスからスーパークラス、構造体やインスタンスからメンバーの型、外部クラスから内部クラス・・・
参照の種類の多さからも、
後から網羅的に理解することを犠牲にして、
とにかく整理するための手法であることが伺える
178仕様書無しさん
2018/05/09(水) 00:57:42.35 オブジェクト指向のメリットはカプセル化
もちろん、狭義のカプセル化のことを言ってるんじゃないからね
もちろん、狭義のカプセル化のことを言ってるんじゃないからね
179仕様書無しさん
2018/05/09(水) 00:59:56.43 抽象化できてないから参照に振り回されてるだけ
181仕様書無しさん
2018/05/09(水) 07:16:30.79 カプセル化、抽象化は結果として付いてくるから心配しなくて大丈夫
182仕様書無しさん
2018/05/09(水) 08:19:37.39 >>181
そんな設計ができそうなあなたにお聞きしたいんだが
わざわざ外でnewしてコンストラクタに渡すようなことしねーよww
みたいな考えになりますか?
僕としては、大半のデザインパターンがDI(ストラテジーパターンやコンストラクタインジェクションなどの意味を含む)に根付いており
自然と参照整理していくと、同僚や自分が作ったクラスの大半はDIすることとなると思ってるんだけど、どう思います?
そんな設計ができそうなあなたにお聞きしたいんだが
わざわざ外でnewしてコンストラクタに渡すようなことしねーよww
みたいな考えになりますか?
僕としては、大半のデザインパターンがDI(ストラテジーパターンやコンストラクタインジェクションなどの意味を含む)に根付いており
自然と参照整理していくと、同僚や自分が作ったクラスの大半はDIすることとなると思ってるんだけど、どう思います?
183仕様書無しさん
2018/05/09(水) 08:44:23.46 クライアントになにを公開してなにを公開したくないかによるでしょ
184仕様書無しさん
2018/05/09(水) 08:49:30.93 OOPは実装の手法だから
抽象的にとらえたら負け
抽象化とか言ってる奴はOOPを理解できてないよ
抽象的にとらえたら負け
抽象化とか言ってる奴はOOPを理解できてないよ
186仕様書無しさん
2018/05/09(水) 08:58:09.24 DIはDB周りが恩恵見えやすいと思うよ
頑張れ
頑張れ
188仕様書無しさん
2018/05/09(水) 09:24:52.34 オブジェクト指向とは何か?
オブジェクトセンセイ達の間でも合意の得られていない、論点すら曖昧な、言葉遊びである。
...という理解で良い?
オブジェクトセンセイ達の間でも合意の得られていない、論点すら曖昧な、言葉遊びである。
...という理解で良い?
189仕様書無しさん
2018/05/09(水) 09:47:18.01 >>188
せやなぁ
おれのオブジェクト指向の結論はこう。
本来データというものはプログラマ先生が自由に扱える代物であったが
自由研究で困る小学生がいるように、選択肢が多いということはプログラマ小学生にとってデメリットでしかなかった。
プログラマ先生は考えた。じゃあ、自由研究で何ができるか課題と一緒にセットにして選べるようにしてあげよう...
そして、run(car)ではなくcar.run()とした。
すると自由研究で困るプログラマ小学生たちは、用意されたメソッドの中から何を使うか選べばいいだけとなった!そして、みんな幸せになった。
と、思いたかったがこの問題には欠点があった。
先生が用意したライブラリを小学生たちが使うことはできるようになったが
その小学生たちは、先生のようにライブラリやモジュールを作ることは到底できない!!
つまり、オブジェクト指向で作られたライブラリやモジュールは明確で
ときにドキュメントに目を通さなくとも理解できるわかりやすさがあるが
先生が用意したライブラリを使って喜ぶだけではアプリケーションなど開発できるわけもなく
小学生たちは飴玉につられて地獄のジェットコースターに乗ることになったとさ
せやなぁ
おれのオブジェクト指向の結論はこう。
本来データというものはプログラマ先生が自由に扱える代物であったが
自由研究で困る小学生がいるように、選択肢が多いということはプログラマ小学生にとってデメリットでしかなかった。
プログラマ先生は考えた。じゃあ、自由研究で何ができるか課題と一緒にセットにして選べるようにしてあげよう...
そして、run(car)ではなくcar.run()とした。
すると自由研究で困るプログラマ小学生たちは、用意されたメソッドの中から何を使うか選べばいいだけとなった!そして、みんな幸せになった。
と、思いたかったがこの問題には欠点があった。
先生が用意したライブラリを小学生たちが使うことはできるようになったが
その小学生たちは、先生のようにライブラリやモジュールを作ることは到底できない!!
つまり、オブジェクト指向で作られたライブラリやモジュールは明確で
ときにドキュメントに目を通さなくとも理解できるわかりやすさがあるが
先生が用意したライブラリを使って喜ぶだけではアプリケーションなど開発できるわけもなく
小学生たちは飴玉につられて地獄のジェットコースターに乗ることになったとさ
190仕様書無しさん
2018/05/09(水) 10:14:50.08 >>182
> 自然と参照整理していくと、同僚や自分が作ったクラスの大半はDIすることとなると思ってるんだけど、どう思います?
巷にあふれるライブラリのクラスを見てください。
DIになってますか?なっていませんね。
それが答えです。
> 自然と参照整理していくと、同僚や自分が作ったクラスの大半はDIすることとなると思ってるんだけど、どう思います?
巷にあふれるライブラリのクラスを見てください。
DIになってますか?なっていませんね。
それが答えです。
191仕様書無しさん
2018/05/09(水) 10:16:29.41 オブジェクト指向で設計できない奴が、他のパラダイムでならうまく設計できるかというとw
193仕様書無しさん
2018/05/09(水) 10:21:01.53 >>182
> 僕としては、大半のデザインパターンがDI(ストラテジーパターンやコンストラクタインジェクションなどの意味を含む)に根付いており
じゃあデザインパターンを見てみましょうか?
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
リンク先にコードもありますよ
この中でDIが使われてるのはどれですか?
ストラテジーパターンは確かに使われていますね。
https://ja.wikipedia.org/wiki/Strategy_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
> context = new Context(new ConcreteStrategyA());
それ以外にいくつありますか?
> 僕としては、大半のデザインパターンがDI(ストラテジーパターンやコンストラクタインジェクションなどの意味を含む)に根付いており
じゃあデザインパターンを見てみましょうか?
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
リンク先にコードもありますよ
この中でDIが使われてるのはどれですか?
ストラテジーパターンは確かに使われていますね。
https://ja.wikipedia.org/wiki/Strategy_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
> context = new Context(new ConcreteStrategyA());
それ以外にいくつありますか?
196仕様書無しさん
2018/05/09(水) 10:23:53.49 >>193
もう本当めんどくさい。
ファクトリの話聞いてなかったの?
ファクトリメソッドとアブストラクトファクトリ調べてみろよ。
これみて、インスタンスを必要とするクラスの中でファクトリをnewするとか言い出したらセンスなさすぎて笑うわ
もう本当めんどくさい。
ファクトリの話聞いてなかったの?
ファクトリメソッドとアブストラクトファクトリ調べてみろよ。
これみて、インスタンスを必要とするクラスの中でファクトリをnewするとか言い出したらセンスなさすぎて笑うわ
198仕様書無しさん
2018/05/09(水) 10:29:04.95 ここに良いことが書いてあるな
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
> 一部のデザインパターンは、プログラミング言語(例: Java, C++)の機能の
> 欠損の印であると主張されることがある。計算機科学者のピーター・ノーヴィグは、
> GoFによるデザインパターン本の23パターンのうち16パターンは、言語による
> サポートによって単純化または除去できることをLispやDylanを用いて実演した[3]。
DIもこれと同じ。コンストラクタインジェクションなんてものが必要になるのは
プログラミング言語の機能の欠損の印
言語によるサポートによって単純化または除去できる
(だからその機能が標準で搭載されていない言語ではDIコンテナなんてものが必要になっている)
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
> 一部のデザインパターンは、プログラミング言語(例: Java, C++)の機能の
> 欠損の印であると主張されることがある。計算機科学者のピーター・ノーヴィグは、
> GoFによるデザインパターン本の23パターンのうち16パターンは、言語による
> サポートによって単純化または除去できることをLispやDylanを用いて実演した[3]。
DIもこれと同じ。コンストラクタインジェクションなんてものが必要になるのは
プログラミング言語の機能の欠損の印
言語によるサポートによって単純化または除去できる
(だからその機能が標準で搭載されていない言語ではDIコンテナなんてものが必要になっている)
200仕様書無しさん
2018/05/09(水) 10:38:40.01 オブジェクトのライフサイクル
一人目
パズルや塗り絵、ブロック遊び感覚で、好き放題にオブジェクト迷路を作って楽しめる
お客の求める物とのズレに薄々気付いており、機をみてリタイア
二人目
最初の理想は分からないが、使命感を持って頑張る
instanceof、ダウンキャスト、クラス変数、DBメッセージングなど、手持ちの武器で頑張る
心を病んでリタイア
三人目
「マジ死ねよクソハンガリアン」等の独り言で職場の空気を汚しながら頑張る
この頃になるとお客側でも、Excel運用や帳票の手書き修正などの業務手順が増えてくる
お客との折衝役だった上のSEがリタイア
自分も合わせてリタイア
システムリプレース
新しいSIerがやってきた
前システムのクソさを目の当たりにした担当者は、自分なりの理想と、狭い視野を以て編み出した部分最適のアイデアを胸に、一人目のプログラマとなる
一人目
パズルや塗り絵、ブロック遊び感覚で、好き放題にオブジェクト迷路を作って楽しめる
お客の求める物とのズレに薄々気付いており、機をみてリタイア
二人目
最初の理想は分からないが、使命感を持って頑張る
instanceof、ダウンキャスト、クラス変数、DBメッセージングなど、手持ちの武器で頑張る
心を病んでリタイア
三人目
「マジ死ねよクソハンガリアン」等の独り言で職場の空気を汚しながら頑張る
この頃になるとお客側でも、Excel運用や帳票の手書き修正などの業務手順が増えてくる
お客との折衝役だった上のSEがリタイア
自分も合わせてリタイア
システムリプレース
新しいSIerがやってきた
前システムのクソさを目の当たりにした担当者は、自分なりの理想と、狭い視野を以て編み出した部分最適のアイデアを胸に、一人目のプログラマとなる
201仕様書無しさん
2018/05/09(水) 11:07:02.66 ソフトウエアの問題は
それがどんなに技術的に見えようとも
人間の問題に帰結する
って偉い人が言ってた。
それがどんなに技術的に見えようとも
人間の問題に帰結する
って偉い人が言ってた。
203仕様書無しさん
2018/05/09(水) 11:24:50.46 >>198
もうわかった。おれのまけだよ。
僕は無知でプログラマ失格なので、どうしたらコンストラクタインジェクションやDIが不要になるのか教えてもらっていいですか。
そしてそれはどうメリットがあるのかも教えてください。
もうわかった。おれのまけだよ。
僕は無知でプログラマ失格なので、どうしたらコンストラクタインジェクションやDIが不要になるのか教えてもらっていいですか。
そしてそれはどうメリットがあるのかも教えてください。
204仕様書無しさん
2018/05/09(水) 12:07:53.31 >>203
まずDIすることが目的となってるのが駄目。ストラテジーパターンは、アルゴリズムを実行時に選択したいという
はっきりした目的がある。そして実装は、所詮実装例でしかないコンストラクタインジェクションなんか完全に実装の話
何度も言っているが、内部で使用するオブジェクトを切り替える必要がないなら
外部から渡す必要はない。内部だけで使用するものは、内部に閉じ込めておくことで
コンポーネントをブラックボックスとして使えるようになる
使う側は内部で何をやっているかを気にしなくて良くなるのでコンポーネントの独立性が上がる。
これがメリットまた注入する側が、注入しなくて良くなるので使う側のコードがシンプルになる。これもメリット
内部で使用するオブジェクトを切り替える必要がないという前提なので当然決め打ちで良い。
残る問題はテストしかないはずなんだが、俺がテストの話をすると、テスト以外でも切り替えることがあるとか
意味不明な事を言うのはなんでだ? オブジェクトを切り替える必要がないという前提の話なんだからあるはずがない
テストのためだけに、コンストラクタを歪ませ、インターフェースを
別に作るとか複雑化させるのはデメリットでしかない
テストのためなんだから、テストのために特化した機能を言語仕様に付け加えればいい
例えば内部でnewするのを、専用の構文で行うようにして
その場合は簡単にモックに入れ替えるようにするなどだ
言語仕様にないから、それを行うDIコンテナというフレームワークが作られるわけだが、
当然使ってるフレームワークでやり方がバラバラ。ウェブアプリフレームワークは
どのDIコンテナフレームワークを使ってますかね?それに合わせなきゃという問題が発生する
言語仕様にDIコンテナ相当の機能があれば、こんな問題はなくなるし、
そもそもテストぐらいにしか必要ないのだから、大げさな機能はいらない
DIを目的にしてるから、元々シンプルだったものが、コンストラクタインジェクションやら
インターフェースやらでてきて、複雑になるだけで終わる。
いやテストが楽になるというメリットがあるか?それだけのために過剰な設計変更が行われるわけだが
まずDIすることが目的となってるのが駄目。ストラテジーパターンは、アルゴリズムを実行時に選択したいという
はっきりした目的がある。そして実装は、所詮実装例でしかないコンストラクタインジェクションなんか完全に実装の話
何度も言っているが、内部で使用するオブジェクトを切り替える必要がないなら
外部から渡す必要はない。内部だけで使用するものは、内部に閉じ込めておくことで
コンポーネントをブラックボックスとして使えるようになる
使う側は内部で何をやっているかを気にしなくて良くなるのでコンポーネントの独立性が上がる。
これがメリットまた注入する側が、注入しなくて良くなるので使う側のコードがシンプルになる。これもメリット
内部で使用するオブジェクトを切り替える必要がないという前提なので当然決め打ちで良い。
残る問題はテストしかないはずなんだが、俺がテストの話をすると、テスト以外でも切り替えることがあるとか
意味不明な事を言うのはなんでだ? オブジェクトを切り替える必要がないという前提の話なんだからあるはずがない
テストのためだけに、コンストラクタを歪ませ、インターフェースを
別に作るとか複雑化させるのはデメリットでしかない
テストのためなんだから、テストのために特化した機能を言語仕様に付け加えればいい
例えば内部でnewするのを、専用の構文で行うようにして
その場合は簡単にモックに入れ替えるようにするなどだ
言語仕様にないから、それを行うDIコンテナというフレームワークが作られるわけだが、
当然使ってるフレームワークでやり方がバラバラ。ウェブアプリフレームワークは
どのDIコンテナフレームワークを使ってますかね?それに合わせなきゃという問題が発生する
言語仕様にDIコンテナ相当の機能があれば、こんな問題はなくなるし、
そもそもテストぐらいにしか必要ないのだから、大げさな機能はいらない
DIを目的にしてるから、元々シンプルだったものが、コンストラクタインジェクションやら
インターフェースやらでてきて、複雑になるだけで終わる。
いやテストが楽になるというメリットがあるか?それだけのために過剰な設計変更が行われるわけだが
205仕様書無しさん
2018/05/09(水) 12:14:05.98 ああ、本末転倒ってのはこの事だな。
206仕様書無しさん
2018/05/09(水) 12:17:16.97 目的がないのにDIつかうんじゃねーよ。
この一言につきるな
っていうか目的があればデザインパターン名を言ってるだろう。
目的がないのに、なんとなく内部で生成するのをやめたいというのを
専門用語っぽくDIといってるだけ
この一言につきるな
っていうか目的があればデザインパターン名を言ってるだろう。
目的がないのに、なんとなく内部で生成するのをやめたいというのを
専門用語っぽくDIといってるだけ
207仕様書無しさん
2018/05/09(水) 12:49:27.43 俺も差し替えたいとこだけDI派
インターフェースを分離しなくてもユニットテストはモックでできるし
クラスの数だけインターフェースを定義してる思考停止プロジェクト多すぎなw
インターフェースを分離しなくてもユニットテストはモックでできるし
クラスの数だけインターフェースを定義してる思考停止プロジェクト多すぎなw
209仕様書無しさん
2018/05/09(水) 14:13:34.40 同僚や自分が作ったクラスはほぼDIって言ってる奴ならいるけどな
210仕様書無しさん
2018/05/09(水) 14:13:48.72211仕様書無しさん
2018/05/09(水) 14:14:28.24 >>204
>>210のつづき
もう一度言うけど、クラスにはレイヤーがあって、Stringのような言語に実装されたクラスは、疎結合破壊を起こさないからどこでnewしても問題なしと言っている。
また、フレームワークやライブラリに定義されたクラスも、比較的レイヤーが深くなるのでnewによる疎結合破壊を気にしなくてよい、と言った。
ただ、自分や同僚が作ったクラスは、最もレイヤーの浅いアプリケーション層とその次にレイヤーの浅い独自ライブラリ層のクラスだ。
浅いレイヤーに位置するクラスが、それより深いレイヤーに位置するクラスに依存してはならないのは疎結合の基本だよね。
わからない人もいるかもしれないからあえて言うけど、レイヤーの最も浅いアプリケーション層のクラスは、疎結合を一気に破壊する恐ろしい代物なのだよ。
オブジェクト指向ではときに、コードの再利用性の話がなされるけど
「コードの再利用性なんぞユートピア」と主張する人たちがいる。
この人たちはおそらく、独自ライブラリに直接、アプリケーション層のクラスをnewしてしまう人たちなんじゃないかな?
だからコードの再利用なんて不可能、って思うわけだ。
だから俺が言いたいのは、何でもかんでもDIしろというわけじゃなくて
あなたがクラス内部でnewしたソレのせいで、コードの再利用性(疎結合)失われていませんか?ってことが言いたいの。
もしソレが起こらないなら胸を張ってクラス内部で具象maxのクラスをnewすればいいさ。
そこんとこわかった上で、DIを否定し、内部でnewすべきという話なのであれば、僕と君との意見は合致しており、争う点はなに一つないということになる。
君もコンストラクタインジェクションに利用価値があり、使える時は使えると思っているわけだろう?
それなら、僕たちは同じ結論に辿り着いているにもかかわらず、どちらを主に会話をしているかという違いだけで争ってることになる。
この文章を読んで引っかかる点があったら指摘してくれ
>>210のつづき
もう一度言うけど、クラスにはレイヤーがあって、Stringのような言語に実装されたクラスは、疎結合破壊を起こさないからどこでnewしても問題なしと言っている。
また、フレームワークやライブラリに定義されたクラスも、比較的レイヤーが深くなるのでnewによる疎結合破壊を気にしなくてよい、と言った。
ただ、自分や同僚が作ったクラスは、最もレイヤーの浅いアプリケーション層とその次にレイヤーの浅い独自ライブラリ層のクラスだ。
浅いレイヤーに位置するクラスが、それより深いレイヤーに位置するクラスに依存してはならないのは疎結合の基本だよね。
わからない人もいるかもしれないからあえて言うけど、レイヤーの最も浅いアプリケーション層のクラスは、疎結合を一気に破壊する恐ろしい代物なのだよ。
オブジェクト指向ではときに、コードの再利用性の話がなされるけど
「コードの再利用性なんぞユートピア」と主張する人たちがいる。
この人たちはおそらく、独自ライブラリに直接、アプリケーション層のクラスをnewしてしまう人たちなんじゃないかな?
だからコードの再利用なんて不可能、って思うわけだ。
だから俺が言いたいのは、何でもかんでもDIしろというわけじゃなくて
あなたがクラス内部でnewしたソレのせいで、コードの再利用性(疎結合)失われていませんか?ってことが言いたいの。
もしソレが起こらないなら胸を張ってクラス内部で具象maxのクラスをnewすればいいさ。
そこんとこわかった上で、DIを否定し、内部でnewすべきという話なのであれば、僕と君との意見は合致しており、争う点はなに一つないということになる。
君もコンストラクタインジェクションに利用価値があり、使える時は使えると思っているわけだろう?
それなら、僕たちは同じ結論に辿り着いているにもかかわらず、どちらを主に会話をしているかという違いだけで争ってることになる。
この文章を読んで引っかかる点があったら指摘してくれ
212仕様書無しさん
2018/05/09(水) 14:21:16.03 > 君もコンストラクタインジェクションに利用価値があり、使える時は使えると思っているわけだろう?
ただのオブジェクトを引数にして呼び出すことを
コンストラクタインジェクションなんて名前つけるんじゃねーよ
ほんとバズワードの塊だな
ただのオブジェクトを引数にして呼び出すことを
コンストラクタインジェクションなんて名前つけるんじゃねーよ
ほんとバズワードの塊だな
213仕様書無しさん
2018/05/09(水) 14:27:51.21 > あなたがクラス内部でnewしたソレのせいで、コードの再利用性(疎結合)失われていませんか?ってことが言いたいの。
クラス内部でnewしたソレのせいで、コードの再利用性(疎結合)失われているから
外部から与えようという考え方がおかしいっていうの
内部に隠蔽できるものを外部にだすなと
だいたい再利用もしねーだろ。入れ替えることもしない。
再利用しないけど再利用できるようにするとか
無駄な作業
クラス内部でnewしたからって何だって言うんだ?
再利用しないけど再利用性失われてませんかねぇ?
特に問題ないけど、外部でnewすると、なにかが解決するんじゃないですかねぇ?
しらんがな。
問題がなにで(再利用はしない)なにが解決するのか言えって。
クラス内部でnewすることが密結合になると決めつけ
密結合が問題だって決めつけてるだけだろう
クラス内部でnewしたソレのせいで、コードの再利用性(疎結合)失われているから
外部から与えようという考え方がおかしいっていうの
内部に隠蔽できるものを外部にだすなと
だいたい再利用もしねーだろ。入れ替えることもしない。
再利用しないけど再利用できるようにするとか
無駄な作業
クラス内部でnewしたからって何だって言うんだ?
再利用しないけど再利用性失われてませんかねぇ?
特に問題ないけど、外部でnewすると、なにかが解決するんじゃないですかねぇ?
しらんがな。
問題がなにで(再利用はしない)なにが解決するのか言えって。
クラス内部でnewすることが密結合になると決めつけ
密結合が問題だって決めつけてるだけだろう
214仕様書無しさん
2018/05/09(水) 14:29:41.62215仕様書無しさん
2018/05/09(水) 14:34:36.72 >>211
> ただ、自分や同僚が作ったクラスは、最もレイヤーの浅いアプリケーション層とその次にレイヤーの浅い独自ライブラリ層のクラスだ。
>
> 浅いレイヤーに位置するクラスが、それより深いレイヤーに位置するクラスに依存してはならないのは疎結合の基本だよね。
>
> わからない人もいるかもしれないからあえて言うけど、レイヤーの最も浅いアプリケーション層のクラスは、疎結合を一気に破壊する恐ろしい代物なのだよ。
独自ライブラリ層(笑)また新しいオレオレ用語がでてきた。
そんなに層が重要なら、すべての層をガッチリと定義してから話せよ
そしたら、そんなにその浅いレイヤーが深いレイヤーに依存してはならないっていうのなら
それこそ疎結合を守るためにレイヤーを分離するような言語仕様が必要だっていうからさ
DIなんかよりも「privateはクラス外部から参照できない」みたいな
レイヤーNは、レイヤーMに依存できないように制限する言語仕様を作るほうが大事だろ
> ただ、自分や同僚が作ったクラスは、最もレイヤーの浅いアプリケーション層とその次にレイヤーの浅い独自ライブラリ層のクラスだ。
>
> 浅いレイヤーに位置するクラスが、それより深いレイヤーに位置するクラスに依存してはならないのは疎結合の基本だよね。
>
> わからない人もいるかもしれないからあえて言うけど、レイヤーの最も浅いアプリケーション層のクラスは、疎結合を一気に破壊する恐ろしい代物なのだよ。
独自ライブラリ層(笑)また新しいオレオレ用語がでてきた。
そんなに層が重要なら、すべての層をガッチリと定義してから話せよ
そしたら、そんなにその浅いレイヤーが深いレイヤーに依存してはならないっていうのなら
それこそ疎結合を守るためにレイヤーを分離するような言語仕様が必要だっていうからさ
DIなんかよりも「privateはクラス外部から参照できない」みたいな
レイヤーNは、レイヤーMに依存できないように制限する言語仕様を作るほうが大事だろ
216仕様書無しさん
2018/05/09(水) 14:42:34.04 >>214
> DIとかコンストラクタインジェクションって言葉が生まれた原因は、
> コンポジションを使えばいいところで、継承を使ってしまう人が多い事態が生んだバズワードだ。
それは関係ない。コンポジションを使っている場面で、
おいおい、コンポジション使ったら、テストしづれーよ
どうするよ?
ってなった時に、しゃーねーから、内部で生成するものを
外部から与えるか。この言語仕様じゃこれしかやれないしな
という、言語仕様の限界を回避するためのワークアラウンドに
名前をつけただけ
本来ならコンポジションを使っていたとしても、外部から与えずに
テストできるようにすべきだった
なおコレはコンポジションのオブジェクトを変更する理由がない場合
ストラテジーパターンのように、戦略を変更する必要があるため
コンストラクタやメソッドの"引数"で戦略用のオブジェクトを渡して
変更できるようにするのとはまったく別の話
> DIとかコンストラクタインジェクションって言葉が生まれた原因は、
> コンポジションを使えばいいところで、継承を使ってしまう人が多い事態が生んだバズワードだ。
それは関係ない。コンポジションを使っている場面で、
おいおい、コンポジション使ったら、テストしづれーよ
どうするよ?
ってなった時に、しゃーねーから、内部で生成するものを
外部から与えるか。この言語仕様じゃこれしかやれないしな
という、言語仕様の限界を回避するためのワークアラウンドに
名前をつけただけ
本来ならコンポジションを使っていたとしても、外部から与えずに
テストできるようにすべきだった
なおコレはコンポジションのオブジェクトを変更する理由がない場合
ストラテジーパターンのように、戦略を変更する必要があるため
コンストラクタやメソッドの"引数"で戦略用のオブジェクトを渡して
変更できるようにするのとはまったく別の話
218仕様書無しさん
2018/05/09(水) 15:09:56.27 >>217
そりゃそうだ。
もともとクラス内部でnewしていればよかったのに、
コンストラクタに必要なかった引数を追加して、
なぜかインターフェースが必要なんですとか言って作らされ
クラス内部でnewしていれば一箇所ですんだのに
呼び出し毎にnewしなくちゃいけなくなって、
複数段階で依存している場合、さらに大変になって
手動でDIするのは大変ですよね?だからDIコンテナを使いましょう
とか言い出して、もともとクラス内部でnewしていれば終わりだったものが
最終的にはDIコンテナというフレームワークとXMLなどによる設定に膨れ上がるんだぞ
それで手に入るのが、再利用しないのに再利用性があがりました!
はっはっは。無駄以外の何物でもない
そりゃそうだ。
もともとクラス内部でnewしていればよかったのに、
コンストラクタに必要なかった引数を追加して、
なぜかインターフェースが必要なんですとか言って作らされ
クラス内部でnewしていれば一箇所ですんだのに
呼び出し毎にnewしなくちゃいけなくなって、
複数段階で依存している場合、さらに大変になって
手動でDIするのは大変ですよね?だからDIコンテナを使いましょう
とか言い出して、もともとクラス内部でnewしていれば終わりだったものが
最終的にはDIコンテナというフレームワークとXMLなどによる設定に膨れ上がるんだぞ
それで手に入るのが、再利用しないのに再利用性があがりました!
はっはっは。無駄以外の何物でもない
219仕様書無しさん
2018/05/09(水) 15:13:59.65 >>215
> そしたら、そんなにその浅いレイヤーが深いレイヤーに依存してはならないっていうのなら
> それこそ疎結合を守るためにレイヤーを分離するような言語仕様が必要だ
何回か言ってたよねそれ、でも話脱線しちゃうでしょ!
そんなこと言ったら、おれも日々LISPが実用になる時代来ないかなって思ってるわww
唯一、言語レベルで抽象度上げられる言語だろlispって。
まあrubyでもできるかもしれないけど。強力なマクロとかLISPにしかできないことがワンサカあるわけで。
レイヤーを分離する言語仕様って考え方は好きだよ。でも悲しいことにそれができる言語で
仕事できるほど未来に生きてないだろ、俺たちは。
> そしたら、そんなにその浅いレイヤーが深いレイヤーに依存してはならないっていうのなら
> それこそ疎結合を守るためにレイヤーを分離するような言語仕様が必要だ
何回か言ってたよねそれ、でも話脱線しちゃうでしょ!
そんなこと言ったら、おれも日々LISPが実用になる時代来ないかなって思ってるわww
唯一、言語レベルで抽象度上げられる言語だろlispって。
まあrubyでもできるかもしれないけど。強力なマクロとかLISPにしかできないことがワンサカあるわけで。
レイヤーを分離する言語仕様って考え方は好きだよ。でも悲しいことにそれができる言語で
仕事できるほど未来に生きてないだろ、俺たちは。
222仕様書無しさん
2018/05/09(水) 15:40:04.01 >>221
ゼロだろうね
なんでDIはIoCという名前から変更したんだろうか
IoC(制御の反転)の方がわかりやすいではないか。
そうだよ。"反転"なんだよ。自然な流れから反転してる。
ストラテジーパターンなどは、そもそも反転ではない。
目的がはっきりしており、その流れに従った自然な設計
制御を反転させたときだけDIと呼ぶべきなんだが
そうじゃないものまで該当すると錯覚させるために
DIという名前に変更したんだろうな
ともかく制御の反転が目的のDIのメリットはゼロ
オブジェクトを入れ替えないなら、クラス内部でnewしたほうが良い
ゼロだろうね
なんでDIはIoCという名前から変更したんだろうか
IoC(制御の反転)の方がわかりやすいではないか。
そうだよ。"反転"なんだよ。自然な流れから反転してる。
ストラテジーパターンなどは、そもそも反転ではない。
目的がはっきりしており、その流れに従った自然な設計
制御を反転させたときだけDIと呼ぶべきなんだが
そうじゃないものまで該当すると錯覚させるために
DIという名前に変更したんだろうな
ともかく制御の反転が目的のDIのメリットはゼロ
オブジェクトを入れ替えないなら、クラス内部でnewしたほうが良い
223仕様書無しさん
2018/05/09(水) 15:46:45.76 余談だけど、テストをするためだけに
インターフェースを作るっていうのも馬鹿げてる
インターフェースを作るっていうのも馬鹿げてる
224仕様書無しさん
2018/05/09(水) 16:50:54.16 >>182
コンストラクタインジェクションを意図的に使ったり避けたりすることはない。
リファクタリングが完全に終わった段階で、
コンストラクタインジェクションが残っていれば必要だったということなのだから残しておけばいいし、
残っていなければ必要なかったのだからそのままにしておけばいい。
改修するときに要否が変わったらまたリファクタリングすればいい。
要するにカプセル化と一緒で結果に付いてくるものだから、開発中に考える意味も必要性もない。
自分の場合はコンストラクタインジェクションが最終的に残っていることは少ないけど。
コンストラクタインジェクションを意図的に使ったり避けたりすることはない。
リファクタリングが完全に終わった段階で、
コンストラクタインジェクションが残っていれば必要だったということなのだから残しておけばいいし、
残っていなければ必要なかったのだからそのままにしておけばいい。
改修するときに要否が変わったらまたリファクタリングすればいい。
要するにカプセル化と一緒で結果に付いてくるものだから、開発中に考える意味も必要性もない。
自分の場合はコンストラクタインジェクションが最終的に残っていることは少ないけど。
226仕様書無しさん
2018/05/10(木) 08:09:36.52 クラスAがクラスBを使ってるとき
クラスA、Bのソースを変更せずに
問題箇所をどちらか特定するには
どうするか答えなさい(10点)
クラスA、Bのソースを変更せずに
問題箇所をどちらか特定するには
どうするか答えなさい(10点)
227仕様書無しさん
2018/05/10(木) 08:09:38.81 それはプロは効率ではなく人海戦術が
お好きってやつですかね?w
お好きってやつですかね?w
228仕様書無しさん
2018/05/10(木) 08:11:03.19232仕様書無しさん
2018/05/10(木) 10:11:43.78 隠蔽してんだから外部から見えないのは当たり前なんだけど、テストツールの為だけに隠蔽するなって言ってるって事か?
234仕様書無しさん
2018/05/10(木) 17:25:06.93237仕様書無しさん
2018/05/10(木) 17:54:26.38 クラスの中にしか存在しないクラスなんていくらでもあるが?
238仕様書無しさん
2018/05/10(木) 18:08:20.28 つまり、もともと隠蔽されていたものを出すのなんて、
そんな破廉恥なのは辞めろという主張と、
外から与えられていたおかずを自家発電するなんて、
何を妄想しているかわからない上に、おかずを入れ替えることもできないから辞めろという主張の争いだな
根本的に別の話だから一生噛み合うことはないぞ
そんな破廉恥なのは辞めろという主張と、
外から与えられていたおかずを自家発電するなんて、
何を妄想しているかわからない上に、おかずを入れ替えることもできないから辞めろという主張の争いだな
根本的に別の話だから一生噛み合うことはないぞ
239仕様書無しさん
2018/05/10(木) 18:10:27.00 いや、DI、元の名前をIoC(制御の反転)
制御を反転させるのをやめろってだけ
正しい流れにすれば良い。そのうえで
外部から見れる必要がないなら隠蔽しろ
制御を反転させるのをやめろってだけ
正しい流れにすれば良い。そのうえで
外部から見れる必要がないなら隠蔽しろ
240仕様書無しさん
2018/05/10(木) 18:31:06.09 たしかに秘部を外から与えるのは変な制御だな
それは元々備わっているべきものだ
それは元々備わっているべきものだ
241仕様書無しさん
2018/05/10(木) 18:32:41.38 >>239
もはや誰と戦ってるの?
「テストのために全部DIしろ」なんて言ってる人このスレに1人も居ないんだけど
DIいいよねーって思ってる俺とか他の人も「外部から見れる必要ないなら内部で」って当然思ってるよ
もはや誰と戦ってるの?
「テストのために全部DIしろ」なんて言ってる人このスレに1人も居ないんだけど
DIいいよねーって思ってる俺とか他の人も「外部から見れる必要ないなら内部で」って当然思ってるよ
242仕様書無しさん
2018/05/10(木) 18:34:45.43 DIが嫌いすぎて、時々いいこと言うのに
時々感情に流されて意味不明なこというよね
DIのメリットゼロとかww
時々感情に流されて意味不明なこというよね
DIのメリットゼロとかww
243仕様書無しさん
2018/05/10(木) 18:41:04.51244仕様書無しさん
2018/05/10(木) 18:41:54.37 226 名前:仕様書無しさん[sage] 投稿日:2018/05/10(木) 08:09:36.52
クラスAがクラスBを使ってるとき
クラスA、Bのソースを変更せずに
問題箇所をどちらか特定するには
どうするか答えなさい(10点)
228 自分:仕様書無しさん[sage] 投稿日:2018/05/10(木) 08:11:03.19
>>226
使われてる方、言い換えるなら単体で使えるクラスBを先にテストします。
クラスBに問題がなければクラスAに問題があります。
100点満点の回答にぐうのねもでない(笑)
クラスAがクラスBを使ってるとき
クラスA、Bのソースを変更せずに
問題箇所をどちらか特定するには
どうするか答えなさい(10点)
228 自分:仕様書無しさん[sage] 投稿日:2018/05/10(木) 08:11:03.19
>>226
使われてる方、言い換えるなら単体で使えるクラスBを先にテストします。
クラスBに問題がなければクラスAに問題があります。
100点満点の回答にぐうのねもでない(笑)
245仕様書無しさん
2018/05/10(木) 18:49:10.90 DIが必要なときもあるけど、
それはそうせざるを得ないときであって、
できれば使いたくない
「イイね」とは思わない
>>244
出題時は10点が満点だったのに、
配点時に100点満点になるとかバライティーかよ
それはそうせざるを得ないときであって、
できれば使いたくない
「イイね」とは思わない
>>244
出題時は10点が満点だったのに、
配点時に100点満点になるとかバライティーかよ
249仕様書無しさん
2018/05/10(木) 20:21:47.08 日本じゃ具が見えちゃったら捕まるだろ。
250仕様書無しさん
2018/05/10(木) 23:21:22.02 ざっくり捉える
終わり
終わり
251仕様書無しさん
2018/05/10(木) 23:45:10.98 俺の結論としてDI好きとDIアンチの違いは
コード再利用性肯定派と否定派の争いだったんだって
このスレに気が付かされたよ。
何度も言うけどDIのメリットはユニットテストではない
DI否定派がユニットテストのせいでDI対応に追われて
アンチになるのは仕方ないとして、DIのメリットは疎結合とコード再利用にある。
で、その話をすると「再利用しないのに疎結合とかwww」ってなるわけだよ。
つまりDIの争いの本質はコード再利用性の争いだったんだ!
コード再利用性肯定派と否定派の争いだったんだって
このスレに気が付かされたよ。
何度も言うけどDIのメリットはユニットテストではない
DI否定派がユニットテストのせいでDI対応に追われて
アンチになるのは仕方ないとして、DIのメリットは疎結合とコード再利用にある。
で、その話をすると「再利用しないのに疎結合とかwww」ってなるわけだよ。
つまりDIの争いの本質はコード再利用性の争いだったんだ!
252仕様書無しさん
2018/05/10(木) 23:46:49.22 バカっぽい文章w
253仕様書無しさん
2018/05/10(木) 23:47:33.07 今日はどいつもこいつも思考が破綻してる
255仕様書無しさん
2018/05/10(木) 23:55:47.93 再利用しなくても疎結合に、疎結合にさえしておけば!
疎結合にしておけばどんな特があるのでしょうか?
疎結合にしておけばどんな特があるのでしょうか?
256仕様書無しさん
2018/05/11(金) 00:00:03.96 DI使っているものが、DIを何のために使ってるか
理解してないんだよなぁ
理解してないんだよなぁ
258仕様書無しさん
2018/05/11(金) 00:03:52.84 再利用しないのになんでコピペ?
259仕様書無しさん
2018/05/11(金) 00:07:32.78 再利用「しないのに」とか言ってる地点で、争いは止まん
260仕様書無しさん
2018/05/11(金) 00:15:38.39 【コード再利用性】
学術的には新規設計時に確保されるが、
現実的には実際に再利用する時に慌てて確保される品質。
数多の啓蒙活動や普及活動、言語機能などによる支援が行われてきたが、
「再利用性の確保が根付いた団体を見た」という証言に信頼できるものは未だに存在せず、
神話上の概念ではないかという声も根強い。
学術的には新規設計時に確保されるが、
現実的には実際に再利用する時に慌てて確保される品質。
数多の啓蒙活動や普及活動、言語機能などによる支援が行われてきたが、
「再利用性の確保が根付いた団体を見た」という証言に信頼できるものは未だに存在せず、
神話上の概念ではないかという声も根強い。
261仕様書無しさん
2018/05/11(金) 00:21:04.75 jre.jarとか再利用されまくってるやん
264仕様書無しさん
2018/05/11(金) 05:36:49.29 クラス内部でnewしようが、コンストラクタインジェクションしようが
品質にも再利用性にも違いはないよ。だってコンストラクタで
newしているものを引数から受け取るだけなんだから
品質にも再利用性にも違いはないよ。だってコンストラクタで
newしているものを引数から受け取るだけなんだから
266仕様書無しさん
2018/05/11(金) 06:27:08.76 作り逃げの派遣と
秘伝のタレの内製と
じゃDIの必要性が違うだろ
秘伝のタレの内製と
じゃDIの必要性が違うだろ
268仕様書無しさん
2018/05/11(金) 06:43:11.08 つーか、結局テストの話になるんだよなw
269仕様書無しさん
2018/05/11(金) 06:55:08.87 ならない
本来、依存性がコード全体に散らばるか、メインにまとまるかの話になる
本来、依存性がコード全体に散らばるか、メインにまとまるかの話になる
270仕様書無しさん
2018/05/11(金) 07:00:05.15 はぁ?だから依存していてなにが駄目なんだって
聞いてるだろ。たかが内部でnewするかどうかの違いで
聞いてるだろ。たかが内部でnewするかどうかの違いで
271仕様書無しさん
2018/05/11(金) 07:01:58.64273仕様書無しさん
2018/05/11(金) 07:21:01.11 オブジェクト指向でのオブジェクトとは有機体であると考えろという主張を見た事あります
つまり現実世界を模倣しろという解釈だと思うのですが、オブジェクト指向の本質を捉えている主張だと思われますか?
概念は難しいなと感じてます
つまり現実世界を模倣しろという解釈だと思うのですが、オブジェクト指向の本質を捉えている主張だと思われますか?
概念は難しいなと感じてます
274仕様書無しさん
2018/05/11(金) 07:26:24.23 >>273
それはオプジェクト指向設計の話だからおまえには関係ない
それはオプジェクト指向設計の話だからおまえには関係ない
276仕様書無しさん
2018/05/11(金) 07:38:36.36 >>273
「オブジェクト指向でなぜ作るのか」って本がわかりやすいよ。
現実世界を模倣できるというのは誤解だということが解説してある。
クラス化はグローバル変数のスコープを絞って、
まとまった単位で複製できるようにすることだとも書いてある。
「オブジェクト指向でなぜ作るのか」って本がわかりやすいよ。
現実世界を模倣できるというのは誤解だということが解説してある。
クラス化はグローバル変数のスコープを絞って、
まとまった単位で複製できるようにすることだとも書いてある。
277273
2018/05/11(金) 07:45:04.81 オブジェクト指向の設計ではオブジェクトを有機体として捉え、内部仕様的にはオブジェクトをスコープの境界として捉えるのがオブジェクト指向を用いた開発なのでしょうか?
そう考えると犬猫ワンニャンの例は概念設計と内部設計の両方を含んだ素晴らしい例って気がしてきました
そう考えると犬猫ワンニャンの例は概念設計と内部設計の両方を含んだ素晴らしい例って気がしてきました
279仕様書無しさん
2018/05/11(金) 07:55:06.14 >>275
なんでいきなりクラスCがでてきてるんだよ。
論理展開がボロボロじゃねーかw
クラスAがクラスBを使っている時、
クラスA, Bが共通に内部でnewされたクラスCを
使っていた場合でいいんだよな?
言いたいことがさっぱり分からないが、
クラスCをシングルトンにしろって話か?
動作しない場合があるじゃなくて、
もう少し具体的な話をしろ
なんでいきなりクラスCがでてきてるんだよ。
論理展開がボロボロじゃねーかw
クラスAがクラスBを使っている時、
クラスA, Bが共通に内部でnewされたクラスCを
使っていた場合でいいんだよな?
言いたいことがさっぱり分からないが、
クラスCをシングルトンにしろって話か?
動作しない場合があるじゃなくて、
もう少し具体的な話をしろ
281仕様書無しさん
2018/05/11(金) 07:59:18.49283仕様書無しさん
2018/05/11(金) 08:00:35.30 >>273
> つまり現実世界を模倣しろという解釈だと思うのですが、オブジェクト指向の本質を捉えている主張だと思われますか?
違う。そもそも現実世界なんて複雑過ぎて解析でない
現実世界を単純化したモデルを作れということ
地球のシミュレーションが目的でない限り現実世界をそのまま模倣する必要はない
やるべき目的を実現するのに必要十分な単純化したモデルを作ることが
オブジェクト指向の本質
> つまり現実世界を模倣しろという解釈だと思うのですが、オブジェクト指向の本質を捉えている主張だと思われますか?
違う。そもそも現実世界なんて複雑過ぎて解析でない
現実世界を単純化したモデルを作れということ
地球のシミュレーションが目的でない限り現実世界をそのまま模倣する必要はない
やるべき目的を実現するのに必要十分な単純化したモデルを作ることが
オブジェクト指向の本質
284仕様書無しさん
2018/05/11(金) 08:02:08.97 本当に怖いのはクラスAへの参照をクラスBが受け取って使っていた時なんだけどな
循環参照はマジで辞めたほうがいい
しかし現場ではよくある
循環参照はマジで辞めたほうがいい
しかし現場ではよくある
285仕様書無しさん
2018/05/11(金) 08:02:11.97287仕様書無しさん
2018/05/11(金) 08:05:16.18 >>286
だからなんでたかが内部でnewすることで発生する
依存性程度で、大きな問題になるのかって言ってるんだよ。
依存性といっても小さなものから大きなものまで広く存在する。
コンストラクタ内部でnewする程度では発生する依存性なんて
小さいものだ
だからなんでたかが内部でnewすることで発生する
依存性程度で、大きな問題になるのかって言ってるんだよ。
依存性といっても小さなものから大きなものまで広く存在する。
コンストラクタ内部でnewする程度では発生する依存性なんて
小さいものだ
288仕様書無しさん
2018/05/11(金) 08:07:58.61 >>283
そうそう。
で、人は作れるものはロボットのようなカラクリであり、有機体を作れないので
考え方としてオブジェクト指向の世界は、ゲームのようなSFカラクリワールドだとイメージすることで
有機体を作れない矛盾を排除できる、というわけさ
そうそう。
で、人は作れるものはロボットのようなカラクリであり、有機体を作れないので
考え方としてオブジェクト指向の世界は、ゲームのようなSFカラクリワールドだとイメージすることで
有機体を作れない矛盾を排除できる、というわけさ
290仕様書無しさん
2018/05/11(金) 08:12:09.70 >>289
> 依存性の大きさや小ささは、何で左右するの?
参照の多さと条件分岐
参照の数が多ければ、それだけ依存している箇所が多いということだし
条件分岐が多ければ、どのように依存しているかが分かりづらくなる
今回は、コンストラクタ内部でnewで行うのと、
コンストラクタ内部でnewで行わず、単に外でnewするのの違いでしかないので
参照の数はコンストラクタ内部でやったほうが少なくなるし、
条件分岐の数は変わらない
> 依存性の大きさや小ささは、何で左右するの?
参照の多さと条件分岐
参照の数が多ければ、それだけ依存している箇所が多いということだし
条件分岐が多ければ、どのように依存しているかが分かりづらくなる
今回は、コンストラクタ内部でnewで行うのと、
コンストラクタ内部でnewで行わず、単に外でnewするのの違いでしかないので
参照の数はコンストラクタ内部でやったほうが少なくなるし、
条件分岐の数は変わらない
294仕様書無しさん
2018/05/11(金) 08:18:44.70 >>292
何かの条件によって、依存の内容が変わること
例えば設定値によって使用するクラスが変わる場合は、
その組み合わせをテストしなければいけない
何度も言うが、もともとクラスの内部でnewで済んでいたようなものだ
(外から与える)クラスを変更するようなことはしない
何かの条件によって、依存の内容が変わること
例えば設定値によって使用するクラスが変わる場合は、
その組み合わせをテストしなければいけない
何度も言うが、もともとクラスの内部でnewで済んでいたようなものだ
(外から与える)クラスを変更するようなことはしない
299仕様書無しさん
2018/05/11(金) 08:27:10.79300仕様書無しさん
2018/05/11(金) 08:29:45.94 >>299
依存性の話をしてる。
DIやコンストラクタインジェクションに限った話はしてない
メインでnewしようがコンストラクタ内部でnewしようが
依存性に大きな差はないといってるだけ。
それどころかコンストラクタ内部でnewしたほうが
一箇所で済むので依存性的には減る
依存性の話をしてる。
DIやコンストラクタインジェクションに限った話はしてない
メインでnewしようがコンストラクタ内部でnewしようが
依存性に大きな差はないといってるだけ。
それどころかコンストラクタ内部でnewしたほうが
一箇所で済むので依存性的には減る
301仕様書無しさん
2018/05/11(金) 08:35:51.88304仕様書無しさん
2018/05/11(金) 08:40:27.63 >>303
メイン以外でも使うならば依存性は更に増えるし、
仮にすべてをメインだけで行うとか言い始めたら
今度はクラスの中のクラスの中のクラスの中に
インジェクションするときのメインのコードは複雑になる
本来意識しなくてよかったはずの依存性を
意識しなければならなくなって、
コンポーネント独立性が下がる
メイン以外でも使うならば依存性は更に増えるし、
仮にすべてをメインだけで行うとか言い始めたら
今度はクラスの中のクラスの中のクラスの中に
インジェクションするときのメインのコードは複雑になる
本来意識しなくてよかったはずの依存性を
意識しなければならなくなって、
コンポーネント独立性が下がる
308仕様書無しさん
2018/05/11(金) 08:49:48.21310仕様書無しさん
2018/05/11(金) 08:55:20.66312仕様書無しさん
2018/05/11(金) 09:00:07.45313仕様書無しさん
2018/05/11(金) 09:09:47.71 デメリット
・メインがnewで荒れる
・コンストラクタが荒れる
・読まないといけないコードが増える
・コードが増えるとバグも増える
・メリットがない
・メインがnewで荒れる
・コンストラクタが荒れる
・読まないといけないコードが増える
・コードが増えるとバグも増える
・メリットがない
314仕様書無しさん
2018/05/11(金) 09:14:00.16315仕様書無しさん
2018/05/11(金) 09:18:11.57316仕様書無しさん
2018/05/11(金) 09:30:28.56 >>315
えっと、どういうことですか?
コンストラクタが膨大になることが問題なのではないという意味はわかったのですが
「意味不明な引数」がよくわかりませんでした。
具体的にどんなインスタンスが渡されて動くのかその明確さが失われる、という意味でよろしいですか?
また後半の「依存関係を解決するためのクラスを引数に取りますなんてものはない」の意味はさっぱりわかりませんでした。
ごめんなさい、自分が無知なのは承知してるので
もう少し初心者にわかりやすいように教えて欲しいです。
えっと、どういうことですか?
コンストラクタが膨大になることが問題なのではないという意味はわかったのですが
「意味不明な引数」がよくわかりませんでした。
具体的にどんなインスタンスが渡されて動くのかその明確さが失われる、という意味でよろしいですか?
また後半の「依存関係を解決するためのクラスを引数に取りますなんてものはない」の意味はさっぱりわかりませんでした。
ごめんなさい、自分が無知なのは承知してるので
もう少し初心者にわかりやすいように教えて欲しいです。
317仕様書無しさん
2018/05/11(金) 12:28:57.25 教科書では多態性を継承で表現してますが、現場ではコンポジションで表現するのが王道なんですか?
人は動物クラスを継承するとかじゃなくて動物クラスから人クラスや猿クラスを動的にnewするみたいに
。。。思いっきり継承使っちゃってます
人は動物クラスを継承するとかじゃなくて動物クラスから人クラスや猿クラスを動的にnewするみたいに
。。。思いっきり継承使っちゃってます
318仕様書無しさん
2018/05/11(金) 12:30:21.84 >>316
> 「意味不明な引数」がよくわかりませんでした。
ドキュメントを書いてみればわかるよ
コンストラクタ
1番目の引数 ファイル名
2番目の引数 Hogeクラスを渡してください(内部的に使用します)
3番目の引数 Hageクラスを渡してください(内部的に使用します)
> 「意味不明な引数」がよくわかりませんでした。
ドキュメントを書いてみればわかるよ
コンストラクタ
1番目の引数 ファイル名
2番目の引数 Hogeクラスを渡してください(内部的に使用します)
3番目の引数 Hageクラスを渡してください(内部的に使用します)
320仕様書無しさん
2018/05/11(金) 12:43:19.30 コンポジションはカプセル化だな
321仕様書無しさん
2018/05/11(金) 12:44:49.83 new Service(new Repository(new DataSource()))
サービスを使うオブジェクトがリポジトリ内部で使うデータソースのことを知らないといけないなんてクソじゃん
サービスを使うオブジェクトがリポジトリ内部で使うデータソースのことを知らないといけないなんてクソじゃん
322仕様書無しさん
2018/05/11(金) 12:55:30.33 >>321
それはなんか少し違うな。
例えばこう
new FooController(new HogeModel(), new HageModel())
コントローラーが内部でどのモデルを使うとか
FooColtrollerの利用者からすれば、どうでもいいことだろう?
それはなんか少し違うな。
例えばこう
new FooController(new HogeModel(), new HageModel())
コントローラーが内部でどのモデルを使うとか
FooColtrollerの利用者からすれば、どうでもいいことだろう?
323仕様書無しさん
2018/05/11(金) 14:22:31.92324仕様書無しさん
2018/05/11(金) 14:24:40.89325仕様書無しさん
2018/05/11(金) 14:26:05.40 そしてコンポジションは単に他のクラスを利用するってだけなので、
メインなどでnewしてコンストラクタでインジェクションする必要もないのです。
コンストラクタ(もしくは適切なメソッド)でnewすれば
それで十分です。それでもコンポジションです。
メインなどでnewしてコンストラクタでインジェクションする必要もないのです。
コンストラクタ(もしくは適切なメソッド)でnewすれば
それで十分です。それでもコンポジションです。
326仕様書無しさん
2018/05/11(金) 14:29:32.88327仕様書無しさん
2018/05/11(金) 14:34:27.61 >>326
> コンストラクタの引数の数が増えることは問題ではないんですよね?
ずっと「意味不明な引数が増えるのが問題」だって言ってるじゃん
なんか俺から、引数が増えることは問題ない、という言葉を引き出して
意味不明な引数でも問題ないって錯覚させようとしているように見えるが、
そんなことしても無駄だよ。
何度も言う「意味不明な引数が増えるのが問題」
> コンストラクタの引数の数が増えることは問題ではないんですよね?
ずっと「意味不明な引数が増えるのが問題」だって言ってるじゃん
なんか俺から、引数が増えることは問題ない、という言葉を引き出して
意味不明な引数でも問題ないって錯覚させようとしているように見えるが、
そんなことしても無駄だよ。
何度も言う「意味不明な引数が増えるのが問題」
329仕様書無しさん
2018/05/11(金) 14:36:53.72 > 1番目の引数 ファイル名 ・・・ 意味わかる
> 2番目の引数 Hogeクラスを渡してください(内部的に使用します)・・・意味不明
> 3番目の引数 Hageクラスを渡してください(内部的に使用します)・・・意味不明
> 2番目の引数 Hogeクラスを渡してください(内部的に使用します)・・・意味不明
> 3番目の引数 Hageクラスを渡してください(内部的に使用します)・・・意味不明
331仕様書無しさん
2018/05/11(金) 14:52:37.89 >>330
何のために渡すのかわからない
例えば、この引数は123固定です。必ず123を渡してくださいって
書いてあったら、固定なら内部で作れよって思うだろ?
またクラスの実装が変わって、Hageクラスじゃなくて
Pikaクラスを使うようになったので、今度はPikaクラスを渡してくださいとか
書いてあったら、中の実装の都合で引数を変えるんじゃねーよって思うだろ?
何のために渡すのかわからない
例えば、この引数は123固定です。必ず123を渡してくださいって
書いてあったら、固定なら内部で作れよって思うだろ?
またクラスの実装が変わって、Hageクラスじゃなくて
Pikaクラスを使うようになったので、今度はPikaクラスを渡してくださいとか
書いてあったら、中の実装の都合で引数を変えるんじゃねーよって思うだろ?
332仕様書無しさん
2018/05/11(金) 15:00:28.37 渡したからには弄られてもいいんだよな?
333仕様書無しさん
2018/05/11(金) 15:00:34.85334仕様書無しさん
2018/05/11(金) 15:01:33.32 なんでさっき書いたことをいちいち減らすかな
デメリット
・メインがnewで荒れる
・コンストラクタが荒れる
・読まないといけないコードが増える
・コードが増えるとバグも増える
・メリットがない
デメリット
・メインがnewで荒れる
・コンストラクタが荒れる
・読まないといけないコードが増える
・コードが増えるとバグも増える
・メリットがない
335仕様書無しさん
2018/05/11(金) 15:23:57.68 >>334
すみません、なんか具体性にかけるので混乱するんですそのリスト。
・メインがnewで荒れる
→ 荒れるの意味が曖昧なので明確にしたいです。話の結果、メインがあらゆるクラスに依存すると解釈したのですがよろしいですか?
・コンストラクタが荒れる
→荒れるの意味が曖昧なのでこちらも明確にしたいです。必要のない引数がコンストラクタに増えるという解釈でよろしいですか?
・読まないといけないコードが増える
→具体的にどのようなコードが増えますか?それは、コンストラクタが荒れるに等しくありませんか?
・コードが増えるとバグも増える
→もっともですが、どのようなコードが増えますか?
・メリットがない
→それを理解したいと思っているのでこの項目はデメリットの要素にはなりません
すみません、なんか具体性にかけるので混乱するんですそのリスト。
・メインがnewで荒れる
→ 荒れるの意味が曖昧なので明確にしたいです。話の結果、メインがあらゆるクラスに依存すると解釈したのですがよろしいですか?
・コンストラクタが荒れる
→荒れるの意味が曖昧なのでこちらも明確にしたいです。必要のない引数がコンストラクタに増えるという解釈でよろしいですか?
・読まないといけないコードが増える
→具体的にどのようなコードが増えますか?それは、コンストラクタが荒れるに等しくありませんか?
・コードが増えるとバグも増える
→もっともですが、どのようなコードが増えますか?
・メリットがない
→それを理解したいと思っているのでこの項目はデメリットの要素にはなりません
338仕様書無しさん
2018/05/11(金) 15:30:25.61 これだけ答えてやるか
> ・メリットがない
> →それを理解したいと思っているのでこの項目はデメリットの要素にはなりません
デメリットがあるのは示したとおり
一般論としてデメリットとメリットは両立する。両方存在するということはあり得る
そしてDIにメリットが有ると言ってるやつがいるんだよ。
だけどそのメリットの内容を言わない
だからメリットが有るという主張に対して、メリットがないと言ってる
> ・メリットがない
> →それを理解したいと思っているのでこの項目はデメリットの要素にはなりません
デメリットがあるのは示したとおり
一般論としてデメリットとメリットは両立する。両方存在するということはあり得る
そしてDIにメリットが有ると言ってるやつがいるんだよ。
だけどそのメリットの内容を言わない
だからメリットが有るという主張に対して、メリットがないと言ってる
339仕様書無しさん
2018/05/11(金) 15:37:42.17 >>338
メリットがないのにメリットがあると言われてるからあえて主張したということですよね。わかります。
けど僕は周りの意見は気にしてません。ちゃんと比較して、DIをどのように認識すればいいのか理解したいだけです。
リストから余計な項目を取り除くと、DIのデメリットは
・メインがnewによりあらゆるクラスに依存する
・必要のない引数がコンストラクタに増える
ということでよろしいですか?
メリットがないのにメリットがあると言われてるからあえて主張したということですよね。わかります。
けど僕は周りの意見は気にしてません。ちゃんと比較して、DIをどのように認識すればいいのか理解したいだけです。
リストから余計な項目を取り除くと、DIのデメリットは
・メインがnewによりあらゆるクラスに依存する
・必要のない引数がコンストラクタに増える
ということでよろしいですか?
340仕様書無しさん
2018/05/11(金) 15:40:07.31341仕様書無しさん
2018/05/11(金) 15:40:24.27 それで安心するなら、いいですよって言っておく。
342仕様書無しさん
2018/05/11(金) 15:42:03.31343仕様書無しさん
2018/05/11(金) 16:36:46.18 別に揚げ足取りはしないですけど、僕は>>340さんがDIのメリットを理解してない(理解しようとしていない)と
思っているので丁寧に話をしないと、わーわーやってるだけで何の生産性もない
会話と争いが続くとおもってしつこく聞いてました。
まず「必要のない引数がコンストラクタに増える」ですが、僕はDIのメリットを理解して
いるので「必要のない」とは思いません。そのためこれは「コンストラクタの引数が増える」と
再定義させていただきます。そしてこのデメリットは事実だと思ってます。
もう一つの「メインがnewによりあらゆるクラスに依存する」ですが
僕はこれはデメリットでは無いと考えています。
それを説明できればDIのデメリットは「コンストラクタの引数が増える」のみとなります。
その上で「DIのメリット」を提示すれば
「なるほど、コンストラクタの引数は増えるけど、そんなメリットが得られるならDIには価値があるね!」と
>>340さんも思えるわけです。
嫌いだから嫌いなんだ!とか言われたらプログラマとしてどうなの?って感じですし...
あまり長文過ぎると1人で突っ走る感じになるのでとりあえずここで一旦投稿します。
何かツッコミありますかね??
思っているので丁寧に話をしないと、わーわーやってるだけで何の生産性もない
会話と争いが続くとおもってしつこく聞いてました。
まず「必要のない引数がコンストラクタに増える」ですが、僕はDIのメリットを理解して
いるので「必要のない」とは思いません。そのためこれは「コンストラクタの引数が増える」と
再定義させていただきます。そしてこのデメリットは事実だと思ってます。
もう一つの「メインがnewによりあらゆるクラスに依存する」ですが
僕はこれはデメリットでは無いと考えています。
それを説明できればDIのデメリットは「コンストラクタの引数が増える」のみとなります。
その上で「DIのメリット」を提示すれば
「なるほど、コンストラクタの引数は増えるけど、そんなメリットが得られるならDIには価値があるね!」と
>>340さんも思えるわけです。
嫌いだから嫌いなんだ!とか言われたらプログラマとしてどうなの?って感じですし...
あまり長文過ぎると1人で突っ走る感じになるのでとりあえずここで一旦投稿します。
何かツッコミありますかね??
344仕様書無しさん
2018/05/11(金) 16:43:52.70 DIのデメリットと言うより、
DIを好むことのデメリットは、
DIもどきの品質の悪い構造を作り込んでしまうことだと思う
どうしても必要な時だけ使えばいいよ
DIを好むことのデメリットは、
DIもどきの品質の悪い構造を作り込んでしまうことだと思う
どうしても必要な時だけ使えばいいよ
345仕様書無しさん
2018/05/11(金) 16:44:13.50 嫌いじゃなくて、メリットがない。
変な作法の強要と価値のないコードしかない
変な作法の強要と価値のないコードしかない
346仕様書無しさん
2018/05/11(金) 17:11:45.33 階層構造についてデメリットがある
A
B
C
って階層になっていたときに、
AがCのインスタンスをBのコンストラクタに渡すのが、
コンストラクタインジェクションだろ?
そんなの明らかに歪でいるよ
AがBを通さずにCのインスタンスを生成できる(=アクセスできる)のは階層構造を壊していると思う
A
B
C
って階層になっていたときに、
AがCのインスタンスをBのコンストラクタに渡すのが、
コンストラクタインジェクションだろ?
そんなの明らかに歪でいるよ
AがBを通さずにCのインスタンスを生成できる(=アクセスできる)のは階層構造を壊していると思う
347仕様書無しさん
2018/05/11(金) 17:45:49.80 実は、
A
B C
なんだろ?
BとCの間には主従関係は無いって事さ。
A
B C
なんだろ?
BとCの間には主従関係は無いって事さ。
348仕様書無しさん
2018/05/11(金) 18:19:54.01 >>344
継承もコンポジションもなにもかも
必要な時にすればいい。そんなの当たり前のこと。
だけど想定できた変更に対して「引き継いだやつが苦労すればいいや」といって適当にされるのは、俺はいいとは思えないね!
いや、いいと思えないというより、プログラマとしてレベルが低い。
この考え方すら否定されるなら、もはや議論収束は期待できん
継承もコンポジションもなにもかも
必要な時にすればいい。そんなの当たり前のこと。
だけど想定できた変更に対して「引き継いだやつが苦労すればいいや」といって適当にされるのは、俺はいいとは思えないね!
いや、いいと思えないというより、プログラマとしてレベルが低い。
この考え方すら否定されるなら、もはや議論収束は期待できん
351仕様書無しさん
2018/05/11(金) 18:30:39.45354仕様書無しさん
2018/05/11(金) 18:37:22.54 DIはメリットがないから滅びるべき
みたいなスレ立てたほうがいいのかもしれんな
みたいなスレ立てたほうがいいのかもしれんな
355仕様書無しさん
2018/05/11(金) 18:51:09.78 インヘリタンスよりコンポジションを多用すべきとは、カプセル化が肝で多態性に頼るなってことですか
アラン・ケイ先生の思想が正解だったということでしょうか
アラン・ケイ先生の思想が正解だったということでしょうか
356仕様書無しさん
2018/05/11(金) 18:55:38.12 継承もカプセル化の表現の一種
と聞いたことがある
荒れそうだけど
と聞いたことがある
荒れそうだけど
360仕様書無しさん
2018/05/11(金) 19:12:41.38 DIやるならDIコンテナを使うのが普通だと思うけど、
DIコンテナ使ってなにかメリットあった?
LogWriterを変える程度なら設定ファイルで可能だから
DIコンテナ使う意味はないとして
DIコンテナ使ってなにかメリットあった?
LogWriterを変える程度なら設定ファイルで可能だから
DIコンテナ使う意味はないとして
361仕様書無しさん
2018/05/11(金) 19:16:35.77 >>351
クラスAの中に、
new B(new C())
と書いた時の話だよ
クラスAはメインクラスだと考えるとわかりやすいかな?
でもメインクラスでなくてもいい。
コンストラクタインジェクションはメインに全てを書くことではないからね。
下位のクラスのコンストラクタに、より下位のクラスのインスタンスを渡すことだから。
クラスAの中に、
new B(new C())
と書いた時の話だよ
クラスAはメインクラスだと考えるとわかりやすいかな?
でもメインクラスでなくてもいい。
コンストラクタインジェクションはメインに全てを書くことではないからね。
下位のクラスのコンストラクタに、より下位のクラスのインスタンスを渡すことだから。
362仕様書無しさん
2018/05/11(金) 19:22:22.49 外人が犬とボール遊びするのにねじ込んでえぐり出すなんて現実であり得るか
オブジェクト指向は有機体で捉えろと
吠えててなるほどと思ったけど
オブジェクト指向は集合と部分で構成しろ有機体とか考えるなと言われるとなる程とも思う
ケースバイケースという結論で締めて良いのか腑に落ちないですね
オブジェクト指向は有機体で捉えろと
吠えててなるほどと思ったけど
オブジェクト指向は集合と部分で構成しろ有機体とか考えるなと言われるとなる程とも思う
ケースバイケースという結論で締めて良いのか腑に落ちないですね
363仕様書無しさん
2018/05/11(金) 19:22:28.71 > 下位のクラスのコンストラクタに、より下位のクラスのインスタンスを渡すことだから。
何のために?
何のために?
364仕様書無しさん
2018/05/11(金) 19:24:57.83 オブジェクト指向設計の最新のプラクティスはなんなのでしょうか
DDDとかもう古い勢いなので
DDDとかもう古い勢いなので
367仕様書無しさん
2018/05/11(金) 19:36:55.15370仕様書無しさん
2018/05/11(金) 19:52:27.92 回答がないな。
依存がどういう事?に追加して
なんで依存していたら駄目なの?
も追加しておこう
依存がどういう事?に追加して
なんで依存していたら駄目なの?
も追加しておこう
372仕様書無しさん
2018/05/11(金) 19:57:28.22373仕様書無しさん
2018/05/11(金) 20:40:48.40 やっぱりでないかw
フレームワークの一部を切り替えられるってことは、
そのフレームワークがDIをメインに作られていなければいけないが
そもそもそういうものがないのだろうな
フレームワークの一部を切り替えられるってことは、
そのフレームワークがDIをメインに作られていなければいけないが
そもそもそういうものがないのだろうな
374仕様書無しさん
2018/05/11(金) 21:20:41.13 100Vコンセントに統一しないと動かない家電業界の方ですか?
377仕様書無しさん
2018/05/11(金) 21:29:31.84 おじいちゃんなんだろ
378仕様書無しさん
2018/05/11(金) 21:52:01.81 >>367
どこにアンカー付ければいいやらだが…
普通そういう時、クラスBはCのインターフェースには依存するがCの実装には依存しないようにするんだから、依存性は限定されるよね。
//AはどのCの実装を使うか知ってる
new B(new CConcrete());
//BはCのインターフェースに依存する
class B{
B(CInterface c);
}
ごめん常識だったかな?
どこにアンカー付ければいいやらだが…
普通そういう時、クラスBはCのインターフェースには依存するがCの実装には依存しないようにするんだから、依存性は限定されるよね。
//AはどのCの実装を使うか知ってる
new B(new CConcrete());
//BはCのインターフェースに依存する
class B{
B(CInterface c);
}
ごめん常識だったかな?
379仕様書無しさん
2018/05/11(金) 21:53:12.57380仕様書無しさん
2018/05/11(金) 21:54:05.55 >>378
> 普通そういう時、クラスBはCのインターフェースには依存するがCの実装には依存しないようにするんだから、依存性は限定されるよね。
インターフェースには依存するんでしょ?
それ何の意味があるの?
同じインターフェースを持ったものが
二つあるわけじゃあるまいし
> 普通そういう時、クラスBはCのインターフェースには依存するがCの実装には依存しないようにするんだから、依存性は限定されるよね。
インターフェースには依存するんでしょ?
それ何の意味があるの?
同じインターフェースを持ったものが
二つあるわけじゃあるまいし
382仕様書無しさん
2018/05/11(金) 22:04:32.35383仕様書無しさん
2018/05/11(金) 22:06:33.43384仕様書無しさん
2018/05/11(金) 22:13:20.29 >>378
>//AはどのCの実装を使うか知ってる
これが階層的におかしいよね?
Aがアプリケーション、Bがミドルウェア、Cがドライバだとしたら、
アプリケーションがどのドライバを使うかなんて知っているわけないじゃん。
階層化ってそういうことだよ。
もしこれでわからないならこれ以上説明できることはない。
>//AはどのCの実装を使うか知ってる
これが階層的におかしいよね?
Aがアプリケーション、Bがミドルウェア、Cがドライバだとしたら、
アプリケーションがどのドライバを使うかなんて知っているわけないじゃん。
階層化ってそういうことだよ。
もしこれでわからないならこれ以上説明できることはない。
385仕様書無しさん
2018/05/11(金) 22:19:32.79 >>380
ええ、そこ?!
同じインターフェースを持ったクラスが複数あり得る場合にこそ、そういう構造にするんだろうに。
まあ、ありがちなのがBのテストのためにCConcreteを簡易版CTestに差し替えるってやつで。
ほとんどのクラスがそのためにFooInterface, FooConcrete, FooTestの三点セットになっちゃうなんてのはさすがにやり過ぎで、前スレから延々DI批判してる誰かさんはそういう惨状を気にしてるのかとも思うが。
ええ、そこ?!
同じインターフェースを持ったクラスが複数あり得る場合にこそ、そういう構造にするんだろうに。
まあ、ありがちなのがBのテストのためにCConcreteを簡易版CTestに差し替えるってやつで。
ほとんどのクラスがそのためにFooInterface, FooConcrete, FooTestの三点セットになっちゃうなんてのはさすがにやり過ぎで、前スレから延々DI批判してる誰かさんはそういう惨状を気にしてるのかとも思うが。
386仕様書無しさん
2018/05/11(金) 22:24:21.78388仕様書無しさん
2018/05/11(金) 22:34:20.22389仕様書無しさん
2018/05/11(金) 22:52:45.56 >>385
> まあ、ありがちなのがBのテストのためにCConcreteを簡易版CTestに差し替えるってやつで。
なんだよ。結局DIはテストのものだって認めるわけかよ
あれほどテストのためじゃないって言ってたのは何だったんだ?
> まあ、ありがちなのがBのテストのためにCConcreteを簡易版CTestに差し替えるってやつで。
なんだよ。結局DIはテストのものだって認めるわけかよ
あれほどテストのためじゃないって言ってたのは何だったんだ?
390仕様書無しさん
2018/05/11(金) 22:54:30.70 このスレ見てるとオブジェクト指向ってやっぱり
人類には早すぎたんだなって思う
DIのメリットゼロとかトンデモいう奴もいれば
コンポジションがカプセル化だとかわけわからんこと言う奴もいるし、
ABCの階層構造の話とかワケわからん
オブジェクト指向は使い方によっては素晴らしいものになると思っていたけど、害悪にしかならなそうだ
人類には早すぎたんだなって思う
DIのメリットゼロとかトンデモいう奴もいれば
コンポジションがカプセル化だとかわけわからんこと言う奴もいるし、
ABCの階層構造の話とかワケわからん
オブジェクト指向は使い方によっては素晴らしいものになると思っていたけど、害悪にしかならなそうだ
391仕様書無しさん
2018/05/11(金) 23:00:08.35393仕様書無しさん
2018/05/11(金) 23:02:45.41 バズワードだったよな
394仕様書無しさん
2018/05/11(金) 23:07:53.00 話が脱線しすぎてわけわかんなくなってたけど、とりあえずDIのデメリットである「メインがnewによりあらゆるクラスに依存してしまう」というデメリット。
これはデメリットにはならない。
「依存」ってのは、それが無きゃ動かないってことだ。
ニートが、母親なしでは生活できないのと一緒。ニートは母親に依存してる。
で、疎結合とかコード再利用性っていうのは簡単にいうと、いかにソースファイルをコピペした時に、いかに独立して動くかって、ことだ。
コピペして他のソースファイルがついてくるようなら、それは疎結合とは言い難い。
ここまでおけ??
これはデメリットにはならない。
「依存」ってのは、それが無きゃ動かないってことだ。
ニートが、母親なしでは生活できないのと一緒。ニートは母親に依存してる。
で、疎結合とかコード再利用性っていうのは簡単にいうと、いかにソースファイルをコピペした時に、いかに独立して動くかって、ことだ。
コピペして他のソースファイルがついてくるようなら、それは疎結合とは言い難い。
ここまでおけ??
395仕様書無しさん
2018/05/11(金) 23:11:05.17 >>389
それ俺じゃないぞ
IDの出ないところで話し相手がずっと同じと決めつけて書くのはこじらせる元
テストのための例を出したのは前スレの話をもうちょっと明確にしたかったからでね
キャプチャデバイスの差し替えとか描画オブジェクトとかの方が説得力あるかな
それにテストの例だってテスト対象の規模があまりに大きい場合には、そのためだけにクラスとインターフェースを分割して保守性が高まることもあるだろう
それ俺じゃないぞ
IDの出ないところで話し相手がずっと同じと決めつけて書くのはこじらせる元
テストのための例を出したのは前スレの話をもうちょっと明確にしたかったからでね
キャプチャデバイスの差し替えとか描画オブジェクトとかの方が説得力あるかな
それにテストの例だってテスト対象の規模があまりに大きい場合には、そのためだけにクラスとインターフェースを分割して保守性が高まることもあるだろう
396仕様書無しさん
2018/05/11(金) 23:16:01.54 あーもう、まともな会話できんわ
誰でもいいからDIにメリットないって言ってるやつ、DIのデメリットくらいピックアップしてくれよ
なにが「みんな逃げちゃう」だよ
答えらんねーよ
誰でもいいからDIにメリットないって言ってるやつ、DIのデメリットくらいピックアップしてくれよ
なにが「みんな逃げちゃう」だよ
答えらんねーよ
397仕様書無しさん
2018/05/11(金) 23:17:09.24 DIのデメリットならちゃんと書いてあるだろ
無意味にコード増やすんじゃないよ
無意味にコード増やすんじゃないよ
399仕様書無しさん
2018/05/11(金) 23:21:01.08 依存は駄目って言うけれど、依存の程度にもよるだろ
例えばグローバル変数だって駄目だというけれど
たった一つでグローバルとわかり易い名前で、
読み書きしている所が限られていれば、大きな問題にはならないだろ?
依存は駄目です。コレは決定事項です。
で思考停止するんじゃなくて、
コード増やすだけの価値があるのかって話だよ
例えばグローバル変数だって駄目だというけれど
たった一つでグローバルとわかり易い名前で、
読み書きしている所が限られていれば、大きな問題にはならないだろ?
依存は駄目です。コレは決定事項です。
で思考停止するんじゃなくて、
コード増やすだけの価値があるのかって話だよ
400仕様書無しさん
2018/05/11(金) 23:21:49.23401仕様書無しさん
2018/05/11(金) 23:24:15.76 え゛。コンポジションの使い道ってカプセル化じゃなかったらなんなの?
402仕様書無しさん
2018/05/11(金) 23:24:21.51404仕様書無しさん
2018/05/11(金) 23:26:50.37 334 自分:仕様書無しさん[sage] 投稿日:2018/05/11(金) 15:01:33.32
なんでさっき書いたことをいちいち減らすかな
デメリット
・メインがnewで荒れる
・コンストラクタが荒れる
・読まないといけないコードが増える
・コードが増えるとバグも増える
・メリットがない
なんでさっき書いたことをいちいち減らすかな
デメリット
・メインがnewで荒れる
・コンストラクタが荒れる
・読まないといけないコードが増える
・コードが増えるとバグも増える
・メリットがない
408仕様書無しさん
2018/05/11(金) 23:34:33.66 OK、悪かった。そこから始めよう。
で、俺もコピペからの改変になっちゃうんだけど
>>334
すみません、なんか具体性にかけるので混乱するんですそのリスト。
・メインがnewで荒れる
→ 荒れるの意味が曖昧なので明確にしたいです。話の結果、メインがあらゆるクラスに依存すると解釈したのですがよろしいですか?
・コンストラクタが荒れる
→荒れるの意味が曖昧なのでこちらも明確にしたいです。必要のない引数がコンストラクタに増えるという解釈でよろしいですか?
・読まないといけないコードが増える
→具体的にどのようなコードが増えますか?それは、コンストラクタが荒れるに等しくありませんか?
・コードが増えるとバグも増える
→もっともですが、どのようなコードが増えますか?
・メリットがない
→それを理解したいと思っているのでこの項目はデメリットの要素にはなりません
というわけで結局そのリストは
・メインがnewによりあらゆるクラスに依存する
・コンストラクタに引数が増える
の二つに集約されるということでよろしいですか?
で、俺もコピペからの改変になっちゃうんだけど
>>334
すみません、なんか具体性にかけるので混乱するんですそのリスト。
・メインがnewで荒れる
→ 荒れるの意味が曖昧なので明確にしたいです。話の結果、メインがあらゆるクラスに依存すると解釈したのですがよろしいですか?
・コンストラクタが荒れる
→荒れるの意味が曖昧なのでこちらも明確にしたいです。必要のない引数がコンストラクタに増えるという解釈でよろしいですか?
・読まないといけないコードが増える
→具体的にどのようなコードが増えますか?それは、コンストラクタが荒れるに等しくありませんか?
・コードが増えるとバグも増える
→もっともですが、どのようなコードが増えますか?
・メリットがない
→それを理解したいと思っているのでこの項目はデメリットの要素にはなりません
というわけで結局そのリストは
・メインがnewによりあらゆるクラスに依存する
・コンストラクタに引数が増える
の二つに集約されるということでよろしいですか?
409仕様書無しさん
2018/05/11(金) 23:35:15.01 >>.408
それに対するレスも過去レスよめ
それに対するレスも過去レスよめ
412仕様書無しさん
2018/05/11(金) 23:39:57.52 >>411
はいどうぞ
これだけ答えてやるか
> ・メリットがない
> →それを理解したいと思っているのでこの項目はデメリットの要素にはなりません
デメリットがあるのは示したとおり
一般論としてデメリットとメリットは両立する。両方存在するということはあり得る
そしてDIにメリットが有ると言ってるやつがいるんだよ。
だけどそのメリットの内容を言わない
だからメリットが有るという主張に対して、メリットがないと言ってる
はいどうぞ
これだけ答えてやるか
> ・メリットがない
> →それを理解したいと思っているのでこの項目はデメリットの要素にはなりません
デメリットがあるのは示したとおり
一般論としてデメリットとメリットは両立する。両方存在するということはあり得る
そしてDIにメリットが有ると言ってるやつがいるんだよ。
だけどそのメリットの内容を言わない
だからメリットが有るという主張に対して、メリットがないと言ってる
413仕様書無しさん
2018/05/11(金) 23:43:31.13 そもそも、その回答の仕方何よww
話す気ゼロww
それだけ答えてやるかってどういう意味?
話す気ゼロww
それだけ答えてやるかってどういう意味?
414仕様書無しさん
2018/05/11(金) 23:51:16.07 で、DIのメリットの内容は?
依存がどうとかじゃなくて、具体的な説明どうぞ
依存がどうとかじゃなくて、具体的な説明どうぞ
415仕様書無しさん
2018/05/11(金) 23:53:01.37 まずデメリットが何か確定させてくれよ
後からこれもデメリットでしたーとか言われたら余計にカオスになる
後からこれもデメリットでしたーとか言われたら余計にカオスになる
416仕様書無しさん
2018/05/11(金) 23:54:12.38 じゃあ確定したってことで先へどうぞ
417仕様書無しさん
2018/05/11(金) 23:54:54.94 2ちゃんはログが流れていくチャットじゃありません。
レスは流れないんだから同じこと言わないでください。
昔は過去ログまで嫁と言われたんだぞ。
リセットとか訳のわからないことを言ったり、
それに応じて自分のレスのコピペという意味のわからない書き込みをしたりせずに、
論点を相手に合わせてみたらどうなんだ。
お互いに自分の土俵じゃないと話す気がないなら、
夫婦喧嘩と一緒で無限ループだよ。
もう諦めて会話を辞めろって
レスは流れないんだから同じこと言わないでください。
昔は過去ログまで嫁と言われたんだぞ。
リセットとか訳のわからないことを言ったり、
それに応じて自分のレスのコピペという意味のわからない書き込みをしたりせずに、
論点を相手に合わせてみたらどうなんだ。
お互いに自分の土俵じゃないと話す気がないなら、
夫婦喧嘩と一緒で無限ループだよ。
もう諦めて会話を辞めろって
418仕様書無しさん
2018/05/11(金) 23:55:47.22 そう、ここまででてないのはDIのメリット
依存がどうとかじゃなくて、具体的な説明どうぞ
依存がどうとかじゃなくて、具体的な説明どうぞ
419仕様書無しさん
2018/05/11(金) 23:57:13.90 動的差し替え?
420仕様書無しさん
2018/05/11(金) 23:57:55.51 でも今差し替えないものの話をしてるんだよなあ
421仕様書無しさん
2018/05/12(土) 00:00:03.94 DI使わないからできなくて別の可能性が見えてないだけだ
できたらやりたくなるはずだ
きっと
できたらやりたくなるはずだ
きっと
422仕様書無しさん
2018/05/12(土) 00:02:09.51 きっと
きっと・・・
きっと・・・
423仕様書無しさん
2018/05/12(土) 00:06:27.64 おけ、じゃあDIのデメリットは
・メインがnewによりあらゆるクラスに依存する
・コンストラクタに引数が増える
の二つであるということを前提に話をするね
・メインがnewによりあらゆるクラスに依存する
・コンストラクタに引数が増える
の二つであるということを前提に話をするね
424仕様書無しさん
2018/05/12(土) 00:08:51.87 話の内容はDIのメリットだぞ
間違えんなよ
間違えんなよ
426仕様書無しさん
2018/05/12(土) 00:11:25.57 へるでしょ
427仕様書無しさん
2018/05/12(土) 00:14:03.20 >>423
論点を自分の土俵に持ち込んだな。
つまり相手が示したデメリットの数を減らし、
残したデメリットも自分の主観で書き換えた。
自分がメリットを示す前にそれをした。
そんなんじゃ今回も決着しないよ。
論点を自分の土俵に持ち込んだな。
つまり相手が示したデメリットの数を減らし、
残したデメリットも自分の主観で書き換えた。
自分がメリットを示す前にそれをした。
そんなんじゃ今回も決着しないよ。
429仕様書無しさん
2018/05/12(土) 00:21:36.70431仕様書無しさん
2018/05/12(土) 00:23:40.70 動的差し替えという明確なメリットを提示したのに
今は差し替えないものの話とか
勝手に作った枠組みで拒絶された
土俵がなんだって
今は差し替えないものの話とか
勝手に作った枠組みで拒絶された
土俵がなんだって
433仕様書無しさん
2018/05/12(土) 00:26:57.35 >>431
> 動的差し替えという明確なメリットを提示したのに
> 今は差し替えないものの話とか
え? コンストラクタ内部でnewすれば済む話をしてるわけだよ?
どうやって、これを差し替えるのさ?
差し替えできないがそれでOK。
それが前提の話をしてる
> 動的差し替えという明確なメリットを提示したのに
> 今は差し替えないものの話とか
え? コンストラクタ内部でnewすれば済む話をしてるわけだよ?
どうやって、これを差し替えるのさ?
差し替えできないがそれでOK。
それが前提の話をしてる
434仕様書無しさん
2018/05/12(土) 00:29:48.70435仕様書無しさん
2018/05/12(土) 00:32:29.78 >>434
コンストラクタ内部でnewするのと
コンストラクタ外部でnewして、コンストラクタの引数で渡す
ことの違いだ。
newの処理は一緒。あとはコンストラクタインジェクションを行う処理が増えてる。
だがコンストラクタ内部でやれば、そのコードは必要ない
DIを使うほうが確実に増えている
コンストラクタ内部でnewするのと
コンストラクタ外部でnewして、コンストラクタの引数で渡す
ことの違いだ。
newの処理は一緒。あとはコンストラクタインジェクションを行う処理が増えてる。
だがコンストラクタ内部でやれば、そのコードは必要ない
DIを使うほうが確実に増えている
436仕様書無しさん
2018/05/12(土) 00:33:30.94 【DIのデメリット】
・メインがnewによりあらゆるクラスに依存する
・コンストラクタに引数が増える
はい、追加や編集お願いします。
・メインがnewによりあらゆるクラスに依存する
・コンストラクタに引数が増える
はい、追加や編集お願いします。
438仕様書無しさん
2018/05/12(土) 00:35:09.94441仕様書無しさん
2018/05/12(土) 00:36:48.91443仕様書無しさん
2018/05/12(土) 00:40:35.19 >>441
なるほど、ありがとう。
> メインでnewやるなら、メインでクラスのimportが必要
これは「メインがnewによりあらゆるクラスに依存する」と同じ意味だよね?
> インターフェースを使うとか言い出すなら、インターフェースファイルも増える
これもあるけど、インターフェース増やすことになったらどっちみち
クラス内部でnewしてた場合でもインターフェースファイル増えることだから
とりあえず話を複雑にしないために排除、でいいかな?
なるほど、ありがとう。
> メインでnewやるなら、メインでクラスのimportが必要
これは「メインがnewによりあらゆるクラスに依存する」と同じ意味だよね?
> インターフェースを使うとか言い出すなら、インターフェースファイルも増える
これもあるけど、インターフェース増やすことになったらどっちみち
クラス内部でnewしてた場合でもインターフェースファイル増えることだから
とりあえず話を複雑にしないために排除、でいいかな?
444仕様書無しさん
2018/05/12(土) 00:41:13.53 >>442
お前にいらないだけで世間には必要なんだよ!
与えられた機能と枠組みのなかで
プログラミングの原則を振りかざしてどんなに頑張ったって
せいぜいちょっとばかりの人月単価の削減にしかならん
でもDIは動的差し替えという新しい機能を提供しシステム運用の幅を広げた
これこそ価値というもだ
お前にいらないだけで世間には必要なんだよ!
与えられた機能と枠組みのなかで
プログラミングの原則を振りかざしてどんなに頑張ったって
せいぜいちょっとばかりの人月単価の削減にしかならん
でもDIは動的差し替えという新しい機能を提供しシステム運用の幅を広げた
これこそ価値というもだ
449仕様書無しさん
2018/05/12(土) 00:44:28.91 DI厨はインターフェースを作りたがる
クラス一個あれば十分なのに
なぜかインターフェースに変えたがる
クラス一個あれば十分なのに
なぜかインターフェースに変えたがる
450仕様書無しさん
2018/05/12(土) 00:45:06.00 既存のシステム自体に手を加えたくないときとか
452仕様書無しさん
2018/05/12(土) 00:52:32.03 >>449
それはあるかもしれない。
けどDIのデメリットに、「DI厨はインターフェースを作りたがる」ってそれDI自体じゃなくて
DIを扱う人間側のデメリットになるので、とりあえず今は置いといてもらっていいですか?
それはあるかもしれない。
けどDIのデメリットに、「DI厨はインターフェースを作りたがる」ってそれDI自体じゃなくて
DIを扱う人間側のデメリットになるので、とりあえず今は置いといてもらっていいですか?
453仕様書無しさん
2018/05/12(土) 01:01:18.78 なんか別のとごっちゃになってた
454仕様書無しさん
2018/05/12(土) 01:08:21.80 「必要ないコードが増える」は「メインがnewによりあらゆるクラスに依存する」と同じ意味なので
DIのデメリットはやはりこの二つでいいですか?
【DIのデメリット】
・メインがnewによりあらゆるクラスに依存する
・コンストラクタの引数が増える
DIのデメリットはやはりこの二つでいいですか?
【DIのデメリット】
・メインがnewによりあらゆるクラスに依存する
・コンストラクタの引数が増える
456仕様書無しさん
2018/05/12(土) 03:34:52.40 誰もかれもが好き勝手なこといって脳が混線する
458仕様書無しさん
2018/05/12(土) 06:56:45.32 むしろインターフェースでまかなえなくなる状況のが圧倒的に多い
459仕様書無しさん
2018/05/12(土) 07:04:53.63 どうもDIって言ってる人の定義の幅が広すぎる気がする
FileInputStream is = new FileInputStream("file.txt");
InputStreamReader in = new InputStreamReader(is, "SJIS");
こんなのまでコンストラクタインジェクションって言ってないか?
FileInputStream is = new FileInputStream("file.txt");
InputStreamReader in = new InputStreamReader(is, "SJIS");
こんなのまでコンストラクタインジェクションって言ってないか?
465仕様書無しさん
2018/05/12(土) 10:54:08.22 共同ツール 1
https://seleck.cc/685
https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり
共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/
共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://sketchapp.com/extensions/plugins/
ttp://photoshopvip.net/103903
ttps://goodpatch.com/blog/sketch-plugins/
https://seleck.cc/685
https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり
共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/
共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://sketchapp.com/extensions/plugins/
ttp://photoshopvip.net/103903
ttps://goodpatch.com/blog/sketch-plugins/
467仕様書無しさん
2018/05/12(土) 11:06:04.15 てか、isとか、inとかを変数名にする奴とは仲良くできない。
468仕様書無しさん
2018/05/12(土) 11:56:58.00 元から友達おらんやんw
469仕様書無しさん
2018/05/12(土) 12:01:35.33471仕様書無しさん
2018/05/12(土) 12:20:55.75472仕様書無しさん
2018/05/12(土) 13:02:37.10 変数名は日本語最強
isYouchuuikyaku = new kureinmaa();
みたいなの
isYouchuuikyaku = new kureinmaa();
みたいなの
474仕様書無しさん
2018/05/12(土) 13:39:59.41 広義のDIではあるけどな
いちいち言わないけど
いちいち言わないけど
475仕様書無しさん
2018/05/12(土) 13:44:24.06 外部から参照可能な値の設定もインジェクションっていうんじゃろか
477仕様書無しさん
2018/05/12(土) 13:58:12.75478仕様書無しさん
2018/05/12(土) 14:03:31.23 依存注入…わけわからん。
仕事で言うと、上司が手を付け始めた仕事を、まんま部下に丸投げして押し付けるみたいな感じ?
仕事で言うと、上司が手を付け始めた仕事を、まんま部下に丸投げして押し付けるみたいな感じ?
479仕様書無しさん
2018/05/12(土) 14:04:45.50 エクセル開いたけど、後はこの資料を清書しといて。
みたいな?
みたいな?
480仕様書無しさん
2018/05/12(土) 14:30:39.73 なに言ってんだこいつ
481仕様書無しさん
2018/05/12(土) 14:38:32.19 依存性注入は誤訳だってじっちゃん言ってた
482仕様書無しさん
2018/05/12(土) 14:40:13.88 言わないとか、言うとか
違わないとか、違うとか
めんどくさいので、xxxだから言う。xxxだから違う。と、ちゃんと理由づけしません?
マジでお前らほんとにプログラマかよ
違わないとか、違うとか
めんどくさいので、xxxだから言う。xxxだから違う。と、ちゃんと理由づけしません?
マジでお前らほんとにプログラマかよ
483仕様書無しさん
2018/05/12(土) 15:29:10.58 プロパティを自分で用意せずにコンストラクタで与えてもらうのが、
コンストラクタインジェクション。
DIは概念だけど、
コンストラクタインジェクションがDIとは限らないし、
DIの具体的な手法はコンストラクタインジェクションだけではない。
忌むべきもの、あるいは好むべきものはDIという概念なのか、
コンストラクタインジェクションという手法なのか。
コンストラクタインジェクション。
DIは概念だけど、
コンストラクタインジェクションがDIとは限らないし、
DIの具体的な手法はコンストラクタインジェクションだけではない。
忌むべきもの、あるいは好むべきものはDIという概念なのか、
コンストラクタインジェクションという手法なのか。
484仕様書無しさん
2018/05/12(土) 15:31:32.49 >>477
DIっていうのはIoCのことなんだよ。
制御の逆転
FileInputStream is = new FileInputStream("file.txt");
InputStreamReader in = new InputStreamReader(is, "SJIS");
これが逆転した結果であるならば、
元に戻すこともできるはず
元に戻せないならば、それはDIじゃない
DIっていうのはIoCのことなんだよ。
制御の逆転
FileInputStream is = new FileInputStream("file.txt");
InputStreamReader in = new InputStreamReader(is, "SJIS");
これが逆転した結果であるならば、
元に戻すこともできるはず
元に戻せないならば、それはDIじゃない
485仕様書無しさん
2018/05/12(土) 15:32:25.51 ちなみに、コンストラクタインジェクションというのは
コンストラクタをDIのI(インジェクション)として使うことであって
それがDIでないならば、コンストラクタインジェクションにもならない
コンストラクタをDIのI(インジェクション)として使うことであって
それがDIでないならば、コンストラクタインジェクションにもならない
486仕様書無しさん
2018/05/12(土) 15:35:59.36 > コンストラクタインジェクションがDIとは限らないし、
DI(Dependency Injection)のInjectionをコンストラクタでやることを
コンストラクタインジェクションというので、
DIじゃない場合に、コンストラクタインジェクションという用語は使えない
DI(Dependency Injection)のInjectionをコンストラクタでやることを
コンストラクタインジェクションというので、
DIじゃない場合に、コンストラクタインジェクションという用語は使えない
487仕様書無しさん
2018/05/12(土) 15:39:15.22488仕様書無しさん
2018/05/12(土) 15:40:06.38489仕様書無しさん
2018/05/12(土) 15:42:18.09 >>487
元々インジェクションという用語が先にあって
そのインジェクションをどういう方法でやるか?の方法の一つとして、
コンストラクタでインジェクションをやりましょう=コンストラクタインジェクションだからね
インジェクションというのはDependency InjectionのInjectionなので
それがDIを目的として作られたものでないなら、
コンストラクタインジェクションと言わないのは常識だよ
元々インジェクションという用語が先にあって
そのインジェクションをどういう方法でやるか?の方法の一つとして、
コンストラクタでインジェクションをやりましょう=コンストラクタインジェクションだからね
インジェクションというのはDependency InjectionのInjectionなので
それがDIを目的として作られたものでないなら、
コンストラクタインジェクションと言わないのは常識だよ
490仕様書無しさん
2018/05/12(土) 15:48:35.77 つまり忌むべきものはDIやコンストラクタインジェクションではなく、
プロパティを「無用に」コンストラクタから与えることなわけ?
プロパティを「無用に」コンストラクタから与えることなわけ?
491仕様書無しさん
2018/05/12(土) 15:51:19.84 まあ、回りくどいことやってもできるものはいっしょなんですけどね
492仕様書無しさん
2018/05/12(土) 15:52:23.44493仕様書無しさん
2018/05/12(土) 15:54:07.88 具体的に言うとなにがちがうの?
495仕様書無しさん
2018/05/12(土) 16:08:20.93 すでに具体的な違いは書いてあるか
496仕様書無しさん
2018/05/12(土) 16:13:36.98 ぼかして知ったかぶってごまかすんじゃねえはっきい言え犬畜生
497仕様書無しさん
2018/05/12(土) 16:53:47.59 つまりどう言うことですか?
498仕様書無しさん
2018/05/12(土) 17:01:36.01 ただのオブジェクトを引数にしたコンストラクタ呼び出しと
コンストラクタインジェクションは
何がどう違っててどう見分けるのか具体的に
コンストラクタインジェクションは
何がどう違っててどう見分けるのか具体的に
500仕様書無しさん
2018/05/12(土) 17:09:15.62 FileSjisTextInputStreamReader();
501仕様書無しさん
2018/05/12(土) 17:09:44.86 じゃあ動的差し替えっていうのは?
502仕様書無しさん
2018/05/12(土) 17:10:28.28 でもたしかに書いてあった
アンカしないのがわるい
アンカしないのがわるい
504仕様書無しさん
2018/05/12(土) 17:22:08.66 そうだったのか
505仕様書無しさん
2018/05/12(土) 17:39:02.35 でDIのメリットはゼロなんですね?
506仕様書無しさん
2018/05/12(土) 17:50:12.60 クラス内でNewしてたら
インスタンスごとに別のクラスに依存するとかできんじゃないか
インスタンスごとに別のクラスに依存するとかできんじゃないか
510仕様書無しさん
2018/05/12(土) 18:07:51.24513仕様書無しさん
2018/05/12(土) 18:23:01.98 ほらほら、DIという用語の使い方がおかしくなってきたろ?w
ただの、オブジェクトを引数にしたメソッド呼び出しまで
インジェクションとか言い始めたw
ただの、オブジェクトを引数にしたメソッド呼び出しまで
インジェクションとか言い始めたw
514仕様書無しさん
2018/05/12(土) 18:34:19.24 なんかインジェクションとかエッチくさいから嫌
515仕様書無しさん
2018/05/12(土) 18:49:37.96 用語の話にすり替えてかましてくるスタイルw
依存性注入ってのは誤訳でDIってオブジェクト注入って意味だぞ?
Wikipedia見てみろよ。
明確に「dependency」とは「オブジェクト」であると定義される。
依存性注入ってのは誤訳でDIってオブジェクト注入って意味だぞ?
Wikipedia見てみろよ。
明確に「dependency」とは「オブジェクト」であると定義される。
516仕様書無しさん
2018/05/12(土) 18:53:01.38 英語のwikipediaみたけど、dependencyはobjectの誤訳なんて書いてないぞ?w
517仕様書無しさん
2018/05/12(土) 18:54:06.34 いや、書いてあるだろ
A dependency is an object that can be used (a service). An injection is the passing of a dependency to a
dependent object (a client) that would use it. The service is made part of the client's state.[1]
Passing the service to the client, rather than allowing a client to build or find the service, is the fundamental requirement of the pattern.
A dependency is an object that can be used (a service). An injection is the passing of a dependency to a
dependent object (a client) that would use it. The service is made part of the client's state.[1]
Passing the service to the client, rather than allowing a client to build or find the service, is the fundamental requirement of the pattern.
519仕様書無しさん
2018/05/12(土) 18:58:11.22 なんでこう、DIアンチはヒョイヒョイ逃げながらトンデモばかりかましてくるんだろ
520仕様書無しさん
2018/05/12(土) 19:05:27.85 まあ、自分が間違ってることを自覚したくないんだろうけど
521仕様書無しさん
2018/05/12(土) 19:20:08.53522仕様書無しさん
2018/05/12(土) 19:36:14.07 悪い例は出せても
良い例は出せないんですね
良い例は出せないんですね
524仕様書無しさん
2018/05/12(土) 19:51:53.20 言っとくけどwikipedia書いとる奴なんか皆おまえらみたいな奴やでw
そんなもん鵜呑みにできるメンタルがある意味羨ましいわwww
そんなもん鵜呑みにできるメンタルがある意味羨ましいわwww
527仕様書無しさん
2018/05/12(土) 20:30:13.45528仕様書無しさん
2018/05/12(土) 20:32:21.45531仕様書無しさん
2018/05/12(土) 21:14:07.30532仕様書無しさん
2018/05/12(土) 21:35:42.79534仕様書無しさん
2018/05/12(土) 21:49:18.62535仕様書無しさん
2018/05/12(土) 21:55:39.70536仕様書無しさん
2018/05/12(土) 21:56:01.81 てか、普通にfor文とかでmanagerクラスとかにメソッドインジェクションするじゃん
理由は言わないけど
理由は言わないけど
537仕様書無しさん
2018/05/12(土) 22:11:17.70 ええー
538仕様書無しさん
2018/05/12(土) 22:29:58.99 ほんとにお前らプログラミングしたことあんのかよ..
540仕様書無しさん
2018/05/12(土) 22:45:05.53 あるあるすぎてわざわざ説明するまでもないけど
じゃあ説明します...(´・ω・`;)
なんでもいいんだけどdomとかでもappendChild()でDOMオブジェクトを渡して画面に表示させたりするでしょ
でアペンドしたい要素が複数あったらforでもwhileでもeachでもなんでもいいから繰り返し処理で登録したりするよね
インスタンスの数が実行中に動的に増えたり減ったりする時にDIは使えないって言うから、そんなことなくない?って思ったんだけど何か間違ってる?
じゃあ説明します...(´・ω・`;)
なんでもいいんだけどdomとかでもappendChild()でDOMオブジェクトを渡して画面に表示させたりするでしょ
でアペンドしたい要素が複数あったらforでもwhileでもeachでもなんでもいいから繰り返し処理で登録したりするよね
インスタンスの数が実行中に動的に増えたり減ったりする時にDIは使えないって言うから、そんなことなくない?って思ったんだけど何か間違ってる?
542仕様書無しさん
2018/05/12(土) 23:27:53.50 ここまで全員ゴミ
544仕様書無しさん
2018/05/13(日) 00:50:13.93545仕様書無しさん
2018/05/13(日) 00:51:16.23 可能不可能の話じゃなくて、普通はそうするって話ね
極論はいらない
極論はいらない
546仕様書無しさん
2018/05/13(日) 02:44:43.50 アンチはまだ具体例に無反応か
547仕様書無しさん
2018/05/13(日) 02:46:51.51 え?どれに対して?
549仕様書無しさん
2018/05/13(日) 05:08:32.84 >>548
流れを書いておくね
371 返信:仕様書無しさん[sage] 投稿日:2018/05/11(金) 19:53:59.31
>>360
Frameworkの一部の独自実装への切り替え
372 自分:仕様書無しさん[sage] 投稿日:2018/05/11(金) 19:57:28.22
>>371
具体的にお願い。
どのフレームワークの、どういうものを
どういったコードを書くことで、切り替えられるのか?
ログ程度であれば、DI使わなくても
入れ替えることは可能
373 名前:仕様書無しさん[sage] 投稿日:2018/05/11(金) 20:40:48.40
やっぱりでないかw
フレームワークの一部を切り替えられるってことは、
そのフレームワークがDIをメインに作られていなければいけないが
そもそもそういうものがないのだろうな
375 名前:仕様書無しさん[sage] 投稿日:2018/05/11(金) 21:24:12.17
>>373
ASP.NET Core
流れを書いておくね
371 返信:仕様書無しさん[sage] 投稿日:2018/05/11(金) 19:53:59.31
>>360
Frameworkの一部の独自実装への切り替え
372 自分:仕様書無しさん[sage] 投稿日:2018/05/11(金) 19:57:28.22
>>371
具体的にお願い。
どのフレームワークの、どういうものを
どういったコードを書くことで、切り替えられるのか?
ログ程度であれば、DI使わなくても
入れ替えることは可能
373 名前:仕様書無しさん[sage] 投稿日:2018/05/11(金) 20:40:48.40
やっぱりでないかw
フレームワークの一部を切り替えられるってことは、
そのフレームワークがDIをメインに作られていなければいけないが
そもそもそういうものがないのだろうな
375 名前:仕様書無しさん[sage] 投稿日:2018/05/11(金) 21:24:12.17
>>373
ASP.NET Core
550仕様書無しさん
2018/05/13(日) 05:11:39.06 まずこっち
> 382 返信:仕様書無しさん[sage] 投稿日:2018/05/11(金) 22:04:32.35
> >>379
> https://andrewlock.net/implementing-custom-token-providers-for-passwordless-authentication-in-asp-net-core-identity/
継承を使ってフレームワークを拡張しているがDIは使われていない
つぎにこっち
383 返信:仕様書無しさん[sage] 投稿日:2018/05/11(金) 22:06:33.43
>>379
https://andrewlock.net/using-an-iactionfilter-to-read-action-method-parameter-values-in-asp-net-core-mvc/
SetViewDataFilterとかDIかな?と思えるところはあるが、
Frameworkの一部の独自実装への切り替えではない
> 382 返信:仕様書無しさん[sage] 投稿日:2018/05/11(金) 22:04:32.35
> >>379
> https://andrewlock.net/implementing-custom-token-providers-for-passwordless-authentication-in-asp-net-core-identity/
継承を使ってフレームワークを拡張しているがDIは使われていない
つぎにこっち
383 返信:仕様書無しさん[sage] 投稿日:2018/05/11(金) 22:06:33.43
>>379
https://andrewlock.net/using-an-iactionfilter-to-read-action-method-parameter-values-in-asp-net-core-mvc/
SetViewDataFilterとかDIかな?と思えるところはあるが、
Frameworkの一部の独自実装への切り替えではない
552仕様書無しさん
2018/05/13(日) 05:18:39.37 >>544
ちょっと待って、まずDIの定義を明確にしない??
DIの定義って依存性オブジェクト注入のことでしょ?
これってほぼインジェクションやストラテジーパターンと同義じゃん、DIと呼ぶには他になにか条件あるの?
ちょっと待って、まずDIの定義を明確にしない??
DIの定義って依存性オブジェクト注入のことでしょ?
これってほぼインジェクションやストラテジーパターンと同義じゃん、DIと呼ぶには他になにか条件あるの?
553仕様書無しさん
2018/05/13(日) 06:07:07.47 組込み爺向け専用だが
qsort だよというと
それなりに納得してくれる
qsort だよというと
それなりに納得してくれる
554仕様書無しさん
2018/05/13(日) 06:18:03.80 >>552
コンテナの存在。DIではnewを使わずにコンテナから生成する。
依存性を注入するのもコンテナ
コンテナがオブジェクトを生成できるように、予め依存情報をコンテナに登録する必要がある
依存情報はコードで書く場合と設定ファイルで書く場合がある(これが面倒くさい)
以下が詳しい。みんな大好き、リファクタリングのマーチンファウラーさんの記事やでw
http://kakutani.com/trans/fowler/injection.html (一時的なエラーかもしれないが今アクセスできないので↓)
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
コンテナの存在。DIではnewを使わずにコンテナから生成する。
依存性を注入するのもコンテナ
コンテナがオブジェクトを生成できるように、予め依存情報をコンテナに登録する必要がある
依存情報はコードで書く場合と設定ファイルで書く場合がある(これが面倒くさい)
以下が詳しい。みんな大好き、リファクタリングのマーチンファウラーさんの記事やでw
http://kakutani.com/trans/fowler/injection.html (一時的なエラーかもしれないが今アクセスできないので↓)
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
556仕様書無しさん
2018/05/13(日) 06:22:25.56 基本的にDIというのは依存関係が静的に決定する。
この静的っていうのは、コンパイル時の動的・静的結合の静的のことではなく
プログラムの初期化時にDIコンテナに設定し、
その後は変わらないということを意味する
この静的っていうのは、コンパイル時の動的・静的結合の静的のことではなく
プログラムの初期化時にDIコンテナに設定し、
その後は変わらないということを意味する
557仕様書無しさん
2018/05/13(日) 06:52:17.24 ここまで全員ゴミ
560仕様書無しさん
2018/05/13(日) 07:18:36.31 だから読もうな。話はそれから
以下が詳しい。みんな大好き、リファクタリングのマーチンファウラーさんの記事やでw
http://kakutani.com/trans/fowler/injection.html (一時的なエラーかもしれないが今アクセスできないので↓)
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
以下が詳しい。みんな大好き、リファクタリングのマーチンファウラーさんの記事やでw
http://kakutani.com/trans/fowler/injection.html (一時的なエラーかもしれないが今アクセスできないので↓)
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
561仕様書無しさん
2018/05/13(日) 07:20:14.44 DIという用語を命名したのも、このマーチン・ファウラーだからね
> 本記事では、このパターンの働きについて掘り下げることで、より具体的に「Dependency Injection(依存オブジェクト注入)」と命名し、
> 本記事では、このパターンの働きについて掘り下げることで、より具体的に「Dependency Injection(依存オブジェクト注入)」と命名し、
562仕様書無しさん
2018/05/13(日) 07:28:16.62 >>558
> DIコンテナじゃなくて、DIはなんなん?
DIは "DIパターンを使用した時の" 依存の注入のことを言う
DIパターンでなければ、それは単にオブジェクトを引数でわたしただけ
DIパターンにはDIコンテナ(Assembler)が登場人物として含まれてる
> Dependency Injection の基本的な考え方は、独立したオブジェクトをAssembler(組み立て係)として用意し、
> DIコンテナじゃなくて、DIはなんなん?
DIは "DIパターンを使用した時の" 依存の注入のことを言う
DIパターンでなければ、それは単にオブジェクトを引数でわたしただけ
DIパターンにはDIコンテナ(Assembler)が登場人物として含まれてる
> Dependency Injection の基本的な考え方は、独立したオブジェクトをAssembler(組み立て係)として用意し、
563仕様書無しさん
2018/05/13(日) 07:37:22.99 コレも読むと良いよ。この記事はさっき見つけたばかりだが、
同じようなことを考えている人はいるもんだw
(というか10年近く前にすでに言われていたことと
同じことを今更考えていたってだけなんだけどね)
依存性注入(DI)は成功したか?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
>
> しかしながら、DIが最近これほど引っ張りだこになった真の理由は、直交性やカプセル化、
> その他の「純粋な」アーキテクチャ上の問題に関係しているわけではまったくありません。
> 非常に多くのデベロッパがDIを利用している本当の理由は、モックオブジェクトを
> 使ったユニットテストを促進することです。好きなだけくどくど言っても構いませんが、
> 頭の切れるデベロッパを実際に説得して、もっと単純な実装よりもDIを選ばせるようにするのが、
> モックオブジェクトを使ったユニットテストという要因なのです。
>
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
>
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。
同じようなことを考えている人はいるもんだw
(というか10年近く前にすでに言われていたことと
同じことを今更考えていたってだけなんだけどね)
依存性注入(DI)は成功したか?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
>
> しかしながら、DIが最近これほど引っ張りだこになった真の理由は、直交性やカプセル化、
> その他の「純粋な」アーキテクチャ上の問題に関係しているわけではまったくありません。
> 非常に多くのデベロッパがDIを利用している本当の理由は、モックオブジェクトを
> 使ったユニットテストを促進することです。好きなだけくどくど言っても構いませんが、
> 頭の切れるデベロッパを実際に説得して、もっと単純な実装よりもDIを選ばせるようにするのが、
> モックオブジェクトを使ったユニットテストという要因なのです。
>
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
>
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。
564仕様書無しさん
2018/05/13(日) 08:03:26.01 >>563
まさにその記事に
あなたがGoFのファンであるなら、これは実際Strategyパターンなのです。 依存性注入は(私の見るところ)基本的にひとまとめに使われるStrategyパターンです。
って書いてあるんだけど、どういうことです??
まさにその記事に
あなたがGoFのファンであるなら、これは実際Strategyパターンなのです。 依存性注入は(私の見るところ)基本的にひとまとめに使われるStrategyパターンです。
って書いてあるんだけど、どういうことです??
565仕様書無しさん
2018/05/13(日) 08:04:45.94 「ひとまとめ」がDIコンテナってこと?
566仕様書無しさん
2018/05/13(日) 08:39:18.13 DI=ストラテジーパターンを使ってアプリケーションの依存性を一箇所にまとめる
って意味かと思ってた。別にDIコンテナ使ってもいいけど、俺使ったことないしな
って意味かと思ってた。別にDIコンテナ使ってもいいけど、俺使ったことないしな
567仕様書無しさん
2018/05/13(日) 08:57:29.71 ここまで一つもメリットなし
568仕様書無しさん
2018/05/13(日) 09:00:49.34569仕様書無しさん
2018/05/13(日) 09:06:30.38 >>568
え?メリットが説明できないようなゴミのデメリット探して何がしたいのかわからない
デメリットが無いから利点しかないとか言い出す気?
もうそんなこと言い出したらプログラマっていうか技術者引退を考えたほうがいいよ
え?メリットが説明できないようなゴミのデメリット探して何がしたいのかわからない
デメリットが無いから利点しかないとか言い出す気?
もうそんなこと言い出したらプログラマっていうか技術者引退を考えたほうがいいよ
571仕様書無しさん
2018/05/13(日) 09:13:01.64 人類にとってもお前がこれ以上地球にいても何の役にも立たないだろ
574仕様書無しさん
2018/05/13(日) 09:20:11.93 マーチンファウラーって何作った人?
575仕様書無しさん
2018/05/13(日) 09:23:07.69 マーチンファウラー自体が意味のない技術をでっち上げて金を取る詐欺師じゃん
これまでの経歴がそう
これからの経歴もコイツの芸風がそうだから変わらないだろうな
コイツがいいと言っている技術はおそらくゴミ
これまでの経歴がそう
これからの経歴もコイツの芸風がそうだから変わらないだろうな
コイツがいいと言っている技術はおそらくゴミ
577仕様書無しさん
2018/05/13(日) 09:32:04.37 外的コントロールによるプログラミングか
内的コントロールによるプログラミングか
の違いに思えてきた。
ほとんどの人間が「作れ!」と外的コントロールによってシステムを作る。
この場合、アジャイルも疎結合も、再利用性も意味がない。だって作れと言われたものを作るのがゴールなんだもん。
しかし、内的コントロールでプログラムしてるやつは「世の中にはこんなシステムが必要だ」とか
よくよく考えてみたら、この方法は良くない。とか、言われてやるんじゃなくて
自分のやってることがどのように繋がるか考えてやってるわけで、
安定した給料で働けばいいって思考してないわけだよ。失敗したらリスクが伴うわけだ。
だからDIによって得られるアプリケーションの柔軟性は、自分で行動してるやつには価値があり
言われるがままやってるやつには無価値なものとなる
...のかなあ??自分でも変なこと言ってるなとか思うけど
内的コントロールによるプログラミングか
の違いに思えてきた。
ほとんどの人間が「作れ!」と外的コントロールによってシステムを作る。
この場合、アジャイルも疎結合も、再利用性も意味がない。だって作れと言われたものを作るのがゴールなんだもん。
しかし、内的コントロールでプログラムしてるやつは「世の中にはこんなシステムが必要だ」とか
よくよく考えてみたら、この方法は良くない。とか、言われてやるんじゃなくて
自分のやってることがどのように繋がるか考えてやってるわけで、
安定した給料で働けばいいって思考してないわけだよ。失敗したらリスクが伴うわけだ。
だからDIによって得られるアプリケーションの柔軟性は、自分で行動してるやつには価値があり
言われるがままやってるやつには無価値なものとなる
...のかなあ??自分でも変なこと言ってるなとか思うけど
582仕様書無しさん
2018/05/13(日) 10:00:34.88 外的コントロールでも最初に決まったものを作るだけでいいなんて所あるのか?
完璧な設計書なんて見たことない
完璧な設計書なんて見たことない
583仕様書無しさん
2018/05/13(日) 10:04:54.65 >>582
もちろん、そんな白黒した話ではないさ
でも、まとまったストラテジー(もうDIっていうとアンチ湧くからなるべく言わない)が
アプリケーションに柔軟性を持たせられるのは事実だし
そんな柔軟性イラネってプロジェクトがあるのも事実だろう
もちろん、そんな白黒した話ではないさ
でも、まとまったストラテジー(もうDIっていうとアンチ湧くからなるべく言わない)が
アプリケーションに柔軟性を持たせられるのは事実だし
そんな柔軟性イラネってプロジェクトがあるのも事実だろう
584仕様書無しさん
2018/05/13(日) 10:11:12.05 DI(コンテナ)のメリットねぇ...
DBがあって、サーバーがあって、クライアント(当時流行ってたRIA)があって、クライアントとサーバーはRPCで通信して...
そんな業務システムを作るとき、役に立ったと思う
なお、リーダーとフレームワーク担当以外は、低スキル低コミュ力のSESガイジ部隊
サービスクラス、ロジッククラス、Daoクラス、状態を持たないこれらは、DIコンテナでシングルトンな物としてインジェクション。
・トランザクション管理、RPC公開なんかを、AOPのインターセプタに任せる事ができる
・new の手間やライフサイクル管理が省ける
本番、ステージング、開発など、環境別に定義が必要な物は外からインジェクション
・DB接続設定とか
・他所の会社のWebインターフェース呼び出し
品質は良いとは言えないけど、厄介な要素をDIコンテナで切り出したからそこそこ均質。
なんとかサービスインできて、保守もできてる。
それが10年くらい前の話で、今もっと良い解決策があるのかはわからない。
状態の無いサービスクラスと振る舞いの無いDto、これらをオブジェクト指向と呼んで良いかはわからない。
DBがあって、サーバーがあって、クライアント(当時流行ってたRIA)があって、クライアントとサーバーはRPCで通信して...
そんな業務システムを作るとき、役に立ったと思う
なお、リーダーとフレームワーク担当以外は、低スキル低コミュ力のSESガイジ部隊
サービスクラス、ロジッククラス、Daoクラス、状態を持たないこれらは、DIコンテナでシングルトンな物としてインジェクション。
・トランザクション管理、RPC公開なんかを、AOPのインターセプタに任せる事ができる
・new の手間やライフサイクル管理が省ける
本番、ステージング、開発など、環境別に定義が必要な物は外からインジェクション
・DB接続設定とか
・他所の会社のWebインターフェース呼び出し
品質は良いとは言えないけど、厄介な要素をDIコンテナで切り出したからそこそこ均質。
なんとかサービスインできて、保守もできてる。
それが10年くらい前の話で、今もっと良い解決策があるのかはわからない。
状態の無いサービスクラスと振る舞いの無いDto、これらをオブジェクト指向と呼んで良いかはわからない。
590仕様書無しさん
2018/05/13(日) 10:29:11.92 無能に工夫されても大弱りなんだがな、引き継がされた人が
593仕様書無しさん
2018/05/13(日) 10:41:47.13597仕様書無しさん
2018/05/13(日) 11:26:53.20 ここまで
分かりやすく例えた人ゼロ
分かりやすく例えた人ゼロ
600仕様書無しさん
2018/05/13(日) 11:48:06.58 ここまでまともな会話ができるDIアンチもゼロ
601仕様書無しさん
2018/05/13(日) 12:14:22.45 >>564
ちゃんと引用しよう
> DIコードの例を示した後に、Kohari氏はDIが
> 本当は何であるか(source)について詳しく述べている。
>
> あなたがGoFのファンであるなら、これは実際Strategyパターンなのです。
> 依存性注入は(私の見るところ)基本的にひとまとめに使われるStrategyパターンです。
お前がDIって呼んでいるものは
本当はストラテジーパターンである。と書いてある
今度からストラテジーパターンと呼ぼうw
そして「基本的にひとまとめに使われるStrategyパターン」と書いてある
そう、ひとまとめ(原文では en masse)に使われるという条件つきのストラテジーパターン
(ひとまとめっていうのは、プログラム起動時にひとまとめに行われその後変更しないということ)
ちゃんと引用しよう
> DIコードの例を示した後に、Kohari氏はDIが
> 本当は何であるか(source)について詳しく述べている。
>
> あなたがGoFのファンであるなら、これは実際Strategyパターンなのです。
> 依存性注入は(私の見るところ)基本的にひとまとめに使われるStrategyパターンです。
お前がDIって呼んでいるものは
本当はストラテジーパターンである。と書いてある
今度からストラテジーパターンと呼ぼうw
そして「基本的にひとまとめに使われるStrategyパターン」と書いてある
そう、ひとまとめ(原文では en masse)に使われるという条件つきのストラテジーパターン
(ひとまとめっていうのは、プログラム起動時にひとまとめに行われその後変更しないということ)
604仕様書無しさん
2018/05/13(日) 12:28:54.04 >>583
> でも、まとまったストラテジー(もうDIっていうとアンチ湧くからなるべく言わない)が
それがいい、本当はストラテジーパターンと呼ぶべき
で、ストラテジーパターンは戦略を切り替えたい時に使うパターン
戦略を切り替える予定はないけど、もしかしたら切り替えたくなるかもしれないじゃない?
だから予めストラテジーパターンを使っておこうよ!
といえば、それが良くないことが理解できるだろう。つまりYAGNI
> でも、まとまったストラテジー(もうDIっていうとアンチ湧くからなるべく言わない)が
それがいい、本当はストラテジーパターンと呼ぶべき
で、ストラテジーパターンは戦略を切り替えたい時に使うパターン
戦略を切り替える予定はないけど、もしかしたら切り替えたくなるかもしれないじゃない?
だから予めストラテジーパターンを使っておこうよ!
といえば、それが良くないことが理解できるだろう。つまりYAGNI
605仕様書無しさん
2018/05/13(日) 12:33:21.34 >>603
依存関係をコードではなくXML形式の設定ファイルから
読み込むことを想像してみたらわかると思う
(実際多くのDIコンテナはXMLファイルに依存関係を定義する)
1つのXMLファイルでアプリケーション全ての依存関係を定義する。(実際にそうなってる)
そして依存関係を定義したXMLファイルを読み込むのは1回だけ。
その後はプログラムが起動している間は依存関係の定義は変更しない
依存関係をコードではなくXML形式の設定ファイルから
読み込むことを想像してみたらわかると思う
(実際多くのDIコンテナはXMLファイルに依存関係を定義する)
1つのXMLファイルでアプリケーション全ての依存関係を定義する。(実際にそうなってる)
そして依存関係を定義したXMLファイルを読み込むのは1回だけ。
その後はプログラムが起動している間は依存関係の定義は変更しない
606仕様書無しさん
2018/05/13(日) 12:52:28.87 >>604
なんかオブジェクト指向そのものを否定する話になってる気がするんだけど。
オブジェクト指向って、変更に柔軟に対応するためにクラスに抽出するプログラミングスタイルだろ??
100パーセント変更の無いものを想定するのはそりゃ過剰実装だけど、ストラテジーパターンを使った柔軟性くらいあってもよくね?
クラス内部で定義してるものを外に出すだけで、コード量がクソ複雑になったりしないし
やっぱり俺としては拡張に対して開ききってから閉じたほうが、柔軟性のあるアプリケーションが作れると感じてしまうわ
なんかオブジェクト指向そのものを否定する話になってる気がするんだけど。
オブジェクト指向って、変更に柔軟に対応するためにクラスに抽出するプログラミングスタイルだろ??
100パーセント変更の無いものを想定するのはそりゃ過剰実装だけど、ストラテジーパターンを使った柔軟性くらいあってもよくね?
クラス内部で定義してるものを外に出すだけで、コード量がクソ複雑になったりしないし
やっぱり俺としては拡張に対して開ききってから閉じたほうが、柔軟性のあるアプリケーションが作れると感じてしまうわ
607仕様書無しさん
2018/05/13(日) 12:54:44.87608仕様書無しさん
2018/05/13(日) 12:57:17.52611仕様書無しさん
2018/05/13(日) 13:01:18.37 >>609
読んだら?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
>
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
>
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。
読んだら?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
>
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
>
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。
612仕様書無しさん
2018/05/13(日) 13:02:29.94 はい、またしばらく離席するよ
613仕様書無しさん
2018/05/13(日) 13:06:37.82614仕様書無しさん
2018/05/13(日) 13:09:42.82 > それで、何故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;
}
面倒くさいから。
まとまったストラテジーの「まとまった」の部分
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;
}
615仕様書無しさん
2018/05/13(日) 13:12:24.93 多分わかってないのが、おれはDI(まとまったストラテジー)を好んでるけど
DIコンテナなんて作ったことも必要としたこともないからね
XMLを使ってアプリケーションの依存性を管理とかやりすぎだと思うし意味不明だわ
まあ、やったことないから知らんけど、その件はもうずっと>>2-11に書いてるのに
今更「おれの中でのDIはDIコンテナも含む」とか言われてもな...
DIコンテナなんて作ったことも必要としたこともないからね
XMLを使ってアプリケーションの依存性を管理とかやりすぎだと思うし意味不明だわ
まあ、やったことないから知らんけど、その件はもうずっと>>2-11に書いてるのに
今更「おれの中でのDIはDIコンテナも含む」とか言われてもな...
616仕様書無しさん
2018/05/13(日) 13:19:29.25 >>599
何が言いたいのかさっぱりわからん
俺が聞きたいのは、
DOMツリーはその名の通り木構造だし、
DOM操作用のメソッドが定義されているけど、
それを使ってDOMツリーにDOMオブジェクトを挿入するのはメソッドインジェクションなの?ってこと。
何が言いたいのかさっぱりわからん
俺が聞きたいのは、
DOMツリーはその名の通り木構造だし、
DOM操作用のメソッドが定義されているけど、
それを使ってDOMツリーにDOMオブジェクトを挿入するのはメソッドインジェクションなの?ってこと。
622仕様書無しさん
2018/05/13(日) 14:00:04.67623仕様書無しさん
2018/05/13(日) 14:22:47.09624仕様書無しさん
2018/05/13(日) 14:27:48.77 domとか言い出すわかってないアホの登場でごちゃごちゃになった
明日また来るから沈静化しとけよ
明日また来るから沈静化しとけよ
625仕様書無しさん
2018/05/13(日) 14:59:31.79 >>623
やっぱり何が言いたいのかわからない。
appendChildはメソッドインジェクションなの?
違うの?
木構造なんだから各ノードは別のノードを挿入するメソッドを持っているよ。
appendChildはどのDOMオブジェクトも持っている。
DOMオブジェクトを引数に取るオブジェクトもある。
やっぱり何が言いたいのかわからない。
appendChildはメソッドインジェクションなの?
違うの?
木構造なんだから各ノードは別のノードを挿入するメソッドを持っているよ。
appendChildはどのDOMオブジェクトも持っている。
DOMオブジェクトを引数に取るオブジェクトもある。
626仕様書無しさん
2018/05/13(日) 15:10:28.81 インジェクションされたほうはインターフェースを実装したオブジェクトが
何であるかを気にせずに使う事ができるというだけの話だと思うんだが
何であるかを気にせずに使う事ができるというだけの話だと思うんだが
627仕様書無しさん
2018/05/13(日) 16:55:53.74 appendChildは、DOMの振る舞いを変えるために呼び出すのか?
→DOMが表現しているデータを操作する(子を追加する)ために呼び出すんだよね
appendChildをprivateにして、DOMのコンストラクタ内でappendChildすると、DOMは成り立つか?
→成り立たないよね
なぜDOMの話になったのか知らないけど、appendChildはストラテジーパターンの目的からは違うと思うよ
DIの話はぐちゃぐちゃで良く分からんが、やっぱ違うじゃないの
→DOMが表現しているデータを操作する(子を追加する)ために呼び出すんだよね
appendChildをprivateにして、DOMのコンストラクタ内でappendChildすると、DOMは成り立つか?
→成り立たないよね
なぜDOMの話になったのか知らないけど、appendChildはストラテジーパターンの目的からは違うと思うよ
DIの話はぐちゃぐちゃで良く分からんが、やっぱ違うじゃないの
628仕様書無しさん
2018/05/13(日) 17:09:41.48 >>625
> appendChildはメソッドインジェクションなの?
> 違うの?
どう見ても違うだろ・・・
appendChildはただのメソッドだし
DOMは複数のデザインパターンが使われてるが
お前が言いたいのは、Compositeデザインパターンだろ?
https://ja.wikipedia.org/wiki/Composite_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
> appendChildはメソッドインジェクションなの?
> 違うの?
どう見ても違うだろ・・・
appendChildはただのメソッドだし
DOMは複数のデザインパターンが使われてるが
お前が言いたいのは、Compositeデザインパターンだろ?
https://ja.wikipedia.org/wiki/Composite_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
629仕様書無しさん
2018/05/13(日) 17:25:38.70 >>615
> 多分わかってないのが、おれはDI(まとまったストラテジー)を好んでるけど
> DIコンテナなんて作ったことも必要としたこともないからね
お前がオレオレ用語としてDIを使ってるだけだな
DIの解説記事でDIコンテナに触れてないものがあるなら
教えてほしいぐらいだ
DIっていうのは「コンストラクタでオブジェクトを渡す」ことを
専門用語で言った言葉ではなくて、パターン名
DIパターンには必ずDIコンテナがでてくる
> 多分わかってないのが、おれはDI(まとまったストラテジー)を好んでるけど
> DIコンテナなんて作ったことも必要としたこともないからね
お前がオレオレ用語としてDIを使ってるだけだな
DIの解説記事でDIコンテナに触れてないものがあるなら
教えてほしいぐらいだ
DIっていうのは「コンストラクタでオブジェクトを渡す」ことを
専門用語で言った言葉ではなくて、パターン名
DIパターンには必ずDIコンテナがでてくる
630仕様書無しさん
2018/05/13(日) 18:03:03.87 オブジェクト指向を分かりやすく例えて教えようとすると話がまとまらない事だけはわかった
631仕様書無しさん
2018/05/13(日) 18:12:16.99 5chで話がまとまったことなんてあるのか
632仕様書無しさん
2018/05/13(日) 18:18:52.66 DIコンテナもつかわず、依存関係も静的に決まらないオレオレDIって
それ単なるグローバル変数じゃん馬鹿なの?
それ単なるグローバル変数じゃん馬鹿なの?
633仕様書無しさん
2018/05/13(日) 18:22:05.27 相手を罵倒するためだけの人って生きてて楽しいのかな?
637仕様書無しさん
2018/05/13(日) 19:37:35.61638仕様書無しさん
2018/05/13(日) 20:28:09.55 インジェクションおじさん
インジェクションという用語がカッコイイと
なんでもかんでもインジェクションという永遠の厨二病
関数にオブジェクトをインジェクション!
はがきをポストにインジェクション!
車庫に車をインジェクション!
などとよくわからない使い方をする
だが童貞のためエロネタとしては使わない
※ DI用語のインジェクションとは一切関係ありません
インジェクションという用語がカッコイイと
なんでもかんでもインジェクションという永遠の厨二病
関数にオブジェクトをインジェクション!
はがきをポストにインジェクション!
車庫に車をインジェクション!
などとよくわからない使い方をする
だが童貞のためエロネタとしては使わない
※ DI用語のインジェクションとは一切関係ありません
640仕様書無しさん
2018/05/13(日) 20:47:42.08 多枚刃カミソリの商品名だっけ?
641仕様書無しさん
2018/05/14(月) 02:05:11.52 DI信者が完全に論破されててワロタ
642仕様書無しさん
2018/05/14(月) 06:30:09.15 オブジェクト指向はこんな不毛な争いを生むことは理解した
644仕様書無しさん
2018/05/14(月) 07:08:33.53645仕様書無しさん
2018/05/14(月) 07:20:01.50 だからバカに
分かりやすく例えて教えろよ
分かりやすく例えて教えろよ
646仕様書無しさん
2018/05/14(月) 07:25:21.16 比喩で教えて欲しいなら「喩えて」じゃないの?
それとも例示で理解できるの?
それとも例示で理解できるの?
650仕様書無しさん
2018/05/14(月) 08:17:25.85 ここまで全員俺よりバカ
652仕様書無しさん
2018/05/14(月) 08:39:08.81 >>651
一つの例で全てを説明する必要はないんやで
DIの話に戻すと
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Kohari氏はのちのポストで、 DIはスケールしないというProffitt氏の元々の
> 主張(source)に対し、フレームワークを使う重要性を再度述べて返答している。
>
> 現実世界のシナリオでは、手動で行う依存性注入はただ単にスケールしないのです。
これも重要な所
フレームワークを使わないでDIをやっていますって主張をみたら
それはすごく小さなプロジェクトだと思ったほうが良い
一つの例で全てを説明する必要はないんやで
DIの話に戻すと
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Kohari氏はのちのポストで、 DIはスケールしないというProffitt氏の元々の
> 主張(source)に対し、フレームワークを使う重要性を再度述べて返答している。
>
> 現実世界のシナリオでは、手動で行う依存性注入はただ単にスケールしないのです。
これも重要な所
フレームワークを使わないでDIをやっていますって主張をみたら
それはすごく小さなプロジェクトだと思ったほうが良い
653仕様書無しさん
2018/05/14(月) 08:46:38.62 こんなとこで否定して俺が正しいやっててもスキル上がらんよ
654仕様書無しさん
2018/05/14(月) 08:49:25.04 否定するために調べるからスキル上がったよw
656仕様書無しさん
2018/05/14(月) 09:12:51.20658仕様書無しさん
2018/05/14(月) 11:20:37.65 お?議論に勝てないからアホな質問を繰り返して
相手を疲弊させる作戦かな?
DI信者はセコイなw
相手を疲弊させる作戦かな?
DI信者はセコイなw
661仕様書無しさん
2018/05/14(月) 15:51:30.45 と、まともに回答することができないのが
DIアンチなのであった。
ー 完 ー
DIアンチなのであった。
ー 完 ー
663仕様書無しさん
2018/05/14(月) 18:32:54.16664仕様書無しさん
2018/05/14(月) 18:44:23.94 つまり>661はDIアンチか。
665仕様書無しさん
2018/05/14(月) 19:15:39.78 ばーか とか負け犬の敗北宣言じゃねーか
宣言せずスルーすりゃ良いのに
宣言せずスルーすりゃ良いのに
666仕様書無しさん
2018/05/14(月) 19:57:39.70 >>663
DIコンテナを使わずにDIするっていう言い方も微妙だけどねw
DIコンテナがDI(依存性注入)するのと同等の事を
手動でコードを書いてやるとスケールしない
ひたすらに面倒な作業になる
DIパターンっていうのはDIコンテナを使うのが事実上の要件になってる
だからDIの話をするとDIコンテナは必ず出てくることになる
DIコンテナを使わずにDIするっていう言い方も微妙だけどねw
DIコンテナがDI(依存性注入)するのと同等の事を
手動でコードを書いてやるとスケールしない
ひたすらに面倒な作業になる
DIパターンっていうのはDIコンテナを使うのが事実上の要件になってる
だからDIの話をするとDIコンテナは必ず出てくることになる
667仕様書無しさん
2018/05/14(月) 20:20:28.13 なるほど、やっぱりDIは面倒なだけでメリットないんですね
668仕様書無しさん
2018/05/14(月) 20:43:12.97 DIコンテナを使って、ひとまとめ(一箇所)で依存性を
解決するのがDIって言えば良いんだろうな
呼び出す時に依存性を解决したらDIではない
解決するのがDIって言えば良いんだろうな
呼び出す時に依存性を解决したらDIではない
669仕様書無しさん
2018/05/14(月) 20:55:41.50 相変わらずバズっとるのうおまえらw
オブジェクト指向はどうした?w
オブジェクト指向はどうした?w
670仕様書無しさん
2018/05/14(月) 21:10:57.02 オブジェクト指向では汎化と特化より分解と集約が好まれて、
集約の中でもコンストラクタインジェクションが好まれる、
という説明がことの始まりじゃないかな
彼らの中ではオブジェクト指向の話なんだろう
集約の中でもコンストラクタインジェクションが好まれる、
という説明がことの始まりじゃないかな
彼らの中ではオブジェクト指向の話なんだろう
671仕様書無しさん
2018/05/14(月) 21:11:25.72 ここまで全員俺よりバカ
673仕様書無しさん
2018/05/14(月) 21:49:22.70 コンストラクタインジェクション最大のメリット
コピペが簡単
インターフェース以外に依存してないもんだから
下位が芋づる式にぞろぞろついてくることが少ない
ちょっとファイル移動したらもう別プロジェクトで使えたりする
コピペが簡単
インターフェース以外に依存してないもんだから
下位が芋づる式にぞろぞろついてくることが少ない
ちょっとファイル移動したらもう別プロジェクトで使えたりする
674仕様書無しさん
2018/05/14(月) 21:54:21.16 「欲しかったのはバナナだけなのに、それを持ってたゴリラどころか、ゴリラがいたジャングルごとついてきた」
675仕様書無しさん
2018/05/14(月) 21:57:46.11 大漁!大漁!
大漁!大漁!
大漁!大漁!
676仕様書無しさん
2018/05/14(月) 22:04:02.12 神クラス作るなよ
677仕様書無しさん
2018/05/14(月) 22:04:11.23 インターフェース以外に依存してないもんだから
下位が芋づる式にぞろぞろついてくることが少ない
ちょっとファイル移動したらもう別プロジェクトで使えたりする
そうか。じゃあこのHogeってクラスだけ使いたいんだが、
はいどうぞ。
あれ?動かないけど?
コンストラクタ見てください、インターフェースFooが必要なんです。
はいどうぞ
あれ?動かないけど?
そりゃFooはインターフェースですからね。Fooを実装したHageクラスが必要です。
はいどうぞ
あれ?動かないけど?
Hageのコンストラクタ見てください、インターフェースBarが必要なんです。
あれ?動かないけど?
そりゃBarはインターフェースですからね。Barを実装したHigeクラスが必要です。
はいどうぞ
あの?Hogeってクラスだけ使いたいって言ったよね?
依存してるもの全部無いと動くわけないじゃないですかーw
下位が芋づる式にぞろぞろついてくることが少ない
ちょっとファイル移動したらもう別プロジェクトで使えたりする
そうか。じゃあこのHogeってクラスだけ使いたいんだが、
はいどうぞ。
あれ?動かないけど?
コンストラクタ見てください、インターフェースFooが必要なんです。
はいどうぞ
あれ?動かないけど?
そりゃFooはインターフェースですからね。Fooを実装したHageクラスが必要です。
はいどうぞ
あれ?動かないけど?
Hageのコンストラクタ見てください、インターフェースBarが必要なんです。
あれ?動かないけど?
そりゃBarはインターフェースですからね。Barを実装したHigeクラスが必要です。
はいどうぞ
あの?Hogeってクラスだけ使いたいって言ったよね?
依存してるもの全部無いと動くわけないじゃないですかーw
678仕様書無しさん
2018/05/14(月) 22:10:13.19 モックぶちこんどきゃいいだろ!
679仕様書無しさん
2018/05/14(月) 22:12:55.39 モック?
おお、動いた?
あれ? これなにをやっても全部同じ動きしかしないんだけど?
モックなんだから、何やっても同じに決まってるじゃないですかーw
おお、動いた?
あれ? これなにをやっても全部同じ動きしかしないんだけど?
モックなんだから、何やっても同じに決まってるじゃないですかーw
680仕様書無しさん
2018/05/14(月) 22:16:10.32 ライブラリをごっそり入れ替えるときとかに役立ちそうだが、
その場合は互換ライブラリが存在するのが前提になるなあ
ラッパーとかアダプタとか用意して差異を吸収しておく方法もあるだろうけど、
そんなことしたらかえって工数が増えるよねえ
自作の部分クラスに互換性を持たせてあるなら、
集約クラスのコンストラクタでnewしておいたって、
そこを書き換えるだけだろうし
その場合は互換ライブラリが存在するのが前提になるなあ
ラッパーとかアダプタとか用意して差異を吸収しておく方法もあるだろうけど、
そんなことしたらかえって工数が増えるよねえ
自作の部分クラスに互換性を持たせてあるなら、
集約クラスのコンストラクタでnewしておいたって、
そこを書き換えるだけだろうし
681仕様書無しさん
2018/05/14(月) 22:21:38.41 結局DIが生きるのはテストのときぐらいという
最初から言われている結論に戻りましたなw
最初から言われている結論に戻りましたなw
682仕様書無しさん
2018/05/14(月) 22:24:49.39 大漁!大漁!
大漁!大漁!
大漁!大漁!
683仕様書無しさん
2018/05/14(月) 22:30:57.15 お前さオブジェクト指向に限らず迷路作ってるだろ
684仕様書無しさん
2018/05/14(月) 22:31:19.63 いりもしないロガーとかDB書き込みとか
下位で特定のフレームワークに依存してたりとか
そういのがバッサリ
下位で特定のフレームワークに依存してたりとか
そういのがバッサリ
685仕様書無しさん
2018/05/14(月) 22:32:45.06 DB周りの実装したことすら無さそう
686仕様書無しさん
2018/05/14(月) 22:35:10.78 拡張性をもたせるのは良いけど、実際に作ったら
コレにだけ対応すれば良い。というのが現実だしな。
拡張性をもたせるのはフレームワークさんに任せるわw
コレにだけ対応すれば良い。というのが現実だしな。
拡張性をもたせるのはフレームワークさんに任せるわw
688仕様書無しさん
2018/05/14(月) 22:51:53.48 >>687
読んだら?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
> しかしながら、DIが最近これほど引っ張りだこになった真の理由は、直交性やカプセル化、
> その他の「純粋な」アーキテクチャ上の問題に関係しているわけではまったくありません。
> 非常に多くのデベロッパがDIを利用している本当の理由は、モックオブジェクトを使った
> ユニットテストを促進することです。好きなだけくどくど言っても構いませんが、
> 頭の切れるデベロッパを実際に説得して、もっと単純な実装よりもDIを選ばせるようにするのが、
> モックオブジェクトを使ったユニットテストという要因なのです。
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。
> ところが、Proffitt氏はDIなしでユニットテストを利用するのである。
> TypeMock(サイト・英語)フレームワークを使うのだが、TypeMockフレームワークでは、
> テスト中のコード内に依存性が作成されたとしても、その依存性の呼び出しを
> インターセプトできるのだ。つまりProffitt氏は、ユニットテスト用のモックを
> 作成できるようにするために、オブジェクトをデカップルする必要はないと述べている。
読んだら?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
> しかしながら、DIが最近これほど引っ張りだこになった真の理由は、直交性やカプセル化、
> その他の「純粋な」アーキテクチャ上の問題に関係しているわけではまったくありません。
> 非常に多くのデベロッパがDIを利用している本当の理由は、モックオブジェクトを使った
> ユニットテストを促進することです。好きなだけくどくど言っても構いませんが、
> 頭の切れるデベロッパを実際に説得して、もっと単純な実装よりもDIを選ばせるようにするのが、
> モックオブジェクトを使ったユニットテストという要因なのです。
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。
> ところが、Proffitt氏はDIなしでユニットテストを利用するのである。
> TypeMock(サイト・英語)フレームワークを使うのだが、TypeMockフレームワークでは、
> テスト中のコード内に依存性が作成されたとしても、その依存性の呼び出しを
> インターセプトできるのだ。つまりProffitt氏は、ユニットテスト用のモックを
> 作成できるようにするために、オブジェクトをデカップルする必要はないと述べている。
689仕様書無しさん
2018/05/14(月) 23:01:51.86 お前がProffitt推しだということは分かった
691仕様書無しさん
2018/05/14(月) 23:20:03.28692仕様書無しさん
2018/05/14(月) 23:28:46.30 >>691
> コンストラクタインジェクションすれば可視性の変更は必要ないじゃないか
いやいやいやw
本質が見えてないぞ。
確かにコンストラクタの引数に渡すオブジェクト、
そのオブジェクトを代入する変数はprivateでいい
だがな、そのオブジェクトはどこから来た?
コンストラクタの引数にして渡すってことは、
呼び出し側が持ってるってことだぞ
privateだとインスタンスから取り出すことはできないが、
そもそも呼び出し側が持ってるのだから、そこから変更ができる。
取り出し済み状態なのと同じだ
> コンストラクタインジェクションすれば可視性の変更は必要ないじゃないか
いやいやいやw
本質が見えてないぞ。
確かにコンストラクタの引数に渡すオブジェクト、
そのオブジェクトを代入する変数はprivateでいい
だがな、そのオブジェクトはどこから来た?
コンストラクタの引数にして渡すってことは、
呼び出し側が持ってるってことだぞ
privateだとインスタンスから取り出すことはできないが、
そもそも呼び出し側が持ってるのだから、そこから変更ができる。
取り出し済み状態なのと同じだ
693仕様書無しさん
2018/05/14(月) 23:32:47.31 DIコンテナがしてくれるので、呼び出し側は持ってない
694仕様書無しさん
2018/05/15(火) 00:00:34.11 あー、依存性の注入はDIコンテナがやるものって認めたわけかw
695仕様書無しさん
2018/05/15(火) 00:19:35.55 DIの本質の話とは分けて話そうねというだけなのでは
698仕様書無しさん
2018/05/15(火) 00:30:26.86 今度は権威をチラつかせてゴミを売りつけようとしだしたな
自分で語る言葉は尽きたのか?
自分で語る言葉は尽きたのか?
703仕様書無しさん
2018/05/15(火) 00:41:43.90 >>700
お前の目的を叶えるために、俺がソースを読むって矛盾してると思わない?
ソース読んだ。だからといって別に持論を変える必要はなかった。
って言われたらお前どうするのさ?
お前がなにか言いたいことがあるなら、ソースの何処かを引用して
お前が語るべきだ
お前の目的を叶えるために、俺がソースを読むって矛盾してると思わない?
ソース読んだ。だからといって別に持論を変える必要はなかった。
って言われたらお前どうするのさ?
お前がなにか言いたいことがあるなら、ソースの何処かを引用して
お前が語るべきだ
707仕様書無しさん
2018/05/15(火) 00:47:57.03708仕様書無しさん
2018/05/15(火) 00:52:01.86 >>706
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
ここの図
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
Dependency Injection の "基本的な" 考え方です。
これが基本なのでオレオレで解釈しないように
で、この図に出てくるAssembler(組み立て係)がDIコンテナ
Assembler(組み立て係)がインジェクションを行うというアイデア
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
ここの図
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
Dependency Injection の "基本的な" 考え方です。
これが基本なのでオレオレで解釈しないように
で、この図に出てくるAssembler(組み立て係)がDIコンテナ
Assembler(組み立て係)がインジェクションを行うというアイデア
714仕様書無しさん
2018/05/15(火) 00:56:56.70716仕様書無しさん
2018/05/15(火) 01:05:47.78 >>715
こんなところですかな
https://qiita.com/Yarimizu14/items/c81a8cf1859f954b953e
class ApplicationController < ActionController::API
include ActionController::HttpAuthentication::Token::ControllerMethods
before_action :authenticate
protected
def authenticate
authenticate_or_request_with_http_token do |token, options|
token == 'FOO'
end
end
end
こんなところですかな
https://qiita.com/Yarimizu14/items/c81a8cf1859f954b953e
class ApplicationController < ActionController::API
include ActionController::HttpAuthentication::Token::ControllerMethods
before_action :authenticate
protected
def authenticate
authenticate_or_request_with_http_token do |token, options|
token == 'FOO'
end
end
end
720仕様書無しさん
2018/05/15(火) 01:15:51.33 おじいちゃん必死やな
721仕様書無しさん
2018/05/15(火) 01:16:41.31722仕様書無しさん
2018/05/15(火) 01:17:53.00 だから読みなさいじゃなくて、お前が読んで
引用して反論しろってw
ごまかしは無理だぞ?w
引用して反論しろってw
ごまかしは無理だぞ?w
723仕様書無しさん
2018/05/15(火) 01:20:17.87 英語読めなくて悔しいのね
727仕様書無しさん
2018/05/15(火) 01:23:44.34734仕様書無しさん
2018/05/15(火) 01:29:59.76 >>730
https://qiita.com/Yarimizu14/items/c81a8cf1859f954b953e
class ApplicationController < ActionController::API
include ActionController::HttpAuthentication::Token::ControllerMethods
before_action :authenticate
protected
def authenticate
authenticate_or_request_with_http_token do |token, options|
token == 'FOO'
end
end
end
https://qiita.com/Yarimizu14/items/c81a8cf1859f954b953e
class ApplicationController < ActionController::API
include ActionController::HttpAuthentication::Token::ControllerMethods
before_action :authenticate
protected
def authenticate
authenticate_or_request_with_http_token do |token, options|
token == 'FOO'
end
end
end
738仕様書無しさん
2018/05/15(火) 01:34:58.14 どうやら理解できないようだから解説してやると、
認証周りが必要とするコントローラ
DIでごちゃごちゃ頑張るなんてことはせずに
普通に ActionController::APIを継承している
これにより、全てのアクションの前に実行するbefore_actionメソッドが使えるようになる
また、外からインジェクションしてもらうなんてことをやめ
単純にモジュールでincludeする。これによりauthenticate_or_request_with_http_tokenメソッドが
使えるようになる。
リンク先 https://andrewlock.net/implementing-custom-token-providers-for-passwordless-authentication-in-asp-net-core-identity/ は
DIまわりのことをいろいろやりすぎてごちゃごちゃなってるが、
中でも、StartupクラスのConfigureServicesメソッドがひどい
ここでDIの最も重要な、依存関係の定義をしているわけだが、
DIを使わないだけでコレがまるまる不要になる
また途中ででてくる各種インターフェースも不要
DIではインターフェースが強要されるためそうするしかない
認証周りが必要とするコントローラ
DIでごちゃごちゃ頑張るなんてことはせずに
普通に ActionController::APIを継承している
これにより、全てのアクションの前に実行するbefore_actionメソッドが使えるようになる
また、外からインジェクションしてもらうなんてことをやめ
単純にモジュールでincludeする。これによりauthenticate_or_request_with_http_tokenメソッドが
使えるようになる。
リンク先 https://andrewlock.net/implementing-custom-token-providers-for-passwordless-authentication-in-asp-net-core-identity/ は
DIまわりのことをいろいろやりすぎてごちゃごちゃなってるが、
中でも、StartupクラスのConfigureServicesメソッドがひどい
ここでDIの最も重要な、依存関係の定義をしているわけだが、
DIを使わないだけでコレがまるまる不要になる
また途中ででてくる各種インターフェースも不要
DIではインターフェースが強要されるためそうするしかない
741仕様書無しさん
2018/05/15(火) 01:36:22.99 >>739
ActionController::HttpAuthentication::Token::ControllerMethods
ActionController::HttpAuthentication::Token::ControllerMethods
749仕様書無しさん
2018/05/15(火) 01:41:13.70 何このキチガイ
751仕様書無しさん
2018/05/15(火) 01:42:32.36 わかってない!わかってない!わかってない!
お前はわかってないんだ!
ほら、みんな、俺を信じてくれるだろう?
あいつは、わかってないんだ!!
お前はわかってないんだ!
ほら、みんな、俺を信じてくれるだろう?
あいつは、わかってないんだ!!
754仕様書無しさん
2018/05/15(火) 01:43:55.96 長文はキチガイなんだよ。
ほら、な?みんなもそう思ってるだろ?
そうだっていってくれよ!
ほら、な?みんなもそう思ってるだろ?
そうだっていってくれよ!
760仕様書無しさん
2018/05/15(火) 01:47:58.69 ここまで全部一人
762仕様書無しさん
2018/05/15(火) 01:52:05.97 書きたくはないけど見てみたい
763仕様書無しさん
2018/05/15(火) 01:54:47.59 つーかCOBOLだとCOBOLの言語仕様で
すべてが決まってるじゃん。
それじゃDIの話にならないよね?
ってそれが狙いでしょ?
手の内をばらしてよかった?
すべてが決まってるじゃん。
それじゃDIの話にならないよね?
ってそれが狙いでしょ?
手の内をばらしてよかった?
773仕様書無しさん
2018/05/15(火) 02:04:20.81 で、DIの話を戻すと>>734はDI信者的には
継承元の ActionController::APIに依存してるだろ
(インジェクションされるオブジェクトとは違うけど)
ActionController::HttpAuthentication::Token::ControllerMethods に依存してるだろ
コンストラクタで認証モジュールをインジェクションしてもらって使いなさい
ってことになるんだろうけど、
普通に継承者ならコンポジションやらを使えば自然な感じに実装できる
たしかに変更時にはApplicationControllerを修正しなければならないが、
それは修正すればいいってだけのこと
それよりも必要でもないのに拡張性を重視し、インターフェースを追加し
コンストラクタを追加し、コンストラクタインジェクションされたオブジェクトを
private変数に入れるコードを追加し、なによりDIの依存関係をひとまとめに書いている所に
さらにコードを増やすほうが大変な作業
継承元の ActionController::APIに依存してるだろ
(インジェクションされるオブジェクトとは違うけど)
ActionController::HttpAuthentication::Token::ControllerMethods に依存してるだろ
コンストラクタで認証モジュールをインジェクションしてもらって使いなさい
ってことになるんだろうけど、
普通に継承者ならコンポジションやらを使えば自然な感じに実装できる
たしかに変更時にはApplicationControllerを修正しなければならないが、
それは修正すればいいってだけのこと
それよりも必要でもないのに拡張性を重視し、インターフェースを追加し
コンストラクタを追加し、コンストラクタインジェクションされたオブジェクトを
private変数に入れるコードを追加し、なによりDIの依存関係をひとまとめに書いている所に
さらにコードを増やすほうが大変な作業
781仕様書無しさん
2018/05/15(火) 02:19:27.00 というか今の論点は言語の違いではなくDIを使うか使わないかの
違いだって話だと分かってないのか?
骨が折れるなぁw
違いだって話だと分かってないのか?
骨が折れるなぁw
783仕様書無しさん
2018/05/15(火) 03:09:53.07 DIを使ったコードと
DIを使わないコードの比較が
見れればそれで良い
DIを使わないコードの比較が
見れればそれで良い
785仕様書無しさん
2018/05/15(火) 04:50:15.80 >>708
この記事ではDIとDIコンテナを明確に分けているようだけど、この人は間違ってるってこと?
ttps://qiita.com/ritukiii/items/de30b2d944109521298f
この記事ではDIとDIコンテナを明確に分けているようだけど、この人は間違ってるってこと?
ttps://qiita.com/ritukiii/items/de30b2d944109521298f
786仕様書無しさん
2018/05/15(火) 04:50:28.03 >>734のテスト?
ますます差が出るばかりだと思うけどw
https://gist.github.com/ndwhtlssthr/b5346256b06d8ce61f8e
読めない人のために解説してあげると
Api::V1::ArticlesController が認証を行うコントローラの親クラスのようだね
このクラスを継承したコントローラは認証が行われる
AuthHelperがテストのためのトークンを生成してる
config.include AuthHelper, :type => :controller
は全てのコントローラで先のAuthHelperを読み込む
FactoryGirl.define はテスト用のデータ生成
Fixture相当のものだと思えばいい
で58行目からがテスト
ますます差が出るばかりだと思うけどw
https://gist.github.com/ndwhtlssthr/b5346256b06d8ce61f8e
読めない人のために解説してあげると
Api::V1::ArticlesController が認証を行うコントローラの親クラスのようだね
このクラスを継承したコントローラは認証が行われる
AuthHelperがテストのためのトークンを生成してる
config.include AuthHelper, :type => :controller
は全てのコントローラで先のAuthHelperを読み込む
FactoryGirl.define はテスト用のデータ生成
Fixture相当のものだと思えばいい
で58行目からがテスト
787仕様書無しさん
2018/05/15(火) 04:51:46.79 indexにアクセスした時に http_login してレスポンスが取得できるかをテストしてる
RSpec.describe Api::V1::ArticlesController, :type => :controller do
describe "GET index" do
it "responds to json" do
create(:api_key)
create_list(:article, 2)
http_login #this is the method call from the AuthHelper module
get :index, format: 'json'
items = JSON.parse(response.body)
first_item = items.first
expect(response.status).to eq(200)
expect(items.count).to eq(1)
expect(first_item["title"]).to eq("How to play cards")
end
end
end
RSpec.describe Api::V1::ArticlesController, :type => :controller do
describe "GET index" do
it "responds to json" do
create(:api_key)
create_list(:article, 2)
http_login #this is the method call from the AuthHelper module
get :index, format: 'json'
items = JSON.parse(response.body)
first_item = items.first
expect(response.status).to eq(200)
expect(items.count).to eq(1)
expect(first_item["title"]).to eq("How to play cards")
end
end
end
788仕様書無しさん
2018/05/15(火) 04:53:19.22 この記事も
ttps://qiita.com/hinom77/items/1d7a30ba5444454a21a8
ttps://qiita.com/hinom77/items/1d7a30ba5444454a21a8
789仕様書無しさん
2018/05/15(火) 04:55:34.16790仕様書無しさん
2018/05/15(火) 04:55:59.61 >>785
> この記事ではDIとDIコンテナを明確に分けているようだけど、この人は間違ってるってこと?
明確に分かれるよ?
DIコンテナは、依存情報の定義に従って
あるオブジェクトに依存するオブジェクトを注入しつつ
オブジェクトを作成するもの
そのDIコンテナが行う依存するオブジェクトの注入のことをDIという
DIはDIコンテナが行う仕事
DIコンテナは仕事を行う仕組み
> この記事ではDIとDIコンテナを明確に分けているようだけど、この人は間違ってるってこと?
明確に分かれるよ?
DIコンテナは、依存情報の定義に従って
あるオブジェクトに依存するオブジェクトを注入しつつ
オブジェクトを作成するもの
そのDIコンテナが行う依存するオブジェクトの注入のことをDIという
DIはDIコンテナが行う仕事
DIコンテナは仕事を行う仕組み
791仕様書無しさん
2018/05/15(火) 04:57:57.09 DIパターンに置いてDIコンテナは事実上必須なので、
DIコンテナがやらないとDIにはならない
DIコンテナがやらないとDIにはならない
792仕様書無しさん
2018/05/15(火) 04:58:17.08 >>708
ttps://ja.m.wikipedia.org/wiki/依存性の注入
Wikipediaでも自動的なDIとしてDIコンテナを解説していてDIコンテナを利用してない手動でのDIの解説がなされてる
ttps://ja.m.wikipedia.org/wiki/依存性の注入
Wikipediaでも自動的なDIとしてDIコンテナを解説していてDIコンテナを利用してない手動でのDIの解説がなされてる
794仕様書無しさん
2018/05/15(火) 05:07:57.01 >>793
手動コンパイラみたいなもん
世界初のPascalのコンパイラはPascalで書かれていたのだが、
世界初ということはPascalコンパイラは存在しない
じゃあどうやってコンパイラをコンパイルしたのか?
答は、人間コンパイラのつもりになってコンパイルした。
だが人間コンパイラはコンパイラのふりをしただけで
コンパイラじゃないんだよ
手動コンパイラみたいなもん
世界初のPascalのコンパイラはPascalで書かれていたのだが、
世界初ということはPascalコンパイラは存在しない
じゃあどうやってコンパイラをコンパイルしたのか?
答は、人間コンパイラのつもりになってコンパイルした。
だが人間コンパイラはコンパイラのふりをしただけで
コンパイラじゃないんだよ
796仕様書無しさん
2018/05/15(火) 05:13:03.73 よくわかんないけどDIコンテナ使わなくてもDIはできるんだよね?
797仕様書無しさん
2018/05/15(火) 05:20:56.94798仕様書無しさん
2018/05/15(火) 05:22:24.26 オレオレDIコンテナを作成した場合はDIだよね?
799仕様書無しさん
2018/05/15(火) 05:25:16.15800仕様書無しさん
2018/05/15(火) 05:27:53.94 >>798
そりゃまあDIコンテナに求められるものを
ちゃんと実装したのならDIコンテナだしDIだと思うが?
DIコンテナに求められるものというのは、
"ひとまとめに" 依存関係を定義できて
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;
}
オブジェクトの作成はこんな感じ
public void testWithPico() {
MutablePicoContainer pico = configureContainer();
MovieLister lister = (MovieLister) pico.getComponentInstance(MovieLister.class);
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West", movies[0].getTitle());
}
そりゃまあDIコンテナに求められるものを
ちゃんと実装したのならDIコンテナだしDIだと思うが?
DIコンテナに求められるものというのは、
"ひとまとめに" 依存関係を定義できて
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;
}
オブジェクトの作成はこんな感じ
public void testWithPico() {
MutablePicoContainer pico = configureContainer();
MovieLister lister = (MovieLister) pico.getComponentInstance(MovieLister.class);
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West", movies[0].getTitle());
}
802仕様書無しさん
2018/05/15(火) 07:20:16.04 大漁!大漁!
大漁!大漁!
大漁!大漁!
803仕様書無しさん
2018/05/15(火) 09:16:14.48 >>801
DIは「依存性オブジェクト注入」のことですよー
って言われてる世界で「ただしDIコンテナ作らなければDIとは言えませんよ!手動でのDIはただのストラテジーです」
なんて認識してる人は少数だよ
なんでDIコンテナなんて言葉作ったの?混乱の元じゃん
DIは「依存性オブジェクト注入」のことですよー
って言われてる世界で「ただしDIコンテナ作らなければDIとは言えませんよ!手動でのDIはただのストラテジーです」
なんて認識してる人は少数だよ
なんでDIコンテナなんて言葉作ったの?混乱の元じゃん
804仕様書無しさん
2018/05/15(火) 11:20:54.45805仕様書無しさん
2018/05/15(火) 12:02:12.91 >>801
DIが、Dependency(依存性オブジェクト)Injection(注入)と解釈されるならば
DIは言葉通り「依存性オブジェクトを注入する」ことを指すのだろう。
その注入方法は
・コンストラクタインジェクション
・セッターインジェクション
・メソッドインジェクション(Interface injection)
の3つがあり、これはストラテジーパターンでも活用される。
ただしDIの依存性注入と手法は同じでもストラテジーパターンは「アルゴリズムを実行時に選択できるようにする」という明確な違いが存在する。
また、DIはストラテジーパターンと異なり、コンポーネント間の依存関係をメインにまとめることができるものであり
アプリケーションの階層をきれいに分離した設計が可能となるのも特徴だ。
また、疎結合性が高まるため、ストラテジーパターン同様の柔軟性が得られ
開放/閉鎖原則の拡張に対して開くという原則にも貢献する。
DIとDIコンテナは別物であり、DIコンテナとは実質ファクトリだ。
単にDIによってコンストラクタが膨れ上がり、気軽にnewできなくなってしまったインスタンスを
生成できるようにするもので、DIコンテナはDIに必ず必要な要素ではない。
よってDIという言葉に含まれている意味は「依存性オブジェクト注入」のみであり、これは実質ストラテジーパターンと同じなのだ
依存性注入(DI)は成功したか?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> あなたがGoFのファンであるなら、これは実際Strategyパターンなのです。 依存性注入は(私の見るところ)基本的にひとまとめに使われるStrategyパターンです。
DIが、Dependency(依存性オブジェクト)Injection(注入)と解釈されるならば
DIは言葉通り「依存性オブジェクトを注入する」ことを指すのだろう。
その注入方法は
・コンストラクタインジェクション
・セッターインジェクション
・メソッドインジェクション(Interface injection)
の3つがあり、これはストラテジーパターンでも活用される。
ただしDIの依存性注入と手法は同じでもストラテジーパターンは「アルゴリズムを実行時に選択できるようにする」という明確な違いが存在する。
また、DIはストラテジーパターンと異なり、コンポーネント間の依存関係をメインにまとめることができるものであり
アプリケーションの階層をきれいに分離した設計が可能となるのも特徴だ。
また、疎結合性が高まるため、ストラテジーパターン同様の柔軟性が得られ
開放/閉鎖原則の拡張に対して開くという原則にも貢献する。
DIとDIコンテナは別物であり、DIコンテナとは実質ファクトリだ。
単にDIによってコンストラクタが膨れ上がり、気軽にnewできなくなってしまったインスタンスを
生成できるようにするもので、DIコンテナはDIに必ず必要な要素ではない。
よってDIという言葉に含まれている意味は「依存性オブジェクト注入」のみであり、これは実質ストラテジーパターンと同じなのだ
依存性注入(DI)は成功したか?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> あなたがGoFのファンであるなら、これは実際Strategyパターンなのです。 依存性注入は(私の見るところ)基本的にひとまとめに使われるStrategyパターンです。
806仕様書無しさん
2018/05/15(火) 17:44:11.53807仕様書無しさん
2018/05/15(火) 17:46:40.76 >>805
> の3つがあり、これはストラテジーパターンでも活用される。
DIはストラテジーパターンよりも後に作られたんだよ?
ストラテジーパターンができた段階で
「コンストラクタインジェクション」などと言う用語はない
最初にストラテジーパターンがあって、
その亜種としてDIが作られた
コンストラクタインジェクション等は、ストラテジーパターンの
亜種のDIを語る時に使う用語であって、ストラテジーパターンで
DI用語を使うのはおかしな話
> の3つがあり、これはストラテジーパターンでも活用される。
DIはストラテジーパターンよりも後に作られたんだよ?
ストラテジーパターンができた段階で
「コンストラクタインジェクション」などと言う用語はない
最初にストラテジーパターンがあって、
その亜種としてDIが作られた
コンストラクタインジェクション等は、ストラテジーパターンの
亜種のDIを語る時に使う用語であって、ストラテジーパターンで
DI用語を使うのはおかしな話
808仕様書無しさん
2018/05/15(火) 17:52:48.15809仕様書無しさん
2018/05/15(火) 19:33:36.19 >>807
コンストラクタインジェクションと言う言葉が先に生まれたとか後に生まれたとかは関係なくて
その言葉が指す意味が、ストラテジーパターンでも活用されるって意味ね
ケツの穴に指を突っ込んで、エビ反りながらオナニーするのを
俺が「エビ反りアナニー」って名付けても、俺よりも前にそれをやってる奴はいるだろう?
コンストラクタインジェクションと言う言葉が先に生まれたとか後に生まれたとかは関係なくて
その言葉が指す意味が、ストラテジーパターンでも活用されるって意味ね
ケツの穴に指を突っ込んで、エビ反りながらオナニーするのを
俺が「エビ反りアナニー」って名付けても、俺よりも前にそれをやってる奴はいるだろう?
810仕様書無しさん
2018/05/15(火) 19:38:42.33 > その言葉が指す意味が、ストラテジーパターンでも活用されるって意味ね
勝手に使い回すな
そういうことをするから
意味不明なことになるんだろ
連想ゲームやってるんじゃないんだ
バナナが黄色だからって、黄色いものを
全部バナナって言ったら意味不明なことになるだろ
勝手に使い回すな
そういうことをするから
意味不明なことになるんだろ
連想ゲームやってるんじゃないんだ
バナナが黄色だからって、黄色いものを
全部バナナって言ったら意味不明なことになるだろ
813仕様書無しさん
2018/05/15(火) 20:01:34.98 >>808
おっしゃる通りDIはパターンだ。
そしてパターンとは設計ノウハウであり、適応するものだ。
君は「DIという言葉を聞いたら誰もがDIコンテナを認識する」といったが、そんなことはない。
わかりやすくWikipediaで説明すると、WikipediaにはDIコンテナを使わないDIとDIコンテナを使うDIの両方の解説がなされている。
つまり、DIにはいくつかの方法があり、全てをひっくるめてDependency Injectionと呼んでいるわけだ。
「カレーライス」と一言で言ってもいろんなカレーがあるだろう??あ、カツカレー食べたくなってきた(^q^)
つまり、DIコンテナを使う方が真のDIだ!のように、どちらかがDIであると言うようなことは無いのだよ。両方DI。
君は「DIと聞いたらDIコンテナを誰でも認識する」と言った。
もしかしたら僕が間違ってるかもと思って調べてみたが、どうやら世の中はそうでもないようだよ?
Googleで「Dependency Injection」と検索して出てくる記事には「DIにはDIコンテナが必須」といったニュアンスの記事は見つからなかった。
https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f
https://qiita.com/ritukiii/items/de30b2d944109521298f
http://blog.a-way-out.net/blog/2015/08/31/your-dependency-injection-is-wrong-as-I-expected/
https://ja.wikipedia.org/wiki/依存性の注入
https://nekogata.hatenablog.com/entry/2014/02/13/073043
つまり、少なくとも「DIと聞いたらDIコンテナを誰でも認識する」なんてことは無いわけだ。
あーカツカレー食べたい
おっしゃる通りDIはパターンだ。
そしてパターンとは設計ノウハウであり、適応するものだ。
君は「DIという言葉を聞いたら誰もがDIコンテナを認識する」といったが、そんなことはない。
わかりやすくWikipediaで説明すると、WikipediaにはDIコンテナを使わないDIとDIコンテナを使うDIの両方の解説がなされている。
つまり、DIにはいくつかの方法があり、全てをひっくるめてDependency Injectionと呼んでいるわけだ。
「カレーライス」と一言で言ってもいろんなカレーがあるだろう??あ、カツカレー食べたくなってきた(^q^)
つまり、DIコンテナを使う方が真のDIだ!のように、どちらかがDIであると言うようなことは無いのだよ。両方DI。
君は「DIと聞いたらDIコンテナを誰でも認識する」と言った。
もしかしたら僕が間違ってるかもと思って調べてみたが、どうやら世の中はそうでもないようだよ?
Googleで「Dependency Injection」と検索して出てくる記事には「DIにはDIコンテナが必須」といったニュアンスの記事は見つからなかった。
https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f
https://qiita.com/ritukiii/items/de30b2d944109521298f
http://blog.a-way-out.net/blog/2015/08/31/your-dependency-injection-is-wrong-as-I-expected/
https://ja.wikipedia.org/wiki/依存性の注入
https://nekogata.hatenablog.com/entry/2014/02/13/073043
つまり、少なくとも「DIと聞いたらDIコンテナを誰でも認識する」なんてことは無いわけだ。
あーカツカレー食べたい
814仕様書無しさん
2018/05/15(火) 20:01:45.06 >>812
あってる。
ストラテジーパターンではDI(依存関係の定義してDIコンテナを通してオブジェクトを作成する)はしない。
こいつが言ってるのは、
ストラテジーパターンではDIで使うコードの一部分のコンストラクタインジェクションが、
ストラテジーパターンの戦略に相当するオブジェクトを引数で渡すことと似てるから、
これもDIと言いましょう
といってる
あってる。
ストラテジーパターンではDI(依存関係の定義してDIコンテナを通してオブジェクトを作成する)はしない。
こいつが言ってるのは、
ストラテジーパターンではDIで使うコードの一部分のコンストラクタインジェクションが、
ストラテジーパターンの戦略に相当するオブジェクトを引数で渡すことと似てるから、
これもDIと言いましょう
といってる
815仕様書無しさん
2018/05/15(火) 20:02:36.67 >>813
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
ここの図
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
Dependency Injection の "基本的な" 考え方です。
これが基本なのでオレオレで解釈しないように
で、この図に出てくるAssembler(組み立て係)がDIコンテナ
Assembler(組み立て係)がインジェクションを行うというアイデア
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
ここの図
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
Dependency Injection の "基本的な" 考え方です。
これが基本なのでオレオレで解釈しないように
で、この図に出てくるAssembler(組み立て係)がDIコンテナ
Assembler(組み立て係)がインジェクションを行うというアイデア
816仕様書無しさん
2018/05/15(火) 20:05:01.75 っていうか、記事を調べたと言う割に
DIという言葉を作った本家(の翻訳)を参照しないって
どういうわけ?
DIという言葉を作った本家(の翻訳)を参照しないって
どういうわけ?
818仕様書無しさん
2018/05/15(火) 20:09:15.23 ここまで全員バナナ
819仕様書無しさん
2018/05/15(火) 20:10:48.88 >>817
その例えが変なんじゃなくて、
言ってることが変なんだよ
ストラテジーパターンでDIが活用されるっていうのはどうみても変だろ
DIでストラテジーパターンが活用されるという言い方なら正しい。
なぜならストラテジーパターンをベースとしてDIが作られているから。
だけどストラテジーパターンはDIをベースとしてるわけじゃない。
その例えが変なんじゃなくて、
言ってることが変なんだよ
ストラテジーパターンでDIが活用されるっていうのはどうみても変だろ
DIでストラテジーパターンが活用されるという言い方なら正しい。
なぜならストラテジーパターンをベースとしてDIが作られているから。
だけどストラテジーパターンはDIをベースとしてるわけじゃない。
820仕様書無しさん
2018/05/15(火) 20:11:41.61 >>814
べつにDIと言いましょう。なんて言ってないよ。
「DIコンテナを使った時のみDIと言う、これは絶対なんだ!!」みたいな主張をしてるから
「それは違うよ、両方ともDIって言うんだよ」って教えてあげただけ。
べつにDIと言いましょう。なんて言ってないよ。
「DIコンテナを使った時のみDIと言う、これは絶対なんだ!!」みたいな主張をしてるから
「それは違うよ、両方ともDIって言うんだよ」って教えてあげただけ。
821仕様書無しさん
2018/05/15(火) 20:14:54.40 >>820
DIという用語を作った人のDIパターンの説明に
DIコンテナが含まれているのだから反論のしようがないと思うが?
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
ここの図
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
Dependency Injection の "基本的な" 考え方です。
これが基本なのでオレオレで解釈しないように
で、この図に出てくるAssembler(組み立て係)がDIコンテナ
Assembler(組み立て係)がインジェクションを行うというアイデア
DIという用語を作った人のDIパターンの説明に
DIコンテナが含まれているのだから反論のしようがないと思うが?
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
ここの図
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
Dependency Injection の "基本的な" 考え方です。
これが基本なのでオレオレで解釈しないように
で、この図に出てくるAssembler(組み立て係)がDIコンテナ
Assembler(組み立て係)がインジェクションを行うというアイデア
822仕様書無しさん
2018/05/15(火) 20:25:01.80 理解できる知能もないし学習意欲もないという事だね
もうマとしては終わった人間
もうマとしては終わった人間
826仕様書無しさん
2018/05/15(火) 20:36:59.12 小学生かな?
827仕様書無しさん
2018/05/15(火) 21:04:43.47 現実の問題より
権威を持ち出して言葉の定義や解釈に夢中になるやつらの行き着く先なぞこんなもんだ
権威を持ち出して言葉の定義や解釈に夢中になるやつらの行き着く先なぞこんなもんだ
828仕様書無しさん
2018/05/15(火) 21:06:17.99 意訳 qiitaの記事を信じてよ
829仕様書無しさん
2018/05/15(火) 21:09:26.02 私とマーチン・ファウラー、どっちが大事なの!?
83010
2018/05/15(火) 21:25:02.10 まず、コンポジションの方法には種類がある
1. クラス内部でnewして持たせる
2. メインでnewしてコンストラクタで渡す(コンストラクタインジェクション)
3. メインでnewしてメソッドで渡す(メソッドインジェクション)
この3つのうち、2と3を依存性の注入(Dependency injection、DI)と言う。
言い換えると1以外のコンポジションはDIである。
1. クラス内部でnewして持たせる
2. メインでnewしてコンストラクタで渡す(コンストラクタインジェクション)
3. メインでnewしてメソッドで渡す(メソッドインジェクション)
この3つのうち、2と3を依存性の注入(Dependency injection、DI)と言う。
言い換えると1以外のコンポジションはDIである。
83110
2018/05/15(火) 21:25:49.17 コンポジションを実現するにはこの3つ以外ない
1でなければ、DIを使うしかないのである
1でなければ、DIを使うしかないのである
832仕様書無しさん
2018/05/15(火) 22:02:28.02 2と3はコンポジションじゃ無くね?
コンポジションならクラス内で生成しろよ。
コンポジションならクラス内で生成しろよ。
833仕様書無しさん
2018/05/15(火) 22:05:14.07 黒いひし形使えるのは1のみだよな?
2も3も白いひし形だろ?
2も3も白いひし形だろ?
834仕様書無しさん
2018/05/15(火) 23:27:25.16 >>830
1の場合、そのオブジェクトの参照をクラス内のスコープに限定するの簡単だけど
2、3の場合はどうやって限定するんですか?
もし、mainでnewしてたら、コードの至る場所で参照されてる可能性あるわけですよね?
それってグローバル変数と同じじゃないんですか?
1の場合、そのオブジェクトの参照をクラス内のスコープに限定するの簡単だけど
2、3の場合はどうやって限定するんですか?
もし、mainでnewしてたら、コードの至る場所で参照されてる可能性あるわけですよね?
それってグローバル変数と同じじゃないんですか?
835仕様書無しさん
2018/05/16(水) 00:12:54.91 同じ話を繰り返す病気
836仕様書無しさん
2018/05/16(水) 00:37:47.79837仕様書無しさん
2018/05/16(水) 01:05:03.42 そんなことはどうでもいいです。
2と3ならDIなんですよ!
2と3ならDIなんですよ!
838仕様書無しさん
2018/05/16(水) 01:24:16.80 インジェクションおじさん
インジェクションという用語がカッコイイと
なんでもかんでもインジェクションという永遠の厨二病
関数にオブジェクトをインジェクション!
はがきをポストにインジェクション!
車庫に車をインジェクション!
などとよくわからない使い方をする
だが童貞のためエロネタとしては使わない
※ DI用語のインジェクションとは一切関係ありません
インジェクションという用語がカッコイイと
なんでもかんでもインジェクションという永遠の厨二病
関数にオブジェクトをインジェクション!
はがきをポストにインジェクション!
車庫に車をインジェクション!
などとよくわからない使い方をする
だが童貞のためエロネタとしては使わない
※ DI用語のインジェクションとは一切関係ありません
839仕様書無しさん
2018/05/16(水) 01:28:11.35 >>836
2と3はクラスの外から来るんだから、他所で好き放題に参照されてても分からないだろ
1は変数をprivateにして参照を外に出さなければ、他の場所で参照されてない事をコンパイラが保証してくれる
全然違う
2と3はクラスの外から来るんだから、他所で好き放題に参照されてても分からないだろ
1は変数をprivateにして参照を外に出さなければ、他の場所で参照されてない事をコンパイラが保証してくれる
全然違う
841仕様書無しさん
2018/05/16(水) 01:31:58.93 immutableでやれば?
842仕様書無しさん
2018/05/16(水) 01:35:22.15 DIコンテナからしかインジェクションしてないのにな
845仕様書無しさん
2018/05/16(水) 02:04:11.45846仕様書無しさん
2018/05/16(水) 02:14:04.43 > このスレに
あ、ごめん。それは信用できない人のカテゴリ
あ、ごめん。それは信用できない人のカテゴリ
847仕様書無しさん
2018/05/16(水) 02:52:42.78 つまりスストラテジーパターンはDIじゃないけど、
DIしてるってことだな
DIしてるってことだな
848仕様書無しさん
2018/05/16(水) 02:53:08.44 インジェクションという用語がカッコイイと
なんでもかんでもインジェクションという永遠の厨二病
関数にオブジェクトをインジェクション!
なんでもかんでもインジェクションという永遠の厨二病
関数にオブジェクトをインジェクション!
849仕様書無しさん
2018/05/16(水) 05:49:48.90 インジェクションはDIを表現するために作られた言葉で
DI関連以外で使ってはいけない。
ストラテジーパターンにインジェクションはでてこない
DI関連以外で使ってはいけない。
ストラテジーパターンにインジェクションはでてこない
851仕様書無しさん
2018/05/16(水) 06:49:11.72 >>850
DIって言葉を作った人?
マーチン・ファウラーだけど
マーチン・ファウラーがDIという言葉を作り出すまでは
インジェクションという言葉はなかった。
SQLインジェクションとかこの話と関係ないところでは
脆弱性の名前としては使われていたけどね
DIって言葉を作った人?
マーチン・ファウラーだけど
マーチン・ファウラーがDIという言葉を作り出すまでは
インジェクションという言葉はなかった。
SQLインジェクションとかこの話と関係ないところでは
脆弱性の名前としては使われていたけどね
852仕様書無しさん
2018/05/16(水) 06:54:37.50 依存性を注入してればDI
DIを実現する手段としてストラテジーやテンプレートメソッドなど様々なテクニックがある
言ってしまえばdllの差し替えやコンパイル時のマクロ置換でもDIはできる
DIはデザインパターンよりもっと抽象度の高い概念だ
DIを実現する手段としてストラテジーやテンプレートメソッドなど様々なテクニックがある
言ってしまえばdllの差し替えやコンパイル時のマクロ置換でもDIはできる
DIはデザインパターンよりもっと抽象度の高い概念だ
853仕様書無しさん
2018/05/16(水) 07:01:01.46 「オブジェクト指向における再利用のためのデザインパターン 」の
日本語訳が出版されたのが1999年本家だと1994年
マーチン・ファウラーが https://martinfowler.com/articles/injection.html の
記事を書いたのが2004年
今が2018年だから最近の人は知らないんだろうな。
この業界に入ったらすでにDIという用語が存在していた状況
だからなんでもインジェクションといってしまう。
だが昔を知っている人からすれば、インジェクションは
DIの特性を表すために作られた用語だって知ってる。
DI以前の期間、インジェクションなんて言葉を使わずに
デザインパターンを使ってきたのだから
日本語訳が出版されたのが1999年本家だと1994年
マーチン・ファウラーが https://martinfowler.com/articles/injection.html の
記事を書いたのが2004年
今が2018年だから最近の人は知らないんだろうな。
この業界に入ったらすでにDIという用語が存在していた状況
だからなんでもインジェクションといってしまう。
だが昔を知っている人からすれば、インジェクションは
DIの特性を表すために作られた用語だって知ってる。
DI以前の期間、インジェクションなんて言葉を使わずに
デザインパターンを使ってきたのだから
857仕様書無しさん
2018/05/16(水) 07:19:52.26 DIって言葉を作った人?
マーチン・ファウラーだけど
↓
マーチンファウラーって何作った人?
↓
え?だからDIだって
なんだこのマヌケな流れw
マーチン・ファウラーだけど
↓
マーチンファウラーって何作った人?
↓
え?だからDIだって
なんだこのマヌケな流れw
858仕様書無しさん
2018/05/16(水) 07:22:04.46 もちろん知ってるよ(´Д`)(あれ?DIってパッケージソフトだったのか?)
859仕様書無しさん
2018/05/16(水) 07:24:57.37 はぁ、実装しかできない人が、
設計考えてる人を馬鹿にしてるのか
哀れ
設計考えてる人を馬鹿にしてるのか
哀れ
860仕様書無しさん
2018/05/16(水) 07:25:33.30 俺はHello Worldを作ったぞ!
マーチン・ファウラーより上だ!
とでも言いたいのかな?
マーチン・ファウラーより上だ!
とでも言いたいのかな?
861仕様書無しさん
2018/05/16(水) 07:52:06.33 結局、DIは「依存オブジェクト注入」のことを指すのではなくDIコンテナを使ったストラテジーのことを指すって解釈でいいの?
なんか違和感たっぷりだけど
なんか違和感たっぷりだけど
862仕様書無しさん
2018/05/16(水) 07:55:08.51 違うよ
863仕様書無しさん
2018/05/16(水) 08:02:38.72 >>861
DIの基本的な考え方は、独立したオブジェクトを
Assembler(DIコンテナ)として用意し、
そのAssemblerが依存オブジェクトを対象のオブジェクトの
フィールドに適切に設定させるというもの
DIの基本的な考え方は、独立したオブジェクトを
Assembler(DIコンテナ)として用意し、
そのAssemblerが依存オブジェクトを対象のオブジェクトの
フィールドに適切に設定させるというもの
866仕様書無しさん
2018/05/16(水) 11:21:22.01 DIコンテナを使わないDIは定義上あっていい。
でも手動DIはウンコすぎる。手動DIをベースにDIの良し悪しを語るのは提唱者に失礼。
でも手動DIはウンコすぎる。手動DIをベースにDIの良し悪しを語るのは提唱者に失礼。
868仕様書無しさん
2018/05/16(水) 11:44:40.62 このスレの何でもDI君の主張を間に受けたら、リストに要素を追加するだけでDIになりそうだなw
870仕様書無しさん
2018/05/16(水) 13:25:55.51871仕様書無しさん
2018/05/16(水) 13:56:51.39 >>870
> 君らの言ってるDIってこれでしょ?
ぜんぜん違う。DIの命名者が定義しているDIが正しい定義
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
ここの図
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
Dependency Injection の "基本的な" 考え方です。
これが基本なのでオレオレで解釈しないように
で、この図に出てくるAssembler(組み立て係)がDIコンテナ
Assembler(組み立て係)がインジェクションを行うというアイデア
> 君らの言ってるDIってこれでしょ?
ぜんぜん違う。DIの命名者が定義しているDIが正しい定義
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
ここの図
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
Dependency Injection の "基本的な" 考え方です。
これが基本なのでオレオレで解釈しないように
で、この図に出てくるAssembler(組み立て係)がDIコンテナ
Assembler(組み立て係)がインジェクションを行うというアイデア
877仕様書無しさん
2018/05/16(水) 16:07:14.43 100歩譲ってDIがDIコンテナを指すとして
元々の議論は外部でnewするメリットがゼロだって話だったんだよなー
論点のすり替えが上手いこと上手いこと
元々の議論は外部でnewするメリットがゼロだって話だったんだよなー
論点のすり替えが上手いこと上手いこと
879仕様書無しさん
2018/05/16(水) 16:58:26.66 >>876
ユーザを集めたリストを作りたいですー
List<User> を定義してUserオブジェクトを追加しました
オブジェクトを追加しないとユーザリストとして役立たずなので機能的に依存してます
ほらdependencyだぞ、どうする?w
ユーザを集めたリストを作りたいですー
List<User> を定義してUserオブジェクトを追加しました
オブジェクトを追加しないとユーザリストとして役立たずなので機能的に依存してます
ほらdependencyだぞ、どうする?w
880仕様書無しさん
2018/05/16(水) 17:05:38.39 依存なんだから、コンポジションにはならないのは自明だろ?
881仕様書無しさん
2018/05/16(水) 17:44:01.26885仕様書無しさん
2018/05/16(水) 19:26:39.78 そんなことより、DIがDIコンテナだったとして
元々の議論はクラス外部でnewしてインジェクションするメリットがゼロだって話だったんだよね
この点については未だにメリットゼロとか思ってるの??
元々の議論はクラス外部でnewしてインジェクションするメリットがゼロだって話だったんだよね
この点については未だにメリットゼロとか思ってるの??
886仕様書無しさん
2018/05/16(水) 19:30:03.31 Listが与えられた要素のインデックスを返すIndexOfってメソッド持ってるとするじゃん?
これはオブジェクトが同じか判定する必要があるから、内部ではX.equal(Y)って感じのメソッドを呼ぶ必要があるわけだ。
Userクラスはequalメソッドをオーバーライドしてるかもしれんね?
あらら?>>582の定義だとDIじゃねこれ?w
これはオブジェクトが同じか判定する必要があるから、内部ではX.equal(Y)って感じのメソッドを呼ぶ必要があるわけだ。
Userクラスはequalメソッドをオーバーライドしてるかもしれんね?
あらら?>>582の定義だとDIじゃねこれ?w
887仕様書無しさん
2018/05/16(水) 19:30:36.52 はい、ゼロですよ?
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
> しかしながら、DIが最近これほど引っ張りだこになった真の理由は、直交性やカプセル化、
> その他の「純粋な」アーキテクチャ上の問題に関係しているわけではまったくありません。
> 非常に多くのデベロッパがDIを利用している本当の理由は、モックオブジェクトを使った
> ユニットテストを促進することです。好きなだけくどくど言っても構いませんが、
> 頭の切れるデベロッパを実際に説得して、もっと単純な実装よりもDIを選ばせるようにするのが、
> モックオブジェクトを使ったユニットテストという要因なのです。
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。
> ところが、Proffitt氏はDIなしでユニットテストを利用するのである。
> TypeMock(サイト・英語)フレームワークを使うのだが、TypeMockフレームワークでは、
> テスト中のコード内に依存性が作成されたとしても、その依存性の呼び出しを
> インターセプトできるのだ。つまりProffitt氏は、ユニットテスト用のモックを
> 作成できるようにするために、オブジェクトをデカップルする必要はないと述べている。
https://www.infoq.com/jp/news/2007/12/does-di-pay-off
> Proffitt氏によると、DIに人気がある唯一の理由はモッキングである。
> しかしながら、DIが最近これほど引っ張りだこになった真の理由は、直交性やカプセル化、
> その他の「純粋な」アーキテクチャ上の問題に関係しているわけではまったくありません。
> 非常に多くのデベロッパがDIを利用している本当の理由は、モックオブジェクトを使った
> ユニットテストを促進することです。好きなだけくどくど言っても構いませんが、
> 頭の切れるデベロッパを実際に説得して、もっと単純な実装よりもDIを選ばせるようにするのが、
> モックオブジェクトを使ったユニットテストという要因なのです。
> Proffitt氏がたどり着いた先は、DIはユニットテストにのみ有効という主張である。
> しかし、DIにはユニットテストを除いて賞賛に値するような
> 適用性がないことを、皆が認めてくれたらいいのにと思います。
> ところが、Proffitt氏はDIなしでユニットテストを利用するのである。
> TypeMock(サイト・英語)フレームワークを使うのだが、TypeMockフレームワークでは、
> テスト中のコード内に依存性が作成されたとしても、その依存性の呼び出しを
> インターセプトできるのだ。つまりProffitt氏は、ユニットテスト用のモックを
> 作成できるようにするために、オブジェクトをデカップルする必要はないと述べている。
889仕様書無しさん
2018/05/16(水) 19:35:45.61892仕様書無しさん
2018/05/16(水) 19:49:37.64 ユーザーリストはそのドメインにおいて固有の振る舞いをもったオブジェクトであり
ただのList<User>とは全く異なるものなんだよ
string型とユーザーコード型が異なるのと同じようにね
ただのList<User>とは全く異なるものなんだよ
string型とユーザーコード型が異なるのと同じようにね
894仕様書無しさん
2018/05/16(水) 19:56:48.26896仕様書無しさん
2018/05/16(水) 20:04:41.69 皆が認めてないなら間違いってことでしょ?
897仕様書無しさん
2018/05/16(水) 20:05:16.46 >>871のDIの定義はわりと一般的だと思うけど、それに反対して、代わりにドメイン固有の振る舞いが〜とかのオレオレ定義をDIに追加しようとするの笑うわ
898仕様書無しさん
2018/05/16(水) 20:05:50.35 (宗教的な理由などで)地動説を認めていない人がいるから間違いになるとでも?
899仕様書無しさん
2018/05/16(水) 20:06:25.12 正しいかどうかに、「皆が認めてる」かどうかは関係ないわなw
900仕様書無しさん
2018/05/16(水) 20:13:04.75 >>894
いやそこは俺も正しいと思う
Listの大半の振る舞いは何にも依存していないが一部の振る舞いはObjectの持つ契約に依存している
そしてその実装は外部から注入される
しかし>879で述べたような理由では依存性の注入とは言えない
リストに追加したりリストの長さを得るなどといった基本的な振る舞いはUserのいかなる契約にも依存しないからだ
いやそこは俺も正しいと思う
Listの大半の振る舞いは何にも依存していないが一部の振る舞いはObjectの持つ契約に依存している
そしてその実装は外部から注入される
しかし>879で述べたような理由では依存性の注入とは言えない
リストに追加したりリストの長さを得るなどといった基本的な振る舞いはUserのいかなる契約にも依存しないからだ
902仕様書無しさん
2018/05/16(水) 20:19:27.30 さらに重要なのはこの定義
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
DIは「独立したオブジェクトをAssembler(組み立て係)として用意し〜設定させるというもの」
なのだから、それが存在しない以上DIじゃない
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
DIは「独立したオブジェクトをAssembler(組み立て係)として用意し〜設定させるというもの」
なのだから、それが存在しない以上DIじゃない
904仕様書無しさん
2018/05/16(水) 20:40:09.90 勝手にオレオレDIを提唱したいやつは、自分で新しいデザインパターンとして提唱したら?
905仕様書無しさん
2018/05/16(水) 21:52:49.92 >>167
今さらだけど分解と集約!
class Drivers {
Engine engine;
Wheel wheel;
}
class Controllers {
Handle handle;
Brake brake;
}
class PartsSet {
Drivers driver;
Controllers controllers;
}
class PartsSetA extends PartsSet {
class DriversTypeA extends Drivers {
this.engine = new JetEngine();
this.wheel = new StudlessWheel();
}
class DriversTypeA extends Drivers {
this.handle = new QuickHandle();
this.brake = new AntilockBrake();
}
this.drivers = new DriversTypeA();
this.controller = new ControllersTypeA();
}
main() {
Car car = new Car(new PartsSetA());
}
今さらだけど分解と集約!
class Drivers {
Engine engine;
Wheel wheel;
}
class Controllers {
Handle handle;
Brake brake;
}
class PartsSet {
Drivers driver;
Controllers controllers;
}
class PartsSetA extends PartsSet {
class DriversTypeA extends Drivers {
this.engine = new JetEngine();
this.wheel = new StudlessWheel();
}
class DriversTypeA extends Drivers {
this.handle = new QuickHandle();
this.brake = new AntilockBrake();
}
this.drivers = new DriversTypeA();
this.controller = new ControllersTypeA();
}
main() {
Car car = new Car(new PartsSetA());
}
907仕様書無しさん
2018/05/17(木) 07:16:04.15 Car car = CarFactory.create();
912仕様書無しさん
2018/05/18(金) 13:07:11.12913仕様書無しさん
2018/05/18(金) 16:00:14.43 >>912
DIは依存関係をひとまとめに定義して
DIコンテナにオブジェクトを生成してもらうものだけど
結局の所、それユニットテスト目的でしか使ってないよね
って話だろう
その他の目的に使ってるかもしれないけど、
よくよく考えるとそれ、依存関係をひとまとめに
する必要性はないでしょう?
胸に手を当てて考えてみなよ
って言ってるんだよ
DIは依存関係をひとまとめに定義して
DIコンテナにオブジェクトを生成してもらうものだけど
結局の所、それユニットテスト目的でしか使ってないよね
って話だろう
その他の目的に使ってるかもしれないけど、
よくよく考えるとそれ、依存関係をひとまとめに
する必要性はないでしょう?
胸に手を当てて考えてみなよ
って言ってるんだよ
914仕様書無しさん
2018/05/18(金) 17:21:27.89 コンポジションが好まれるとか言っておいて、
実際に分解と集約をやって見せられると、
グロとか言って中身のない評価しかないのな。
DIも1000個くらいのnewがmainに書いてあったらグロと言われるだけで終わりそう。
実際に分解と集約をやって見せられると、
グロとか言って中身のない評価しかないのな。
DIも1000個くらいのnewがmainに書いてあったらグロと言われるだけで終わりそう。
915仕様書無しさん
2018/05/18(金) 17:40:07.17 いやDIにおいてnewするのはDIコンテナの仕事なんだから
mainにnewが来る時点でおかしいよ
mainにnewが来る時点でおかしいよ
919仕様書無しさん
2018/05/18(金) 21:38:00.19920仕様書無しさん
2018/05/18(金) 22:52:26.50 > そもそもこのスレでDIが好まれるとか言い出した奴は、
> DIコンテナなんて使わないって言っているし
そこが矛盾だったんだよ。んで問い詰めたらそいつが言ってるのは
DIじゃありませんでしたっていうオチ
DIはとあるオブジェクトに「ひとまとめに」依存関係の定義して
そのオブジェクトから生成してもらうっていうパターンだから
> DIコンテナなんて使わないって言っているし
そこが矛盾だったんだよ。んで問い詰めたらそいつが言ってるのは
DIじゃありませんでしたっていうオチ
DIはとあるオブジェクトに「ひとまとめに」依存関係の定義して
そのオブジェクトから生成してもらうっていうパターンだから
921仕様書無しさん
2018/05/18(金) 23:28:54.66 >>920
じゃあ言い方変えるわ。
mainでnewするのが好まれるとか言っているけど、
1000個くらいになったらグロと言われるだけで終わりそう。
(そもそもDIじゃない。)
DIコンテナも1000オブジェクト分くらい書いたらグロと言われるだけで終わりそう。
じゃあ言い方変えるわ。
mainでnewするのが好まれるとか言っているけど、
1000個くらいになったらグロと言われるだけで終わりそう。
(そもそもDIじゃない。)
DIコンテナも1000オブジェクト分くらい書いたらグロと言われるだけで終わりそう。
922仕様書無しさん
2018/05/18(金) 23:39:29.58 >>921
だから最初の方からその話をしてるんだが?
53 自分:仕様書無しさん[sage] 投稿日:2018/05/08(火) 01:31:46.28
もちろんアルゴリズムを入れ替え可能にしたいのであれば、
ストラテジーパターンを使えばいい。
DIじゃない、ストラテジーパターン
DIはテストのために全てのクラスに
ストラテジーパターンを適用するとかいう
愚かな行為
本来は不要な過剰な設計
だから最初の方からその話をしてるんだが?
53 自分:仕様書無しさん[sage] 投稿日:2018/05/08(火) 01:31:46.28
もちろんアルゴリズムを入れ替え可能にしたいのであれば、
ストラテジーパターンを使えばいい。
DIじゃない、ストラテジーパターン
DIはテストのために全てのクラスに
ストラテジーパターンを適用するとかいう
愚かな行為
本来は不要な過剰な設計
923仕様書無しさん
2018/05/19(土) 00:24:46.84 粗結合である必要もない箇所をDIで粗結合にするのはどうでもいい
インスタンスのライフサイクル管理に便利だからDIコンテナを使ってる
インスタンスのライフサイクル管理に便利だからDIコンテナを使ってる
924仕様書無しさん
2018/05/19(土) 03:55:27.73 >>923
なんでインスタンスのライフサイクルの管理なんかを
自分でやらないといけないのか?
そんなもんフレームワークが最適な形で
勝手にやってくれてるぞ?
DI使ってるせいで逆に仕事増やしてないか?
なんでインスタンスのライフサイクルの管理なんかを
自分でやらないといけないのか?
そんなもんフレームワークが最適な形で
勝手にやってくれてるぞ?
DI使ってるせいで逆に仕事増やしてないか?
928仕様書無しさん
2018/05/19(土) 08:07:12.38 それは反論じゃない
933仕様書無しさん
2018/05/19(土) 09:02:14.75 反論は?反論は?って、
これ炎上学習法ってやつ?
これ炎上学習法ってやつ?
934仕様書無しさん
2018/05/19(土) 09:12:36.17 ただの教えて君か
935仕様書無しさん
2018/05/19(土) 09:26:29.50 煽って答え引き出そうとする奴たまにいるけど自分の理解力引き上げの方が先決だと思う
937仕様書無しさん
2018/05/19(土) 09:40:56.45 炎上学習法って最初に言いだしたのは俺だと思うが他人が普通に使うくらい浸透してるのを見ると感慨深い
940仕様書無しさん
2018/05/19(土) 12:34:21.60942仕様書無しさん
2018/05/19(土) 13:18:12.11 ここまで考えられないほどの雑魚
945仕様書無しさん
2018/05/19(土) 14:30:05.34 そもそもライフサイクルという概念がなあ。
末端のコーダーにとってフレンドリーじゃない。
末端のコーダーにとってフレンドリーじゃない。
946仕様書無しさん
2018/05/19(土) 14:50:12.81 ライフサイクルもそうだけどそういうめんどくさいことを意識しなくてもコードをかけるようにDIがあるんだよ
947仕様書無しさん
2018/05/19(土) 16:56:55.13 RailsってDIコンテナを内包していたのか。
948仕様書無しさん
2018/05/19(土) 17:07:47.47 なにを勘違いしてるんだ?
ライフサイクルなんてのが必要になるのがDIの欠点
DIを使わなければ、ライフサイクルそのものを無くせる
ライフサイクルなんてのが必要になるのがDIの欠点
DIを使わなければ、ライフサイクルそのものを無くせる
949仕様書無しさん
2018/05/19(土) 17:28:34.18 全然意味わからん
950仕様書無しさん
2018/05/19(土) 17:31:15.66 DIを否定したいって結論が先にあって
無理してそこに向けて進もうとするから
もう自分でも何言ってるかわからなくなってるんだろうな
無理してそこに向けて進もうとするから
もう自分でも何言ってるかわからなくなってるんだろうな
954仕様書無しさん
2018/05/19(土) 18:20:15.99 ライフサイクルってシングルトンとかそういう話?
955仕様書無しさん
2018/05/19(土) 18:23:43.07 ここまで全員雑魚
956仕様書無しさん
2018/05/19(土) 19:52:20.30 DIアンチに餌を与えて遊べるスレはここですか
957仕様書無しさん
2018/05/19(土) 19:56:09.18 遊んでないよ?
普通に質問しても答えられないじゃん
なんでいつまでもライフサイクルの存在に
振り回されてるの?
普通に質問しても答えられないじゃん
なんでいつまでもライフサイクルの存在に
振り回されてるの?
958仕様書無しさん
2018/05/19(土) 21:27:11.59 そんなことより次スレどうすんの
959仕様書無しさん
2018/05/19(土) 21:27:55.66 要らない
960仕様書無しさん
2018/05/19(土) 21:28:27.04 じゃ、不要で。
961仕様書無しさん
2018/05/19(土) 21:43:09.73 railsクソじゃん
962仕様書無しさん
2018/05/19(土) 21:44:45.27 あ、はい。作れって言われたので
オブジェクト指向とDIを分かりやすく例えて教えてくれ 3
https://medaka.5ch.net/test/read.cgi/prog/1526733859/
オブジェクト指向とDIを分かりやすく例えて教えてくれ 3
https://medaka.5ch.net/test/read.cgi/prog/1526733859/
963仕様書無しさん
2018/05/19(土) 21:51:19.17 できちゃったの
964仕様書無しさん
2018/05/19(土) 22:06:12.84 はい。おもちゃは永遠に
968仕様書無しさん
2018/05/19(土) 22:38:04.48969仕様書無しさん
2018/05/19(土) 22:38:22.19971仕様書無しさん
2018/05/19(土) 22:52:06.11972仕様書無しさん
2018/05/19(土) 23:03:04.48 todoアプリだと、どうライフサイクルが無くなるんだ?
973仕様書無しさん
2018/05/19(土) 23:09:07.08 DIが便利すぎてDI無しで開発するのが辛い
DI使うと超お手軽にSOLIDを実現できて、テストもスラスラ書けるんだもの
人間はダメな生き物だから一回楽な方法を覚えると他のやり方が億劫になる
DI使うと超お手軽にSOLIDを実現できて、テストもスラスラ書けるんだもの
人間はダメな生き物だから一回楽な方法を覚えると他のやり方が億劫になる
975仕様書無しさん
2018/05/19(土) 23:15:48.28 ライフサイクルがなくなるというバカ特有の亜空間思考w
976仕様書無しさん
2018/05/19(土) 23:20:57.53 自分の理解できないものをクソだと認定する癖やめたほうがいいぞ
979仕様書無しさん
2018/05/19(土) 23:26:03.46980仕様書無しさん
2018/05/19(土) 23:28:28.15 こいつら定期的に今の状態を書き込んで
やらないとすぐ忘れるからなw
やらないとすぐ忘れるからなw
981仕様書無しさん
2018/05/19(土) 23:37:27.18 スーパークラスやインターフェースなんて必要になるのがOOPの欠点
OOPを使わなければスーパークラスやインターフェースそのものを無くせる
コールバック関数で充分だった
OOPを使わなければスーパークラスやインターフェースそのものを無くせる
コールバック関数で充分だった
983仕様書無しさん
2018/05/20(日) 11:01:49.45 >>981
無くして
class BarRepository implements FooRepository {
private dbConnection;
public Hoge findBy(int id){
return dbConnection.findBy(id)
}
public void insert (Hoge hoge){
dbConnection.insert(hoge)
}
public void update (Hoge hoge){
dbConnection.update(hoge)
}
public void delete (Hoge hoge);
dbConnection.delete(hoge)
}
}
無くして
class BarRepository implements FooRepository {
private dbConnection;
public Hoge findBy(int id){
return dbConnection.findBy(id)
}
public void insert (Hoge hoge){
dbConnection.insert(hoge)
}
public void update (Hoge hoge){
dbConnection.update(hoge)
}
public void delete (Hoge hoge);
dbConnection.delete(hoge)
}
}
984仕様書無しさん
2018/05/20(日) 12:21:53.31986仕様書無しさん
2018/05/20(日) 12:57:26.05 明示化されてないだけでどんなシステムでもオブジェクトのライフサイクルは存在する
例外があるとしたらすべての機能がstaticメソッドで書かれたシステムかな
例外があるとしたらすべての機能がstaticメソッドで書かれたシステムかな
987仕様書無しさん
2018/05/20(日) 13:14:52.67 >>985
なにを必死になってるのかわからないけど
DIはライフサイクルを意識しないといけないが、
DIをつかわないフレームワークでは、ライフサイクルを
意識しなくてもいいって話なんだがわかってる?
あんた言葉遊びに持っていきたいだけじゃないの?
なにを必死になってるのかわからないけど
DIはライフサイクルを意識しないといけないが、
DIをつかわないフレームワークでは、ライフサイクルを
意識しなくてもいいって話なんだがわかってる?
あんた言葉遊びに持っていきたいだけじゃないの?
988仕様書無しさん
2018/05/20(日) 13:20:22.31 違う
DIを使わないと実行フローの中にライフサイクルが埋め込まれてわけがわからなくなる
そうやって管理不能になる前にDIを使って構造的に体系的にライフサイクルを整理し制御下に置こうってことな
DIを使わないと実行フローの中にライフサイクルが埋め込まれてわけがわからなくなる
そうやって管理不能になる前にDIを使って構造的に体系的にライフサイクルを整理し制御下に置こうってことな
989仕様書無しさん
2018/05/20(日) 13:36:19.57991仕様書無しさん
2018/05/20(日) 14:07:54.39 ライフサイクルの管理をしてないという勘違いをまず改めたまえ
992仕様書無しさん
2018/05/20(日) 14:16:02.89 例えばAndroidのアクティビティ
Android開発にはDIは必須ではないがアクティビティには明確にライフサイクルが定義されていてドキュメントにも明記されている
WindowsのFormsにもライフサイクルはあるし
MVCフレームワークもリスナーやコンテキストなど様々なインスタンスのライフサイクルを管理している
DBのセッションやトランザクションの管理もライフサイクル管理の例だが別にDIは必須ではない
インスタンスを生成してコントロールするすべての処理にライフサイクルの管理が必要なんだよ
DIを使わない場合はフレームワークが内部で管理しているライフサイクルと処理フローの中で野放しになっているライフサイクルが存在する
野放しになっている方をDIを使って完全に制御下に置こう
Android開発にはDIは必須ではないがアクティビティには明確にライフサイクルが定義されていてドキュメントにも明記されている
WindowsのFormsにもライフサイクルはあるし
MVCフレームワークもリスナーやコンテキストなど様々なインスタンスのライフサイクルを管理している
DBのセッションやトランザクションの管理もライフサイクル管理の例だが別にDIは必須ではない
インスタンスを生成してコントロールするすべての処理にライフサイクルの管理が必要なんだよ
DIを使わない場合はフレームワークが内部で管理しているライフサイクルと処理フローの中で野放しになっているライフサイクルが存在する
野放しになっている方をDIを使って完全に制御下に置こう
993仕様書無しさん
2018/05/20(日) 14:27:02.66 >>983
定義側のコードだけで利用側のコードがないから、
正直、具体的な置き換え例は出せないんだけど、
C言語でも同機能のコードが書けるでしょ?
その時使うのはポインタを利用したコールバック関数くらいで、
スーパークラスやインターフェースは要らないよね?
定義側のコードだけで利用側のコードがないから、
正直、具体的な置き換え例は出せないんだけど、
C言語でも同機能のコードが書けるでしょ?
その時使うのはポインタを利用したコールバック関数くらいで、
スーパークラスやインターフェースは要らないよね?
994仕様書無しさん
2018/05/20(日) 14:32:53.88 頑張れば書けるのと楽に書けるは天地の差があるんだが
この簡単な事実を理解できない人もごく稀に存在するらしい
かわいそうだね
この簡単な事実を理解できない人もごく稀に存在するらしい
かわいそうだね
995仕様書無しさん
2018/05/20(日) 14:50:06.63 オブジェクト指向のスレでDIばかり語る無能の集団か…。
996仕様書無しさん
2018/05/20(日) 14:53:31.62 楽に書けるかどうかは技術力の問題
OOPの技術力がなければC言語の方が楽
OOPは難しくてよくわからないという現場に置かれた場合、
あなたがOOPを選択するのはベストプラクティスではない
スレタイの通り、スーパークラスやインターフェースをわかりやすく教えることができるかどうか、
できないのなら現場では欠点だ
OOPの技術力がなければC言語の方が楽
OOPは難しくてよくわからないという現場に置かれた場合、
あなたがOOPを選択するのはベストプラクティスではない
スレタイの通り、スーパークラスやインターフェースをわかりやすく教えることができるかどうか、
できないのなら現場では欠点だ
997仕様書無しさん
2018/05/20(日) 14:57:54.46 staticおじさんには関わりたくない
998仕様書無しさん
2018/05/20(日) 15:11:29.81 若い奴もわかってない奴多いけどな
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 13日 4時間 0分 3秒
新しいスレッドを立ててください。
life time: 13日 4時間 0分 3秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 【野球】WBC、録画放送含め地上波中継なし (ネットフリックス) [少考さん★]
- 日中関係改善は「下手をすると10年かかる」 トランプを全面信頼できない高市官邸の苦悩★2 [ぐれ★]
- 【速報】長期金利上昇、一時1.980%に [蚤の市★]
- 自民、衆院宮城4区に元タレントの森下千里氏 立民・安住氏の対抗馬 [蚤の市★]
- 【東京】赤坂サウナ火事2人死亡 サウナ室のドアノブ外れ閉じ込められた可能性 ★10 [nita★]
- 町山智浩「日本のパンダ経済効果は308億円」…「…いらない」と言ってる人達は、パンダで暮らす人々の損害補填してくれるのか…と問う★3 [少考さん★]
- j【愛国者速報】私人逮捕系YouTuber、盗撮疑いの外国人を突き飛ばして転ばせるwwwwww [856698234]
- 自認夏目たかしだが
- 「ヘブン見た」「即ヒメ見た」とお伝えすると良い事があるお🏡
- 【高市悲報】辻元、追加資料公開。官僚が「頼むからこれ踏襲して」と台湾問題に関する歴代総理答弁を渡していた😰 [359965264]
- 日中関係改善、下手すると10年かかる模様 高市はなんでさっさと謝らなかったの・・・ [434776867]
- 小学生の時にケンカした相手の両目を鉛筆で刺して失明させてやった
