X



オブジェクト指向とDIを分かりやすく例えて教えてくれ 3
レス数が1000を超えています。これ以上書き込みはできません。
0001仕様書無しさん
垢版 |
2018/05/19(土) 21:44:19.89
■ オブジェクト指向・デザインパターン(有用)
 
 わかり易い例
 class Dog extends Animal
 class Cat extends Animal

■ DI(ゴミ)

 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
 > MovieLister クラスのフィールドへ適切に設定させるというものだ。
 > 依存関係は図2のようになる。


前スレ

オブジェクト指向とは 分かりやすく教えてくれ
https://medaka.5ch.net/test/read.cgi/prog/1521869966/

オブジェクト指向を分かりやすく例えて教えてくれ 2
https://medaka.5ch.net/test/read.cgi/prog/1525660302/
0004仕様書無しさん
垢版 |
2018/05/19(土) 22:00:18.05
■ DIの例

それから、PicoContainerはそれぞれのインタフェースがどの実装クラスと結び付けられるのかを通知してもらう必要がある。 MovieFinder にどういうファイル名がインジェクトされるのかについても同様だ。

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;
}
この設定コードは、本来ならば別の設定クラスで記述されるべきものだ。
0005仕様書無しさん
垢版 |
2018/05/19(土) 22:00:41.52
■ コンストラクタインジェクションの例

PicoContainer を利用するためには、以下のようなコードを書く。

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());
}
なお、このサンプルではコンストラクタ・インジェクションを利用しているが、 PicoContainer では
セッター・インジェクションもサポートしている (開発者たちはコンストラクタ・インジェクションのほうが好みのようだけれど)。
0006仕様書無しさん
垢版 |
2018/05/19(土) 22:02:30.37
■ Spring でのセッター・インジェクションの例
Spring Framework は エンタープライズ Java 開発向けの守備範囲の広いフレームワークだ。
トランザクション、永続化フレームワーク、Web アプリケーション開発や JDBC に関する抽象レイヤがある。

MovieLister がインジェクションに対応できるように、 サービス設定用の setter メソッドを定義しなければならない。
(省略)

同様に、MovieFinder には文字列の setter を定義する。
(省略)

3番目のステップとして、ファイルに設定を記述する。Spring での設定は XML ファイルでもコードでも可能だが、 XMLで行うことが望ましいとされている。

<beans>
<bean id="MovieLister" class="spring.MovieLister">
<property name="finder">
<ref local="MovieFinder"/>
</property>
</bean>
<bean id="MovieFinder" class="spring.ColonMovieFinder">
<property name="filename">
<value>movies1.txt</value>
</property>
</bean>
</beans>

テストはこんな感じだ。
public void testWithSpring() throws Exception {
ApplicationContext ctx = new FileSystemXmlApplicationContext("spring.xml");
MovieLister lister = (MovieLister) ctx.getBean("MovieLister");
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West", movies[0].getTitle());
}
0007仕様書無しさん
垢版 |
2018/05/19(土) 22:03:15.98
結局手抜きしてフィールドインジェクションしてるわ
0008仕様書無しさん
垢版 |
2018/05/20(日) 03:13:45.22
XMLもsetterもキモイから嫌い
コードで配線の設定書いてコンストラクタでインジェクションしてる
0010仕様書無しさん
垢版 |
2018/05/20(日) 07:18:45.20
>>9
クラスやインターフェースの定義の話じゃないぞ?

DIの依存関係の定義っていうのはコードもしくは設定ファイル
なんだから、お前が勘違いした実装というのは
「コードで書いたDIの依存関係の」定義だろ
0011仕様書無しさん
垢版 |
2018/05/20(日) 09:10:00.65
>>6
ついにここまで来たか
学習能力高いな
アノテーション定義もやってみよう
0012仕様書無しさん
垢版 |
2018/05/20(日) 19:34:27.18
さて、前スレのなぜDIを使うとライフサイクルの事まで
考えなければいけなくなるのか?の答

惜しい所まで来てるんだけど、あと一歩足りない
DIを悪く言えないから、気づいてしまったけど
口に出して言えないのかもしれないねw

DIを使うとライフサイクルの事まで考えなければいけなくなるのは
DIがなにをやってくれるものなのかに気づく必要がある

再掲すると

 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
 > MovieLister クラスのフィールドへ適切に設定させるというものだ。
 > 依存関係は図2のようになる。

一言で言うならば、newを代わりにやってくれるものと考えればいい
それだけ。そう、それだけなんだよ。

だからどんな用途にも使える。これは一見優れているように見えるかもしれないが、
汎用的な解決方法しか提供できないため、逆に特定の問題をシンプルに解決することができない

フレームワークは一般的に特定の問題(例えばウェブアプリ)を解決するために作られたものなので
ライフサイクルの管理もフレームワークで管理して、特定の問題の解決に必要な部分のみを
プログラマが記述すれば良くなる。
0013仕様書無しさん
垢版 |
2018/05/20(日) 19:36:15.35
もちろんDIを使っていてもフレームワークが
DIを内部に隠蔽することでライフサイクルの管理を
プログラマがしなくてすむようにできるだろうけど、
そうするとプログラマがDIを直接使うのが難しくなってしまう
0019仕様書無しさん
垢版 |
2018/05/20(日) 20:12:33.22
DI(フレームワーク)がライフサイクル管理してくれるんだろ?
プログラマは意識しなくていいやん
0020仕様書無しさん
垢版 |
2018/05/20(日) 20:13:28.86
まだやってたのか!?
おまえ等がDI大好きなのはわかった…
0021仕様書無しさん
垢版 |
2018/05/20(日) 20:13:56.23
DIはフレームワークじゃないよ。パターン。
DIパターンを使ったフレームワークと勘違いしてね?
0023仕様書無しさん
垢版 |
2018/05/21(月) 01:21:20.44
>>22
自分が?まあ反論してないってことはそういうことなんだろうけど
0024仕様書無しさん
垢版 |
2018/05/21(月) 01:32:01.57
むしろ今までライフサイクル意識せずピュアな実装してたとか恐怖でしかない
0025仕様書無しさん
垢版 |
2018/05/21(月) 01:45:49.89
そういうのはフレームワークが隠蔽すべきものだからね
0027仕様書無しさん
垢版 |
2018/05/22(火) 09:05:53.76
なんかね、説明が下手くそでよくわかんない。
もっとわかりやすく丁寧にDIが何故ダメなのか教えて欲しい。

ググって出てくる記事の方がわかりやすくて「DIって便利だなー」って思っちゃう。
0028仕様書無しさん
垢版 |
2018/05/22(火) 11:17:17.10
とても簡単な自宅で稼げる方法
参考までに書いておきます
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

U3ANT
0029仕様書無しさん
垢版 |
2018/05/22(火) 13:48:41.48
helloworldや数当てゲーム、石取りゲームなんかにゃ過剰。
どっかの業務基幹システムを、低品質な人海戦術でやっつけようなんて時は有用。
0031仕様書無しさん
垢版 |
2018/05/22(火) 19:42:25.80
DIはモックフレームワークが出てきて完全に価値がなくなったね
0033仕様書無しさん
垢版 |
2018/05/22(火) 20:42:42.30
モックの仕組みが理解できない低脳が
ユニットテストやるためにはDIしか選択肢がないから
無価値ではないか
0034仕様書無しさん
垢版 |
2018/05/23(水) 02:27:01.57
DIは過剰な設計で開発を楽にはしてくれない
0035仕様書無しさん
垢版 |
2018/05/23(水) 05:45:13.15
DIなんて実装の一作法でしか無いのに、まるでオブジェクト指向の根幹みたいな勘違いさせるスレタイってw
…あ、隔離スレかww
0036仕様書無しさん
垢版 |
2018/05/23(水) 05:51:18.30
DIってプロジェクト全体の依存関係の定義を一箇所で
行うから、グローバル定義になって、
オブジェクト指向とは真逆の技術なんだよね
0037仕様書無しさん
垢版 |
2018/05/23(水) 07:12:04.03
DI採用しないとかCOBOLとかC言語なんだろ

まあ手続きで良いと思う
0038仕様書無しさん
垢版 |
2018/05/23(水) 07:48:55.96
COBOLは知らんけど今時のCはOOPで書くものだよ
ユニットテストではモックに差し替えるしDIももちろん使う
0039仕様書無しさん
垢版 |
2018/05/23(水) 07:55:14.24
どのクラスをnewして使うべきか、というのもオブジェクトの大事な責務なのに、
それを外出しして一つにまとめて神クラス作るのがDI
DI褒めてるやつはオブジェクト指向を分かってない
0041仕様書無しさん
垢版 |
2018/05/23(水) 08:01:09.58
>>39
大事なものだからシステマチックに管理する
DIを使わないとオブジェクトのオーケストレーションという責務がアプリケーションの全体に分散してハードコーディングされてしまう
0044仕様書無しさん
垢版 |
2018/05/23(水) 09:36:26.19
>>41
> オブジェクトのオーケストレーションという責務

なんで責務を増やすの?
そんなの不要なものなのに
0045仕様書無しさん
垢版 |
2018/05/23(水) 12:13:12.43
>>43
グローバルかつスタティックにnewを管理したいんでしょ?
スタティックおじさんじゃん
0047仕様書無しさん
垢版 |
2018/05/23(水) 12:42:27.86
クラス図描かないから相関関係が曖昧になって、どこからでもインスタンス捕まえられる様にまとめて1箇所でnewするんだよ。
スタティックおじさんよりタチが悪い。
0048仕様書無しさん
垢版 |
2018/05/23(水) 12:57:45.67
どこからでもインスタンス捕まえられる様にまとめて1箇所でnewするという発想

なるほどこいつにはDIコンテナを与えない方がよさそうだ
0049仕様書無しさん
垢版 |
2018/05/23(水) 13:14:29.61
テストに有用って結局インスタンス捕まえられるからだろ?
0051仕様書無しさん
垢版 |
2018/05/23(水) 15:37:37.21
ヒーブ管理を拡張して、オブジェクト生成時にユニークなID振るようなツール使えばインスタンスを捕まえる必要も無いけどな。
0052仕様書無しさん
垢版 |
2018/05/23(水) 18:12:16.86
スタティックおじさんというよりグローバル変数おじさん
0053仕様書無しさん
垢版 |
2018/05/23(水) 19:22:58.08
実際には全く逆
全てローカルで解決するにはDIするしかない
newはインスタンスがどこからともなく湧いてきていきなり管理外になってしまう
よりグローバル的な解決手段と言える
0054仕様書無しさん
垢版 |
2018/05/23(水) 19:31:06.73
DI使っても使う所で
newもしくは、DIコンテナから取得
するっていうのはわかるね?

newはあちこちに散らばある。
DI使えばnewが一箇所にまとまると言うが、
newの代わりにDIコンテナからの取得が
散らばるだけだっていうのは気づいてるよね?

おそらく気づいてないんだと思う。
だってDI使ってないだろ?w
0055仕様書無しさん
垢版 |
2018/05/23(水) 19:37:06.15
>>54
DIからの取得は野放しnewとは異なり完全に集中管理統制されている
0058仕様書無しさん
垢版 |
2018/05/23(水) 19:55:21.53
>>57
やっぱり分かってないみたいねw
依存関係を登録した後のそのオブジェクトの使い方はこう
何もしないでも勝手にオブジェクトが作られるわけないよ
当たり前だけど

■ コンストラクタインジェクションの例

PicoContainer を利用するためには、以下のようなコードを書く。

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());
}
0059仕様書無しさん
垢版 |
2018/05/23(水) 19:56:07.68
MovieLister lister = new MovieLister の代わりが
MovieLister lister = (MovieLister) pico.getComponentInstance(MovieLister.class);
になる
0061仕様書無しさん
垢版 |
2018/05/23(水) 20:22:49.60
そもそもDIコンテナ使うところってmainじゃないの?
DIコンテナをコンポジションしちゃうわけ?
0062仕様書無しさん
垢版 |
2018/05/23(水) 20:32:12.73
DI使っているフレームワーク見ればすぐ分かるのに…
0065仕様書無しさん
垢版 |
2018/05/23(水) 21:58:39.41
>>61
お前はDIコンテナのことをまったく知らずに発言してるという理解で間違いないか?
0066仕様書無しさん
垢版 |
2018/05/23(水) 22:38:16.78
>>61叩かれてるの何で?
DIコンテナに直接インスタンスをおねだりするケースはあまり無いと思うんだけど...

一般人が書くコードの中じゃ、@AutoWiredみたいなメタデータか設定ファイルで定義して、インスタンスを注入すれば良い。
要件が特殊か設計がマヌケな場合に、ApplicationContext.getBean()みたいなの書くハメになる。
0067仕様書無しさん
垢版 |
2018/05/23(水) 23:13:12.95
>>61
mainでやるのは依存関係の定義
mainでオブジェクトを全部生成してしまったら
それはライフサイクルが固定されてしまう
mainでnew(の代わりのDIコンテナからのオブジェクトの生成)をやるわけがない。
その時点でDI分かってないんだなーって思うよw
0068仕様書無しさん
垢版 |
2018/05/23(水) 23:35:33.88
ライフサイクルは盲点だった
DIコンテナで扱うのなんて全部ステートレスでシングルトンなサービスクラスだと思ってたよ
0069仕様書無しさん
垢版 |
2018/05/23(水) 23:50:52.87
>>58
案の定、使い方わからずに文句言ってただけだったなこいつ
0070仕様書無しさん
垢版 |
2018/05/23(水) 23:56:40.22
通常はフレームワークが生成ルートになるから、DIの生成メソッドを呼ぶなどというマヌケな事にはならない
0071仕様書無しさん
垢版 |
2018/05/24(木) 03:13:24.84
>>70
でもその理屈だと、newだって一緒なんだよねw
ほらね。DIだからっていうのが無くなった
0077仕様書無しさん
垢版 |
2018/05/24(木) 07:15:37.10
DIコンテナをコンポジションするのが一般的なDIの使い方だとした場合、DIっファクトリと何が違うのん?
0078仕様書無しさん
垢版 |
2018/05/24(木) 07:42:02.81
>>77
何回も書いてあるだろ

再掲すると

 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
 > MovieLister クラスのフィールドへ適切に設定させるというものだ。
 > 依存関係は図2のようになる。

ファクトリはプログラマが適切なタイミングで必要なオブジェクトを
ファクトリ経由で生成してもらう。依存関係はその場に記述する

DIは依存関係をひとまとめに定義する部分が独立して存在する
DIコンテナはファクトリに似ているが、関連するオブジェクトのみを扱うファクトリとは違って
DIコンテナは、全てのオブジェクトと取り扱うプロジェクトで唯一のグローバルなファクトリ
0079仕様書無しさん
垢版 |
2018/05/24(木) 13:32:26.01
>>78
その引用わかりにくいし、スレタイが「わかりやすく例えて教えてくれ」ってことなので、もう少し情報まとめて語ってくれません?
0080仕様書無しさん
垢版 |
2018/05/24(木) 13:36:28.37
>>79
わかりやすいだろ
っていうか、お前がその定義は嫌だ
認めたくないって言いたいだけだろ
あきらめろ。これがDIの定義だ
0081仕様書無しさん
垢版 |
2018/05/24(木) 14:14:19.85
つか、オブジェクトをnewすっから変な話になるんだよ。
全てのクラスはファクトリーが生成、戻り値はユニークなハンドルIDにして、クラス間はハンドルIDにメッセージ送って処理する様にすれば、DIが無意味な事が分かるだろ。
この仕組みなら各オブジェクトが同一CPU内に無くても巨大なネットワークの任意の場所で動いていても動かせる。
…って考えると、DIは小規模なシステムで使うくらいしか役目がないって事だ。
0084仕様書無しさん
垢版 |
2018/05/24(木) 16:38:17.64
メッセージ型のオブジェクト指向言語だと意味が無いってのは確か。
0085仕様書無しさん
垢版 |
2018/05/24(木) 17:15:01.39
あるオブジェクトがAに依存してますって時、
そのAをオブジェクト内部で作ろうが外部から渡そうが
何も違いないじゃん。なら余計な仕組みが要らない方がいいよね
0086仕様書無しさん
垢版 |
2018/05/24(木) 17:22:25.63
実装方法なんか言語仕様の範囲内でどうにでもなるんだから、瑣末な問題の重箱の隅をいつまてつついてるんだ?って話だ罠
0087仕様書無しさん
垢版 |
2018/05/24(木) 17:44:06.68
実装方法? 別に何かを実装しなければいけないなら
余計な仕組みがないほうが良いですよね。
0088仕様書無しさん
垢版 |
2018/05/24(木) 17:51:59.74
>>85
内部で作るってことはメモリとCPUが一枚の基盤に載ってるようなものでクッソ使いにくいわけだ
0089仕様書無しさん
垢版 |
2018/05/24(木) 17:53:52.08
>>88
その理屈はおかしい。
今やCPUにGPUがバンドルされる時代だぞ?
昔は外付けで必要だったLANカード、サウンドボードだって
随分前からマザーボードに内蔵されてる
使いにくい?逆だろう?
0090仕様書無しさん
垢版 |
2018/05/24(木) 18:01:42.43
>>89
そのバンドルをDIコンテナがやってんだよ
オールインワンで購入しても蓋開けたらそれぞれの部品は外して独立化できるだろ?
プログラムもそれと同じ
独立性の高い部品を個別に用意してバンドルしてシステムとして機能させる

newするってことはすべてのパーツを物理的に分離不能にくっ付けるようなもの
メモリとCPUが1枚の基盤にハンダでがっちり固められてしまったらもう使い物にならん
0091仕様書無しさん
垢版 |
2018/05/24(木) 18:10:11.41
パソコン例えだと使用時より製造時の方が深刻だな
メモリCPUディスプレイキーボードハードディスク…あらゆるものが結合してて同じ工場の生産ラインに異なる領域のすべての生産能力を持たせないといけない
これじゃ生産コストが高すぎる
0092仕様書無しさん
垢版 |
2018/05/24(木) 18:18:28.17
>>90
> オールインワンで購入しても蓋開けたらそれぞれの部品は外して独立化できるだろ?
独立化できねーよ。
お前やっぱり分かってないな。
0094仕様書無しさん
垢版 |
2018/05/24(木) 18:26:57.35
>>91
> メモリCPUディスプレイキーボードハードディスク…あらゆるものが結合してて同じ工場の生産ラインに異なる領域のすべての生産能力を持たせないといけない
例えが的はずれすぎる

なんで同じ工場でメモリを作らないのいけないのか?
マザーボードを作る工場で、外部から購入したメモリを
マザーボードに取り付けるだけだろ

他のもマザーボードには様々チップ、抵抗、コンデンサ等を
搭載しているが、それらを作ってるわけじゃない。
買ってきて取り付けてるだけだ

そうやって、いろんなものが統合されてるマザーボードが出来上がる
0095仕様書無しさん
垢版 |
2018/05/24(木) 18:40:23.17
>>77
> DIコンテナをコンポジションするのが一般的なDIの使い方だとした場合、DIっファクトリと何が違うのん?

DIはひとまとめに依存関係を定義するので
実行中に動的に違うオブジェクトに変更できない

ファクトリだったら例えば読み込む設定ファイルを
変更するだけで、使用するオブジェクトを変更できるが
DIは決まったものから変更できない
0096仕様書無しさん
垢版 |
2018/05/24(木) 18:56:04.15
>>93
な?
メンテナンスしにくいだろ?
CPUだけ新しいものに変えてテストできんの?
そういうこと
0097仕様書無しさん
垢版 |
2018/05/24(木) 18:57:40.20
>>96
? メンテナンスしないものに対して
メンテナンスできるようにするのは過剰だろ。

それに他のオブジェクトに変えたければ
再コンパイルすればいいだけ

> CPUだけ新しいものに変えてテストできんの?
じゃあもう固定で埋め込んで変えられないようにしたほうが良いですねw
0098仕様書無しさん
垢版 |
2018/05/24(木) 18:57:41.21
>>94
それはまさにDIの考え方
部品は別に作って組み合わせるまさにDI
newは同じ工場で作ることにあたる
0099仕様書無しさん
垢版 |
2018/05/24(木) 18:59:55.99
>>98
> 部品は別に作って組み合わせるまさにDI

だから、それはDIじゃねーって言ってるだろ

 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
 > MovieLister クラスのフィールドへ適切に設定させるというものだ。
 > 依存関係は図2のようになる。
0100仕様書無しさん
垢版 |
2018/05/24(木) 19:02:45.70
工場で例えるなら、

■DIを使わない場合
マザーボードメーカー「メモリを作ってください。作り方や材料の調達は任せます」

■DIを使った場合
マザーボードメーカー「メモリを作ってください。作り方は私が指定します。材料も私が調達します」
0101仕様書無しさん
垢版 |
2018/05/24(木) 19:10:14.38
>>88>>90
ICチップだって元々はトランジスタとかコンデンサを一つづつ組み上げたものなんだけど、いまは一体化してるよね
あんたはCPUをバラして中からトランジスタ取り出せないから使い物にならないって言いたいの?
0102仕様書無しさん
垢版 |
2018/05/24(木) 19:10:35.75
何言ってんだこいつら

マックブックも作る時はDIだよ
各地から部品を調達して組み合わせてテストしてる

最終的にユーザーに届く時は美しいUIやAPIにパッケージされてるというだけ
製造過程では他と同じようにDIしてる
0103仕様書無しさん
垢版 |
2018/05/24(木) 19:17:05.73
>>101
そこまでいくとDIではなく
足し算や代入のような命令文の粒度だろうね
命令文にDIは必要ないだろ?
コンデンサもトランジスタもCPUの実装なんだよ

でもCPUはDIで独立性を高めた方がいいわけだな
0104仕様書無しさん
垢版 |
2018/05/24(木) 19:21:34.06
>>102
> マックブックも作る時はDIだよ

だからお前が言ってるのはDIじゃない

 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
 > MovieLister クラスのフィールドへ適切に設定させるというものだ。
 > 依存関係は図2のようになる。
0105仕様書無しさん
垢版 |
2018/05/24(木) 19:23:00.50
マックブックも作る時はDIを使ってないよ
各地から部品を調達して組み合わせてテストしてる

けっして部品を調達する時に、
その部品に依存するものまで調達して、
これ使ってくれと渡してなんかしていない
0106仕様書無しさん
垢版 |
2018/05/24(木) 19:26:34.89
独立性を高めるっていうことは、
そのパーツを作ってる会社に
使う部品は任せるってことやで
0107仕様書無しさん
垢版 |
2018/05/24(木) 19:41:13.09
newを使うってのはさ
パソコンでいうならパーツ集めて全部くっつけて
あとメモリだけ乗っけたら売り物になるっていう状態にして
開発中のメモリを刺して刺しっぱなしにしたまま開発を進めるようなものだよ

DIだと
メモリはメモリで独立して作って後で組もうぜって感じな
0108仕様書無しさん
垢版 |
2018/05/24(木) 19:43:12.62
ここ3日でナンバーワンのヘタクソな例えわろたw
0109仕様書無しさん
垢版 |
2018/05/24(木) 19:45:40.87
>>107
そうじゃない

普通は大きいものを作るときは、
それよりも小さいものに分けて作る
小さいものがどうやって作られてるかは意識しない
オブジェクトが階層構造を持っている

DIはその階層構造を破壊するもの
0111仕様書無しさん
垢版 |
2018/05/24(木) 20:24:14.23
具体的なクラスはコードから追い出して外出しにしたいなー
→全部抽象にしよ
→抽象はnewできないじゃん…かといって具体的なクラスnewしたら本末転倒だし…メンバー変数とかどうすんの
→そもそもnewしなきゃいいじゃん、newは他に任せてセッター用意しとこ
みたいのがDIだと思ってた
0112仕様書無しさん
垢版 |
2018/05/24(木) 20:33:43.89
>>109
ネットワークと繋がるアプリケーションを考えろ
アプリケーションはネットワークより小さいものだが
アプリケーションはネットワークへのアクセスをインジェクションして内部に抱えることができる
0113仕様書無しさん
垢版 |
2018/05/24(木) 23:31:14.29
>>112
インジェクションおじさん?
言っていることが意味不明だよ

アプリケーションとネットワークは
レイヤーが違う
0115仕様書無しさん
垢版 |
2018/05/24(木) 23:38:34.63
いまどきはウェブアプリだらけだけどな。
ちょっとしたソシャゲなんかモロにな。
0116仕様書無しさん
垢版 |
2018/05/24(木) 23:53:57.33
>>111
ストラテジーパターンと違うのは
DIは何のためにそうするのかという理由がないんだよね

ストラテジーパターンは戦略を変更可能にする
という理由があるからそうしている

でも、具体的なクラスをコードから追い出した所で
結局インターフェースは追い出せない。
抽象クラスにした所で、結局そこに入る具象クラスは決まってる
0117仕様書無しさん
垢版 |
2018/05/25(金) 02:54:15.01
インターフェースを追い出すって何したいんだ?
0118仕様書無しさん
垢版 |
2018/05/25(金) 03:25:58.12
さぁ? そもそもクラスすら
追い出す必要はないって
話だからなぁ
0119仕様書無しさん
垢版 |
2018/05/25(金) 03:33:09.82
強い依存と弱い依存という考え方があるんだろうね
違いは、クラスAがクラスBを使用している時

強い依存というのは、クラスBのみでテストできず、
必ずクラスA相当のものが必要になるもの

弱い依存っていうのはその逆でクラスBのみでテストできるもの
弱い依存の場合、クラスBのみでテストできて完全に動くことが証明できるもの
この場合、クラスAは使用しているクラスBに不具合がないという前提で開発できる
この場合、DIなんかつかって外から入れ込まなくても、内部で生成して問題ない
クラスBへの依存は存在するが、その依存が悪影響を与えることはない

なぜなら信用できないクラスBの代わりにテスト用のクラスBのモックを使う必要がないから
クラスBが信用できるので、そのままクラスBを使えば良い
0120仕様書無しさん
垢版 |
2018/05/25(金) 06:27:58.53
DI否定派が多いのはわかった。

しかし、DI否定してるちゃんとした記事がないのは何故なんだ?
頼むからもっとわかりやすくまとめてくれ!そのための記事だろう?
オブジェクト思考がわからん奴にもわかるくらいに書いてくれよ!

さっぱりわからん
0123仕様書無しさん
垢版 |
2018/05/25(金) 08:05:32.27
DI好きは本来は関数型言語を使った方が良いんだけど
低脳すぎて使えないんだよ
かわいそうに
0125仕様書無しさん
垢版 |
2018/05/25(金) 08:51:56.21
使いたきゃ使えばいい
使いたくないなら使わなきゃいい
それでいいじゃないか
0126仕様書無しさん
垢版 |
2018/05/25(金) 09:05:05.59
>>119
何言ってるかわかんねぇ。
AがBを利用してんなら、AとBが強い依存関係にしろ弱い依存関係にしろ、Bは単独でテストできるだろ。単独でテスト出来ない方はむしろAだろ。
0127仕様書無しさん
垢版 |
2018/05/25(金) 09:13:33.23
今来たばかりの者だけど、最新50コメント読んで疑問生まれたので質問です。

クラスAの中でBを利用してる場合、クラスAの中で直接Bをインスタンス化した時に困るケースって、テストが出来る出来ないというよりは、Bを同じインターフェースをもったCに変えたいとか、そういう柔軟性の為ですよね?
テストの話するならクラスAの中で直接インスタンス化する場合でも、先にクラスBのテストを通すようにしておけば、クラスAの中で直接Bを使っててもBは信頼出来るものになってるからクラスAのテストに影響しないですよね。
0128仕様書無しさん
垢版 |
2018/05/25(金) 09:23:42.44
DIの代わりにファクトリーパターン使って、クラスAの中で使う別クラスを柔軟に変えられるようにするのではダメなのですか?
0129仕様書無しさん
垢版 |
2018/05/25(金) 09:35:59.99
> クラスAの中でBを利用してる場合、クラスAの中で直接Bをインスタンス化した時に
> 困るケースって、テストが出来る出来ないというよりは、Bを同じインターフェースを
> もったCに変えたいとか、そういう柔軟性の為ですよね?

DIを使う場合、あらかじめ「クラスAはクラスBを利用します」と
静的に定義するので、アプリ実行中に動的にCに変えることはできないのです。
(もちろんコードを修正してアプリを再起動したら変更できますが)

一方、動的にBを同じインターフェースをもったCに変えたいときに
使うのはストラテジーパターンです。

ストラテジーパターンは戦略(アルゴリズム)を変更したいという
要求があるので、同じインターフェースを持ったB、C、D、E・・・が
作られるのは当然ですが、DIでは動的に変更できないので
同じインターフェースを持ったCが作られることはあまりありません。

実質クラスAで使用するものはクラスB決め打ちです。
つまり柔軟性が必要ない場合にDIを使うことになるわけです。
必要ない柔軟性を持たせることはYAGNIです

> テストの話するならクラスAの中で直接インスタンス化する場合でも、
> 先にクラスBのテストを通すようにしておけば、クラスAの中で直接Bを使ってても
> Bは信頼出来るものになってるからクラスAのテストに影響しないですよね。

はい、そのとおりです。
0130仕様書無しさん
垢版 |
2018/05/25(金) 09:44:26.32
>>129
ありがとうございます。それってDIをする時の話というよりかは、DIコンテナを使うことが前提とした上でDIする時の話ではないのですか?
0131仕様書無しさん
垢版 |
2018/05/25(金) 09:46:41.20
>>129
これはDI不要派としての説明でしょうか?
0132仕様書無しさん
垢版 |
2018/05/25(金) 09:52:29.97
ストラテジーパターンってファクトリーパターン使うときに使いますよね?
0133仕様書無しさん
垢版 |
2018/05/25(金) 09:57:13.63
>>130
DIはDIコンテナを使うことを前提としたパターンです。
DIコンテナ相当のことを手動でやると
小さなプログラム以外では大変すぎるので、
DIコンテナというアイデアで解决したのがDIなのです。
0134仕様書無しさん
垢版 |
2018/05/25(金) 10:02:11.41
>>133
逆ではないのですか?DI手段でやるのしんどいからそれを解決するのがDIコンテナかと思ってました。
0135仕様書無しさん
垢版 |
2018/05/25(金) 10:06:46.72
>>134
DIはパターン名です。

あるクラスのコンストラクタを、別のクラスのオブジェクトを引数にして
呼び出すことをDIと言ってはいけません。

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、
0136仕様書無しさん
垢版 |
2018/05/25(金) 10:14:08.27
>>135
https://msdn.microsoft.com/ja-jp/library/ff921087.aspx

自分の言ってるDIは制御の反転のことであって、DIのことではなかったのですね。制御の反転の実装パターンがdiやサービスロケーターってやつなのですね。
0138仕様書無しさん
垢版 |
2018/05/25(金) 10:22:47.70
>>137
制御の反転自体にはメリットあるけど、diパターンは不要って話ですか?
0139仕様書無しさん
垢版 |
2018/05/25(金) 10:28:11.56
>>138
DIパターンはコスト0で使用できるものじゃない。
本来はクラスの責務である依存関係を、別に定義しなければいけないのと
インターフェースを別に作る必要がある
それだけのコストを支払うメリットがない
0140仕様書無しさん
垢版 |
2018/05/25(金) 10:37:21.61
ちゃんと書いてあるなw

> デメリット
> 制御の反転パターンには、次のようなデメリットがあります。
>
> 初期化しようとするオブジェクトに必要な依存関係を提供するメカニズムを実装する必要がある。
> ソース コードの複雑さが増し、理解が困難になる。
0141仕様書無しさん
垢版 |
2018/05/25(金) 10:48:24.49
制御の反転およりDIが"問題"の唯一の解決手段だと考えるのがだめなんだよ。

制御を反転というのは、反転、つまり正しい流れから逆なわけだよね
逆にしないで正常の流れのまま、問題を解決するほうが良いだろう?
0142仕様書無しさん
垢版 |
2018/05/25(金) 11:22:25.48
https://msdn.microsoft.com/ja-jp/library/ff921152.aspx

> デメリット
> 依存関係の挿入パターンには、次のようなデメリットがあります。
>
> 管理するソリューション要素が増える。
> オブジェクトを初期化する前に、依存関係の挿入フレームワークがオブジェクトに必要な依存関係を解決できることを確認する必要がある。
> ソース コードの複雑さが増し、理解が困難になる。
0143仕様書無しさん
垢版 |
2018/05/25(金) 12:11:32.65
>>141
制御の反転はパターンとか考え方みたいなのものだから
それを適用した制御のフローを正しいとか正しくないとか言うのはナンセンスだと思う
0144仕様書無しさん
垢版 |
2018/05/25(金) 12:14:39.00
>>141
反転しないとインターフェースが汎用的で大規模になりメンテナンスコストが膨大となる
そういうのはライブラリやサービスの提供ベンダーがやる仕事

反転してない例あげるとADO.NETなどのデータプロバイダー
これに対して反転してる例はリポジトリパターン
0145仕様書無しさん
垢版 |
2018/05/25(金) 14:46:31.80
>>143
DIはメンテナンスコストを上げてまで
依存関係を分離させるパターンだよ

DIでメンテナンスコストなんて下がらない
0147仕様書無しさん
垢版 |
2018/05/25(金) 15:17:17.09
>>141
正常の流れってのがよくわからんけど、それでどう問題解決するの?
0148仕様書無しさん
垢版 |
2018/05/25(金) 15:25:13.15
>>147
そもそも"問題"だと思っているものが問題じゃないんですよ

頭のいい馬鹿は問題があればそれを解决しなきゃ
どんなコストを支払ってでも!って考えますが、

問題はあるが少しコストを支払って、許容範囲に
おさめれば、それは問題ではなくなるんですよ


なにをいってるのかわからないでしょうね。
要するに依存しててもいいじゃない
少し面倒になるだけでしょう。という話です。
0149仕様書無しさん
垢版 |
2018/05/25(金) 15:34:25.42
>>148
一言で言うとトレードオフってことね。
0150仕様書無しさん
垢版 |
2018/05/25(金) 15:36:04.67
関数型メインだから勝手に問題消滅してるわ。テスタブルなコードばかりだし。
0152仕様書無しさん
垢版 |
2018/05/26(土) 15:38:49.75
>>316の図見てもDIコンテナを使って初めてDIと呼べる
なんて思えないんだけど。ビルダーってメインが役割果たしてもいいわけだろう?

て言うかなんでDIコンテナ使うの前提でDIと呼べるのにDIなんて言葉があるの?
誰がなんの得があって名前を分けたの?
0153仕様書無しさん
垢版 |
2018/05/26(土) 15:40:05.50
このスレに居座ってるDIアンチは毎回同じわけわからんリンク貼るし、誰かもっとわかりやすく教えて
0154仕様書無しさん
垢版 |
2018/05/26(土) 16:34:29.27
アンチの主張は間違ってるのだからわかりやすく説明することはできないよ
1 + 1 = 3であることをわかりやすく説明するようなものでそれは不可能だ
間違ってることを説明しようとするから筋が通らず支離滅裂でわかりにくくなる
0155仕様書無しさん
垢版 |
2018/05/26(土) 17:17:22.73
間違ってると主張したいのなら、
間違ってる理由の一つでも書いたら?
0156仕様書無しさん
垢版 |
2018/05/26(土) 17:20:07.14
>>152
なにが言いたいのか分からんが、普通のことだろ?
例えばObserver パターンでは
ObserverとSubjectという名前に分かれている
0157仕様書無しさん
垢版 |
2018/05/26(土) 17:39:36.21
>>153
> このスレに居座ってるDIアンチは毎回同じわけわからんリンク貼るし、誰かもっとわかりやすく教えて

お前それ、今まで何回言ったよ?
お前が望む答えが今まで出てないのが
何よりの証拠だよ。

DIアンチが言ってることが正しい
0158仕様書無しさん
垢版 |
2018/05/26(土) 18:13:36.69
>>156
おー、やるねー。
0159仕様書無しさん
垢版 |
2018/05/27(日) 02:48:11.08
>>156
それとは全然違う。

DIコンテナが主なのに
DIって独立した名前があるんだぜ?
0160仕様書無しさん
垢版 |
2018/05/27(日) 07:29:58.13
>>159
DIコンテナが主ってなんだそれ?

DIパターンを構成する要素の一つとして
DIコンテナがあるってだけだろ

えとさぁ、苦し紛れに適当なこと言うの止めてくれない?
0163仕様書無しさん
垢版 |
2018/05/27(日) 10:40:21.14
>>161
Observerパターンでは
ObserverもSubjectも使わなければ
Observerパターンにはなりませんよ
0165仕様書無しさん
垢版 |
2018/05/27(日) 10:56:12.26
>>164
何言ってんだ?

依存性を注入してればDIだよ
そんで注入するための手段は無数にあって
DIコンテナはそのうちの1つのパターンでしかない

DIコンテナがなくてもDIは成立する
これ基本中の基本だからそろそろ理解してくれないかな
0166仕様書無しさん
垢版 |
2018/05/27(日) 11:04:22.49
> 依存性を注入してればDIだよ
嘘つくな。誰がそんな事言ってるんだ?

こちらはソースをちゃんと示せる。
お前は今まで一つも示せてない
個人ブログはソースじゃないからな

マイクロソフト
https://msdn.microsoft.com/ja-jp/library/ff921087.aspx
↑の詳細情報に書いてある
「制御の反転パターンの詳細については、以下の情報を参照してください。」
のリンク先

Fowler の Web サイトの「Inversion of Control Containers and the Dependency Injection pattern」
https://www.martinfowler.com/articles/injection.html
0167仕様書無しさん
垢版 |
2018/05/27(日) 11:06:48.54
実装の詳細
制御の反転 (IoC: Inversion of Control) パターンを実装する方法はいくつかあります。
依存関係の挿入 (DI: Dependency Injection) パターンとサービス ロケーター (SL: Service Locator) パターンは、
このパターンの特殊なバージョンで、異なる方法で実装されます。図 2 に、この 2 つのパターンの概念図を示します。

https://i-msdn.sec.s-msft.com/dynimg/IC258669.png
0168仕様書無しさん
垢版 |
2018/05/27(日) 11:08:35.07
>>166
はぁ?
まずはMicrosoftやFowlerが正しい事を言ってるという数学的根拠を示せよ
誰々が言ってたから正しいって論法はホントばかばかしいんだよね
0169仕様書無しさん
垢版 |
2018/05/27(日) 11:09:23.12
その理屈だと>>168は自分が正しいって
根拠を示さなければならないはずだよね?
0170168
垢版 |
2018/05/27(日) 11:10:06.04
うるさいうるさいうるさーい
俺が言ってるんだから、俺が正しいんだ。
俺が言ってることが根拠!
ばーかばーか
0172仕様書無しさん
垢版 |
2018/05/27(日) 11:15:30.11
マーチンファウラーはDIの名付け親
マーチンファウラーは「こういうものをDIと名付けます」と
言ってることに対して、他人が、それはDIじゃないと
いっても、バカにされるぞw
0173仕様書無しさん
垢版 |
2018/05/27(日) 11:17:25.33
>>169
俺は理を語ってるだけだ
理には俺という権威は必要ない
数学の証明と同じこと

@
依存性の注入(DI)とは
依存性を注入することである

これは自明である

A
依存性の注入を実装する方法は複数存在する
DIコンテナはその一種でしかないので必須要素ではない

これは二種類以上例を挙げれば証明できる
例1 DIコンテナパターン
例2 貧者のDIパターン


はい終わり
この理は誰々が言ってたとか関係ねえんだよ
0174仕様書無しさん
垢版 |
2018/05/27(日) 11:19:23.42
>>173
お前が言ってることは間違ってる
これも自明なんだが?

前提わかってるか?
0176仕様書無しさん
垢版 |
2018/05/27(日) 11:21:57.15
1. DIという用語を作ったのマーチンファウラーである
これは自明

2. このサイトがマーチンファウラーのサイトである
https://www.martinfowler.com/articles/injection.html
(翻訳) https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html#FormsOfDependencyInjection

これも自明

3. DIの基本的な考え方は独立したオブジェクトをAssember(組み立て役)として用意する

(翻訳リンクより)
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトをAssembler(組み立て係)として用意し、
> MovieFinder インタフェースの実装を MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。

これも自明
0178仕様書無しさん
垢版 |
2018/05/27(日) 11:30:20.45
>>176
1. 自明じゃない
M.F.が初出という証拠がない

2. だからなんだ

3. これはむしろDIコンテナは必須ではないということだがよろしいか?
組み立て役は組み立てれればいいのでDIコンテナである必要はない
0179仕様書無しさん
垢版 |
2018/05/27(日) 11:30:54.40
Service Locator と Dependency Injection ってなにが違うの?

https://msdn.microsoft.com/ja-jp/library/ff921087.aspx
https://i-msdn.sec.s-msft.com/dynimg/IC258669.png の図より

Service Locator には、サービスロケーターがあって、
Dependency Injection には、その代わりに
ビルダーっていうのがあるのはわかった。
そのビルダーっていうのがDIコンテナと
呼ばれているものであることもわかった

重要な違いは、
Service Locator は、サービスロケーター があって
Dependency Injection には、ビルダー(DIコンテナ)がある
ってことでいいの?
0181仕様書無しさん
垢版 |
2018/05/27(日) 11:34:03.41
>>178
> 1. 自明じゃない
> M.F.が初出という証拠がない

見事に罠に引っかかったなw
わざと書かなかったんだよ

これ明らかにマーチンファウラーが初出なんだな。
それも https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
にかかれている

> 本記事では、このパターンの働きについて掘り下げることで、より具体的に
> 「Dependency Injection(依存オブジェクト注入)」と命名し、 これを Service Locator の代替案として比較する。

> 結論をいえば、このパターンにはもっと明確な名前が必要なように思う。 「制御の反転」という用語では包括的すぎる。
> これでは混乱する人が出てくるのも無理はない。 様ざまな IoC 支持者と多くの議論を重ねた末、
> その名前は Dependency Injection (依存オブジェクト注入)に落ち着いた。

この記事で命名されたんだよ
0182仕様書無しさん
垢版 |
2018/05/27(日) 11:36:26.12
>>181
は?
MFが書いた記事より以前の全ドキュメントを列挙してDIの記述がないことを示せよ
それが論理的な証明ということだぞ?
0183仕様書無しさん
垢版 |
2018/05/27(日) 11:36:39.95
念の為、訳ではなく原文も書いておこうか

https://martinfowler.com/articles/injection.html

> As a result I think we need a more specific name for this pattern.
> Inversion of Control is too generic a term, and thus people find it confusing.
> As a result with a lot of discussion with various IoC advocates
> we settled on the name Dependency Injection.
0184仕様書無しさん
垢版 |
2018/05/27(日) 11:37:36.56
>>182
なんでそこで悪魔の証明を持ち出すのかなw
お前がネタで書いてるのバレバレやんwwww
0185仕様書無しさん
垢版 |
2018/05/27(日) 11:38:28.04
悪魔が存在しないことを示せ
存在しないことを示せなければ
悪魔は存在するということだ
だっけ?w
0186仕様書無しさん
垢版 |
2018/05/27(日) 11:41:20.58
みなさんお開きにしましょうか?
DIはDIコンテナを使うパターンであると
わかった上で、言葉遊びでしてるだけなんですよ
そんなやつに真面目に付き合う必要はありません。
0187仕様書無しさん
垢版 |
2018/05/27(日) 11:44:16.83
適当なブログに命名したって書いたら発案者になってしまうなら楽なもんだよな

IT業界では真新しいように宣伝してるけどもっと昔からあったよね、って事例はごまんとあるんだよ
MFの自称発明者ってのが事実なら証明してみな
0188仕様書無しさん
垢版 |
2018/05/27(日) 11:46:16.69
> 適当なブログに命名したって書いたら発案者になってしまうなら楽なもんだよな

楽じゃないよ

> As a result with a lot of discussion with various IoC advocates
> we settled on the name Dependency Injection.

> 結論をいえば、このパターンにはもっと明確な名前が必要なように思う。
> 「制御の反転」という用語では包括的すぎる。これでは混乱する人が出てくるのも無理はない。
> 様ざまな IoC 支持者と多くの議論を重ねた末、その名前は Dependency Injection (依存オブジェクト注入)に落ち着いた。

こう書いてあるだろ?

IoC 支持者と多くの議論を重ねて命名したんだよ
お前にそれができるか?
0189仕様書無しさん
垢版 |
2018/05/27(日) 11:48:52.59
だからそれも自称IoC支持者と自称多くの議論でしかないんだよ
そういうつぶやきじゃなくて最低限、議事録をだせよ
0191仕様書無しさん
垢版 |
2018/05/27(日) 11:51:35.04
DIコンテナ必須派ってさいつもこうだよな
MFとかいう面識もない殆ど空想上のおっさんが言ってた、っていうくだらない根拠しか提示できない
おっさんの権威を認めなければこんなにも簡単に崩れ去るロジックしか示せない
まったくもって片腹痛いわ
0193仕様書無しさん
垢版 |
2018/05/27(日) 11:56:00.52
>>192
いや、議事録だよ。
お前が言ってることが正しいという
議事録を出せって言ってる
0194仕様書無しさん
垢版 |
2018/05/27(日) 11:57:07.95
>>192
お前が、自称IoC支持者と多くの議論をしたんだろ?
だからその議事録を出せって
まさか、議事録もないのに、お前の言ってることを
信じろって言ったのか?
0196仕様書無しさん
垢版 |
2018/05/27(日) 12:02:50.59
人々「まあ地動説だよな再現性ある実験レポートもあるし」
馬鹿「天動説」
人々「ん?」
馬鹿「天動説が正しいんだが?」
人々「は?根拠は?」
馬鹿「教会がそう言ってた。聖書にも書いてある」
人々「あほくさ」
0197仕様書無しさん
垢版 |
2018/05/27(日) 12:16:56.80
人々「まあ地動説だよな再現性ある実験レポートもあるし」
馬鹿「オレオレDI」
人々「ん?」
馬鹿「俺が言ってることが正しいんだが?」
人々「は?根拠は?」
馬鹿「俺がそう言ってた。5chにも書いてある」
人々「あほくさ」
0199仕様書無しさん
垢版 |
2018/05/27(日) 12:21:01.46
宇宙には上も下もないし、そもそも中心も無いんだから、重量で中心という概念を作れば地動説、人間中心主義で考えれば天動説、ただそれだけの話。
そもそも世界の中心という発想は人が作り出した概念に過ぎないのだから。
0200仕様書無しさん
垢版 |
2018/05/27(日) 12:22:04.62
そりゃ、独自解釈の誰も言ってないものに対して
名前なんかあるわけがない

だからさっきから、それがDIの正しい定義だというのなら
それが書いてあるところと、お前がIoC支持者と議論したと
いうのなら、その証拠を出せって言ってるんだが

っていうかお前誰だよ?
マーチンファウラーの知名度に勝てるとでも思ってんのか?
0202仕様書無しさん
垢版 |
2018/05/27(日) 12:24:25.30
>>201
じゃあお前とマーチンファウラーを比べてやるから
名前言えよ。その勇気があるのならな
0205仕様書無しさん
垢版 |
2018/05/27(日) 12:25:23.75
俺の理論はさっき示した

そしてそれは知名度とか関係ない理

MFの権威にすがった破綻した屁理屈とは違うのだよ
0209仕様書無しさん
垢版 |
2018/05/27(日) 12:27:32.12
>>205
誰がお前の説なんか信用すると思ってるんだ?
馬鹿じゃないのかな?
0211仕様書無しさん
垢版 |
2018/05/27(日) 12:29:16.61
5chで間違った説を流布しないでくれませんかね?
まあ普通、5chに書いてあった!と言ったところで
誰も信用しませんが
だから外部のソースを示すことが説得力につながるわけで
0212仕様書無しさん
垢版 |
2018/05/27(日) 12:30:57.77
まあここで、俺が言っていることは正しい!
そのことを外部のソースを示して証明してやる!
って言えない時点で、ちっせぇよなw
0213仕様書無しさん
垢版 |
2018/05/27(日) 12:32:51.04
名を明かさず5chであれこれ言っていても
マーチンファウラーほどの説得力はないという
当たり前の結論でした
0214仕様書無しさん
垢版 |
2018/05/27(日) 12:35:23.59
少し考えてほしい。
マーチンファウラーは信用できない
ということは、相対的に考えると
俺は信用できるということではないだろうか?
0215仕様書無しさん
垢版 |
2018/05/27(日) 12:36:09.64
>>214
ねーよwwww
いくらマーチンファウラーがーって言おうが
お前もお前の言ってることも信用出来ないことは
変わらねーよw
0216仕様書無しさん
垢版 |
2018/05/27(日) 12:38:21.71
Service Locator と Dependency Injection ってなにが違うの?

https://msdn.microsoft.com/ja-jp/library/ff921087.aspx
https://i-msdn.sec.s-msft.com/dynimg/IC258669.png の図より

Service Locator には、サービスロケーターがあって、
Dependency Injection には、その代わりに
ビルダーっていうのがあるのはわかった。
そのビルダーっていうのがDIコンテナと
呼ばれているものであることもわかった

重要な違いは、
Service Locator は、サービスロケーター があって
Dependency Injection には、ビルダー(DIコンテナ)がある
ってことでいいの?
0218仕様書無しさん
垢版 |
2018/05/27(日) 13:10:07.72
> 依存性を注入してればDIだよ
> そんで注入するための手段は無数にあって
> DIコンテナはそのうちの1つのパターンでしかない
>
> DIコンテナがなくてもDIは成立する
> これ基本中の基本だからそろそろ理解してくれないかな

>>153だけど、俺も単純にこう思うんだよなあ。
で、毎回マーチンファウラーのリンクばかりでわけわからん。もう少しわかりやすく例えて説明してほしい。
そのためのスレなんだから。
0219仕様書無しさん
垢版 |
2018/05/27(日) 13:13:01.68
それにマイクソの記事のビルダーってDIコンテナじゃなくてメインでもいいんだろう?
0220仕様書無しさん
垢版 |
2018/05/27(日) 13:14:29.20
>>218
わけわからんなら勉強しろって

お前がわからない=間違いじゃないんだから、
まずマーチンファウラーが言ってることは正しいと
認めた上で勉強しろ。

っていうかそれをやらないから理解できないんだろ。
間違ったことを前提にして進めてるからだめなんだぞ
0221仕様書無しさん
垢版 |
2018/05/27(日) 13:15:40.74
>>209
信用とか必要ない

事実を示しただけ

1+1=2が正しいことはお前が信じなくても信じてもかわらない
0222仕様書無しさん
垢版 |
2018/05/27(日) 13:15:58.67
>>219
> それにマイクソの記事のビルダーってDIコンテナじゃなくてメインでもいいんだろう?

メインはエントリーポイントでオブジェクトではないので
「使う」ことができない

まずメインから、処理の部分をオブジェクトに分離する
そしてそれをDIコンテナと名付ければ良い
0223仕様書無しさん
垢版 |
2018/05/27(日) 13:16:41.34
>>221
俺の言ってることが事実なんだー!
っていうのはいらないから(大爆笑)
0225仕様書無しさん
垢版 |
2018/05/27(日) 13:17:35.23
そりゃな、世界でもトップクラスの
アーキテクトだし

5ちゃんねるで騒いてるガキとは
レイヤーが違うよw
0227仕様書無しさん
垢版 |
2018/05/27(日) 13:18:39.89
まあこう書いてあるしな。
独立させたオブジェクトにしないといけない

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
0228仕様書無しさん
垢版 |
2018/05/27(日) 13:19:15.56
>>226
それは間違いだって結論出てる。
なぜなら5ちゃんねるで騒いてるガキしか
言ってない。正しいと証明されていない
0229仕様書無しさん
垢版 |
2018/05/27(日) 13:19:55.15
なるほど。独立したオブジェクトとして用意する所がキモなんですな
0230仕様書無しさん
垢版 |
2018/05/27(日) 13:20:47.25
>>228
やれやれ
間違いというなら証明してみなよ
おっとでもマーチンおじさんの引用で証明とか言わんでくれよな
それは証明じゃなく証言でしかないからな
0231仕様書無しさん
垢版 |
2018/05/27(日) 13:21:20.80
https://msdn.microsoft.com/ja-jp/library/ff921152.aspx
> クラスでは、依存関係のインスタンスを明示的に作成せず、
> クラスの定義で宣言を使用して依存関係を表現します。
> Builder オブジェクトを使用して

たしかにビルダーはオブジェクトではならないといけないようですな
0232仕様書無しさん
垢版 |
2018/05/27(日) 13:21:48.45
>>230
> 間違いというなら証明してみなよ

正しいということを証明してみなよ
0233仕様書無しさん
垢版 |
2018/05/27(日) 13:22:16.83
はいはいどっちもバカ
0234仕様書無しさん
垢版 |
2018/05/27(日) 13:22:48.46
DIと呼ばれる概念はもう少し抽象度が高いと思うんだよね

それをマーチン教のDIアンチは、DIはDIコンテナを使うことだ!って信じてやまないわけ

そのせいでもう3スレ目に突入ですよ。
勝手にタイトルも変えちゃうし
0235仕様書無しさん
垢版 |
2018/05/27(日) 13:23:04.16
結局、間違ったことを書いて、
間違っていることを証明してみせよって
言ってるだけなんだよなw
0236仕様書無しさん
垢版 |
2018/05/27(日) 13:25:31.82
DIは依存性注入
で、応用として面倒な生成をらくちんにしてくれるDIコンテナってシンプルな考えじゃダメなの
0237仕様書無しさん
垢版 |
2018/05/27(日) 13:25:44.19
>>235
議論がなりたたないわけだ。
本来は自分が証明するという義務を果たさないで文句ばかり言う。
DIがどうとか以前に、人間として失格
0238仕様書無しさん
垢版 |
2018/05/27(日) 13:27:44.47
組み立て役が独立したオブジェクトである必要はないよ
貧者のDIパターンという世界的にも有名なパターンがあって
これはコンストラクタインジェクションのデフォルトパラメーターを利用したDIのバリエーションのことなんだ
このパターンはファクトリ不要なので「 D I コ ン テ ナ も 不 要 」なんだよ
0239仕様書無しさん
垢版 |
2018/05/27(日) 13:28:05.95
>>236
定義が間違ってるからだめ。
そのせいでなんでもインジェクションと言うインジェクションおじさんが生まれた

インジェクションおしさんは
オブジェクトを渡してコンストラクタを呼びだしたり、
関数にオブジェクトを渡すことまでインジェクションとか言い出したからな
そのうちStringもオブジェクトだから、printfにStringをインジェクションするとか言い出すだろう
0240仕様書無しさん
垢版 |
2018/05/27(日) 13:28:29.07
>>238
> 組み立て役が独立したオブジェクトである必要はないよ

だーかーらー、
それを証明しろって
何度言われれば理解するんだ
0241仕様書無しさん
垢版 |
2018/05/27(日) 13:28:54.20
約 12,400 件 (0.63 秒)
"貧者のDIパターン"との一致はありません。
0244仕様書無しさん
垢版 |
2018/05/27(日) 13:30:50.04
>>240
俺が言ってるから正しい
5ちゃんねるに書いてあるのが証拠だ
0245仕様書無しさん
垢版 |
2018/05/27(日) 13:31:33.48
Q. poor man's dependency injection はDIと同じものですか?
A. 名前が違うのだから別物です
0247仕様書無しさん
垢版 |
2018/05/27(日) 13:34:31.52
>>246
あのー、Poor man's dependency injectionを調べたら
DIコンテナを使わないDIって書いてあったんですが、
それじゃPoor manじゃないものはDIコンテナを使うってことでいいんですよね?
0248仕様書無しさん
垢版 |
2018/05/27(日) 13:35:58.87
DIがDIコンテナを使うものという前提があるからこそ
DIコンテナがないことを示すために、Poor man's って
わざわざつけるんだろうに。自滅して大変だなw
0249仕様書無しさん
垢版 |
2018/05/27(日) 13:37:32.20
なにそのpoormanって、いつからアベンジャーズの話になったの?
0250仕様書無しさん
垢版 |
2018/05/27(日) 13:38:42.06
>>249
あの馬鹿も必死なんですよw
自分の説を認めてもらおうと
頑張って調べて・・・んで返り討ちにあってるわけですねw
0251仕様書無しさん
垢版 |
2018/05/27(日) 13:50:31.95
でもプアマンDIってものがあるなら
やはりDIという概念はもう少し抽象度が高く
DIコンテナ必須のパターンということではなくなるのでは?
0252仕様書無しさん
垢版 |
2018/05/27(日) 13:52:53.93
https://eow.alc.co.jp/search?q=poor+man%27s

> poor man's asparagus
> 貧乏人のアスパラガス◆アスパラガスと同じように利用できる上、入手しやすいリーキに対しヨーロッパで付けられたあだ名
Q. poor man's asparagusはアスパラガスですか?
A. いいえ、アスパラガスではありません。リーキのことです

> poor man's meat
> ナス◆【同】aubergine
Q. poor man's meatは肉ですか?
A. いいえ、肉ではありません。ナスのことです

> poor man's nuclear weapon
> 貧者の核兵器◆コレラや炭疽菌などの感染性細菌を利用した生物兵器は核兵器よりも製造費がかなり低くて済むことからこのように呼ばれる
Q. poor man's nuclear weaponは核兵器ですか?
A. いいえ、核兵器ではありません。生物兵器のことです

> poor man's Porsche
> プア(マンズ)ポルシェ、貧乏人のポルシェ、安価なスポーツカー◆高価なポルシェを買えない人が代わりに買うようなスポーツカー。
Q. poor man's Porscheはポルシェですか?
A. いいえ、ポルシェではありません。安価なスポーツカーのことです
0254仕様書無しさん
垢版 |
2018/05/27(日) 14:03:20.94
poor man's DIがDIの代替品で、その特徴がDIコンテナを使わないことなら、
普通のDIはDIコンテナ使うってのが共通認識なんだよな。
でなければ、DIコンテナがないものに対して名前をつけたりしない
0256仕様書無しさん
垢版 |
2018/05/27(日) 14:50:03.75
>>252
あほくさ
DIとアスパラガスになんの関係があるのか説明してみな?
0257仕様書無しさん
垢版 |
2018/05/27(日) 15:03:58.86
>>256
poor man's asparagus

poor man's DI
には、両方とも poor man's が含まれてる
0262仕様書無しさん
垢版 |
2018/05/27(日) 15:25:13.80
くだらない言葉遊びをしてるんじゃないよ
poor man's pasta はまさに pasta だ
poor man's DI は pasta のほうと同じパターンな
poor man's DI はまさに DI なんだよ
0264仕様書無しさん
垢版 |
2018/05/27(日) 16:18:14.88
>>262
> poor man's DI は pasta のほうと同じパターンな

証明してないので認められない
0265仕様書無しさん
垢版 |
2018/05/27(日) 16:21:16.10
結局「DIコンテナを使わないDI」って言葉が伝わる地点で
マーチンがDIをどう定義しようがDIの言葉の意味とか抽象度とかってのは変わってしまうんだよな

リチャードストールマンがLinuxのことをGNU/Linuxって言いましょう!って主張してるのと一緒!!
けど、みんなLinuxって言うんだ。
0266仕様書無しさん
垢版 |
2018/05/27(日) 16:39:11.71
そうだね「DIコンテナを使わないDI」って言わない限り
DIコンテナ使うんだって思うのがデフォだね
0267仕様書無しさん
垢版 |
2018/05/27(日) 18:10:30.32
いやいや普通はDIっていったら依存性を注入することを想像するしコンテナまでは想像しないよ
0271仕様書無しさん
垢版 |
2018/05/27(日) 18:21:47.07
数学的根拠を示すためにデータを集めてね
最低でも100件
0272仕様書無しさん
垢版 |
2018/05/27(日) 18:23:12.84
数学的根拠も示してないのに一般的とかどういう神経してるんだろうかw
0273仕様書無しさん
垢版 |
2018/05/27(日) 18:24:33.98
数学的根拠を示すためにデータを集めてね
最低でも100件 ( ー`дー´)キリッ
0274仕様書無しさん
垢版 |
2018/05/27(日) 18:32:04.52
>>267
わざわざ「DIコンテナを使って」とは言わないだけ
なぜならDIするときにはDIコンテナを使うのが一般的だから
0275仕様書無しさん
垢版 |
2018/05/27(日) 18:33:42.26
>>274
そうだよね。
さらに一般的なだけじゃなくて、
マーチンファウラーやMSが言ってることだし
0276仕様書無しさん
垢版 |
2018/05/27(日) 18:33:57.32
じゃあマーチンファウラーやMSが言ってるという証拠を出してください
0279仕様書無しさん
垢版 |
2018/05/27(日) 18:40:19.41
一方は証明できるのに、もう一方の人は証明できない
これも能力の差なのかな
アンチの方こそDIをよく理解している
0280仕様書無しさん
垢版 |
2018/05/27(日) 18:57:13.40
だってQiitaとか出したらバカにされたし
Wikipedia出したら、あんなの信じるの?とか言われたし
0282仕様書無しさん
垢版 |
2018/05/27(日) 18:58:17.65
有名な記事は全部アンチDIが言ってることと同じだし
0284仕様書無しさん
垢版 |
2018/05/27(日) 19:31:23.18
それはデフォルトのオプションというだけであって必須というわけではない

void Func(string p = "unko") {}

pは必須パラメータか?違う

DIコンテナも多くの人にとってはデフォルトではあるが必須ではない
0285仕様書無しさん
垢版 |
2018/05/27(日) 19:33:20.68
> それはデフォルトのオプションというだけであって必須というわけではない
その根拠は? 数学的根拠を示してね
0286仕様書無しさん
垢版 |
2018/05/27(日) 19:36:02.72
>>285
必須と明記された資料はマーティンのサイトにもMicrosoftのサイトにもないぞ
あるというなら必須であると明記されたソースだして
なければ必須ではないということ
つまりオプションということだ
0288仕様書無しさん
垢版 |
2018/05/27(日) 19:37:20.83
>>286
必須だとかいてなければオプションであるという
数学的根拠は?
0295仕様書無しさん
垢版 |
2018/05/27(日) 19:45:10.84
こういうふうに、自明でないものを自明とか
嘘つくやつがいるせいで信用されないってわかってないのかね?
0298仕様書無しさん
垢版 |
2018/05/27(日) 19:46:37.57
必須でないなら使用してもしなくてもよい
それはまさにオプションのことである
はい自明
0301仕様書無しさん
垢版 |
2018/05/27(日) 19:47:33.63
 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
 > MovieLister クラスのフィールドへ適切に設定させるというものだ。
 > 依存関係は図2のようになる。
0302仕様書無しさん
垢版 |
2018/05/27(日) 19:47:51.34
Service Locator と Dependency Injection ってなにが違うの?

https://msdn.microsoft.com/ja-jp/library/ff921087.aspx
https://i-msdn.sec.s-msft.com/dynimg/IC258669.png の図より

Service Locator には、サービスロケーターがあって、
Dependency Injection には、その代わりに
ビルダーっていうのがあるのはわかった。
そのビルダーっていうのがDIコンテナと
呼ばれているものであることもわかった

重要な違いは、
Service Locator は、サービスロケーター があって
Dependency Injection には、ビルダー(DIコンテナ)がある
ってことでいいの?
0303仕様書無しさん
垢版 |
2018/05/27(日) 19:48:15.63
https://msdn.microsoft.com/ja-jp/library/ff921152.aspx

> デメリット
> 依存関係の挿入パターンには、次のようなデメリットがあります。
>
> 管理するソリューション要素が増える。
> オブジェクトを初期化する前に、依存関係の挿入フレームワークがオブジェクトに必要な依存関係を解決できることを確認する必要がある。
> ソース コードの複雑さが増し、理解が困難になる。
0305仕様書無しさん
垢版 |
2018/05/27(日) 19:49:10.63
> クラスAの中でBを利用してる場合、クラスAの中で直接Bをインスタンス化した時に
> 困るケースって、テストが出来る出来ないというよりは、Bを同じインターフェースを
> もったCに変えたいとか、そういう柔軟性の為ですよね?

DIを使う場合、あらかじめ「クラスAはクラスBを利用します」と
静的に定義するので、アプリ実行中に動的にCに変えることはできないのです。
(もちろんコードを修正してアプリを再起動したら変更できますが)

一方、動的にBを同じインターフェースをもったCに変えたいときに
使うのはストラテジーパターンです。

ストラテジーパターンは戦略(アルゴリズム)を変更したいという
要求があるので、同じインターフェースを持ったB、C、D、E・・・が
作られるのは当然ですが、DIでは動的に変更できないので
同じインターフェースを持ったCが作られることはあまりありません。

実質クラスAで使用するものはクラスB決め打ちです。
つまり柔軟性が必要ない場合にDIを使うことになるわけです。
必要ない柔軟性を持たせることはYAGNIです

> テストの話するならクラスAの中で直接インスタンス化する場合でも、
> 先にクラスBのテストを通すようにしておけば、クラスAの中で直接Bを使ってても
> Bは信頼出来るものになってるからクラスAのテストに影響しないですよね。

はい、そのとおりです。
0308仕様書無しさん
垢版 |
2018/05/28(月) 16:01:02.10
DIとはDIパターンのことであり、DIパターンとはDIコンテナを使うものだったんですね。

今まで反発してごめんなさい。
0310仕様書無しさん
垢版 |
2018/05/28(月) 19:28:06.28
スレタイにDI入れたの
ハッキリ言って失敗だったな

DIなんかOOの一部でしかないのに
グダグダグダグダどうでもいいことで議論続いてウンザリ
0311仕様書無しさん
垢版 |
2018/05/28(月) 19:41:08.95
OOのデザインパターンの中でも12を争うウンコがDI
0313仕様書無しさん
垢版 |
2018/05/28(月) 20:25:04.72
次スレ立てる時はスレタイから「とDI」を外そうぜ
0315仕様書無しさん
垢版 |
2018/05/28(月) 22:12:08.29
忘れてなければ今度は「とDI」を外すぜ
忘れてなければなー
0316仕様書無しさん
垢版 |
2018/05/28(月) 22:37:31.81
歪な知識しか持たないIT社長が、素人に歪で浅い知識植え付けて、そこらのJava案件に送り込むんだよね。
DIとかまさにそんな感じ。

良く知らずに使わされている技術について考える良い機会になったと思うよ。
0317仕様書無しさん
垢版 |
2018/05/29(火) 03:25:06.33
DIがDIコンテナを使うパターンだってことはわかった。

でもDIアンチは、インジェクションすること自体がうんこって言ってたよね?

その理由がいまだにわからないんだけど
0318仕様書無しさん
垢版 |
2018/05/29(火) 06:18:52.33
>>317
依存関係を分離するという志は素晴らしいが、
実際には単に、クラス内のフィールドに
オブジェクトを外部から入れるか、内部で生成するかの違いでしかない

外部から入れるためにインターフェースを作ってDIコンテナの
依存関係の定義をいちいち書くほどのメリットがない

内部で普通にnewしていれば十分。他のクラスに
入れ替えることがないならインターフェースも不要
DI使わないほうがコードはシンプルになる
そのことはマイクロソフトも認めている

https://msdn.microsoft.com/ja-jp/library/ff921152.aspx
> デメリット
> 依存関係の挿入パターンには、次のようなデメリットがあります。
>
> 管理するソリューション要素が増える。
> オブジェクトを初期化する前に、依存関係の挿入フレームワークがオブジェクトに必要な依存関係を解決できることを確認する必要がある。
> ソース コードの複雑さが増し、理解が困難になる。

ソースコードを複雑にして理解を困難にしてまでやることではない
少ないコードでシンプルするのが一番
0319仕様書無しさん
垢版 |
2018/05/29(火) 09:24:27.77
会話がここまで噛み合わない理由は、
コードの読みやすさを重視する度合いが
内製やってる連中とウンコレベルのドカタとで
全然違うからではないだろうか?
0321仕様書無しさん
垢版 |
2018/05/29(火) 09:50:10.27
>>318
そのマイクソのページわかりやすいね。
で、君はデメリットだけピックアップしてきたわけだけど
その記事にはちゃんとメリットも示されてるじゃないか
0322仕様書無しさん
垢版 |
2018/05/29(火) 10:20:03.39
デメリットが大きすぎて、DIと同じメリットが得られる
別の手法を選ばざるをえない
コードを書き捨てるドカタは事情が違うかもしれないけど
0323仕様書無しさん
垢版 |
2018/05/29(火) 11:45:59.90
>>321
書いてあるのはメリットじゃなくて期待できる効果だなw

しかも一部は○○という効果がある。ではなく〇〇するという
おい、○○するとどいういうメリットがあるのかを書くべきだろって
そこで、○○するって書くのはどういうことなんだ?ってツッコミ入る書き方だな
以下一つ一つ答えよう

1. クラスのソース コードに加える変更を最小限に抑え、または変更をまったく加えないで、
依存関係の置換または更新を行えるように、クラスを依存関係から分離する。

別にクラス内部で生成しても、依存関係変えたきゃ一行newする行を変えれば終わり
全く変えないでやりたいなら設定ファイルに文字列書いてクラス内部でevalでもするか?
(なんのためにしたいのかわからんが)

なお、文章がおかしい。「分離する」はメリットではなく、分離することで
「依存関係の置換または更新ができるようになる」というのが正しい書き方だ。文章が逆になってるな。

2. 具体的実装がコンパイル時に不明であるクラスに依存するクラスを作成できるようにする。

コンパイル時に不明であるなら、クラス内部で文字列からevalすればいいだけ。
だがそもそも具体的実装がコンパイル時に不明であることは少ない

3. 依存関係を使用せず、クラスを単独でテストする。
またテストか(笑) クラス内部でnewしていたとしても、ちょっとの工夫で依存関係を使用しないでテストできる
が、そもそもクラスを単独でテストすることに意味があるのか?
モックを使ったテストはできるだけしないほうがいい。別のクラスを使ってテストしても本当のテストにはならない

4. 依存関係の有効期間の指定と管理を、クラスの役割から分離する。
だから、分離することでどういうメリットが有るのかを書くべき
クラスの役割から分離して、依存関係の有効期間の指定を管理できる。と書きたいのかもしれんが
そもそも依存関係の有効期限はクラスの役割の一つなので分離したら駄目
0324仕様書無しさん
垢版 |
2018/05/29(火) 13:13:59.61
メインからのインジェクションをしない場合、依存関係がソース全体に散らばってしまう。

依存関係の整理を行おうとしたら、プロジェクトの全てソースのnewを検索して、調べなきゃいけなくなるじゃん。

newは疎結合を破壊するとんでもない代物なので、扱いには注意が必要だ。

抽象度の高い実装ができない部下に「言語レベルで実装されたクラス以外のnewはメインから受け取るようにね!」って伝えておけば

部下が「あのー〇〇クラスで〇〇使いたいんで、コンストラクタの引数増やしたんですけど、メインのソースいじりますよ?」ってなって
そのときそれがベターな手法かメインプログラマが考えることができる。

また、部下にこっそりメインいじられたとしても、メインのソースを日々意識しないメインプログラマなんていないでしょ。すぐ気がついて
「あ!〇〇クラス使いたいならファクトリから生成してね!」とか助言言いやすいっていうか。

部下の手によってプロジェクトのソースが荒らされ、全てのクラスの依存関係がめちゃめちゃになって泥団子化することはよくあることだ。

メインからのインジェクションを覚えさせておけばクラスが無闇矢鱈に依存しまくる問題を解消できる...

とか、思ってるんですけどどう思われますか?
0325仕様書無しさん
垢版 |
2018/05/29(火) 14:26:31.42
> メインからのインジェクションをしない場合、依存関係がソース全体に散らばってしまう。

それのどこが悪いんだって話だな。
結局、依存関係はどこか一箇所にまとめなきゃいけない
理由は? → と、とにかく一箇所にまとめなきゃいけないんだ!

結局こうなってしまう。だから説得力がない
0326仕様書無しさん
垢版 |
2018/05/29(火) 14:29:11.90
>>324みればわかるけど、理由がないんだよ。
長々とした水増し文章見てもわかるだろ?
結局、あいつは馬鹿なんだ。程度のことしか言ってない
DIに明確なメリットが無いから、技術的な話ができないんだよ
0327仕様書無しさん
垢版 |
2018/05/29(火) 14:35:27.51
ここのオブジェクトが責任持ってnewする方が疎結合だろ
「main様、私めはどのようなインスタンスを生成したら良いですか?」って全てが一箇所にお伺い立てるのが
どこが疎結合なんだよ脳みそ沸いてんのか
0328仕様書無しさん
垢版 |
2018/05/29(火) 16:41:18.35
>>325
オブジェクト指向って想定される変更に柔軟に対応できるように
クラスを使って変更点を一箇所に抽出するプログラミングスタイルと言えるよね?

で、依存関係を一つに集約する方法が、DIであり、メインからのインジェクションだろう?

そんなもの必要ない!とか感情論的に言われたら
君は依存関係が一つにまとまることがメリットとなるプロジェクトに携わったことがないということになるのでは?

どんな優れたパターンもテクニックもライブラリもフレームワークも技術も
目的がハローワールドを作ることなのであれば、全て無価値だ。

少なくともおれは、小さなアプリケーションから始まって、そのアプリケーションが成長するとともに管理が複雑化し
その複雑さの解消のひとつとして、依存性をひとつにまとめることは大きな価値があったよ。

メインを見れば、どのようにプログラムが動いてるか、抽象度の高いとこから見渡すことができる。

それが、プロジェクトの全てのファイルを開いて一つずつメモしなければ依存関係がわからない状態なんて、クソ喰らえだね!
0329仕様書無しさん
垢版 |
2018/05/29(火) 17:07:25.14
>>328
依存関係なんて、自動で出せるでしょ
0330仕様書無しさん
垢版 |
2018/05/29(火) 17:18:48.45
>>329
依存関係を変更するときに修正するファイルが一つになることが重要だと思ってた
0331仕様書無しさん
垢版 |
2018/05/29(火) 17:20:53.30
>>328
何度も言ってるけど、なんで依存関係を分離したり
依存関係を知ることが目的になってるんだよ
なにか目的があってそうしてるんだろ?
その目的を言わないから説得力がないんだよ
0332仕様書無しさん
垢版 |
2018/05/29(火) 17:23:36.06
>>330
考えてみ。
クラスAが使ってるオブジェクトが何か?って思ったら
クラスAを見ればいいだけだろ?

クラスAを見てもインターフェースしかわからない
実際には何を使ってるんだ?っていちいち調べないといけないんだよ。

ついでにいうとIDE使っているときジャンプ機能が使えなくなる
普通にクラス内でnewしていれば、そこにクラスが書かれているから
IDEでジャンプできるが、インターフェースだとジャンプできない
0333仕様書無しさん
垢版 |
2018/05/29(火) 17:32:51.06
依存関係の定義を一箇所にするっていうのは
一般的なプログラミングのセオリーに反してるんだよ。

ファイルを分割するとき責務で分割する。機能分割してはいけない。
例えば、O/Rマッパーはテーブル(責務)ごとに分割する。
select機能、update機能、delete機能、ごとに分割したりはしない
こんなことをすると、テーブルの構造が変わったとき、
select機能、update機能、delete機能、の各ファイル3つの
ファイルを修正することになる

依存関係の定義っていうのは、まさに機能ごとの定義になってる
あるモジュールが依存するオブジェクトが変わった(例えば追加)されたとき、
依存関係の定義ファイルまで修正しなければいけなくなる

責務ではなくて機能で分割されている証拠
0334仕様書無しさん
垢版 |
2018/05/29(火) 17:39:21.10
簡単に言えば関数型言語でモナド使ってやるべき事を
OOPLでやろうとしてるんだねDIは
0336仕様書無しさん
垢版 |
2018/05/29(火) 19:50:23.42
多分まだ出てないDIコンテナのメリットとしては、依存オブジェクトをそのラッパーに差し替えるようなことがあるんじゃないかな。
クラスAのラッパーAwrapperを動的に生成して、利用側はAを使ってるつもりだが実際はAwrapperが呼ばれるようにする。
各依存オブジェクトのメソッド呼び出しのログを取ったり独自の権限チェックをしたりという横断的な変更が手軽にできるわけだな。
Aを作る立場だと余りメリットに思えないが、全体を運用してると便利かも。
0337仕様書無しさん
垢版 |
2018/05/29(火) 20:00:02.91
>>336
Decoratorパターンのことかな?
○○したいという要求があれば、その要求を実現するように作ればいいんだよ
それはそういう要求が出た時点でやること

今必要とされてないのに、将来ラッパーに差し替えたくなるかもしれないじゃないですか!
というのは過剰な設計だよ

そして別にDIを使わなければ実現できないわけじゃない

それからもう一つ、DIっていうのはプログラム起動時に
依存関係の定義し、プログラムの実行中に動的に変えることはしない
なにが言いたいかというと、クラスAのラッパーを使いたいのであれば

A a = new A(); を
A a = new WrapperA();

こう書き換えるだけで十分って話だ
0338仕様書無しさん
垢版 |
2018/05/29(火) 20:24:57.03
頼むからQiitaに
「DIにはデメリットしかない」
とかってタイトルの記事書いて欲しい
0340336
垢版 |
2018/05/29(火) 21:05:32.08
>>337
横断的にってとこがポイント。

こんな感じ。
DIコンテナ管理下のオブジェクトA,B,C...
があった時に、各メソッドに割り込むフィルタ実装FをDIコンテナに組み込んで設定する。
するとDIコンテナはAとFを元にAwrapperインスタンスを動的に生成してAインスタンスの代わりに使う。
同様にBとFを元にBwrapperインスタンスを生成、CとFを元にCwrapperインスタンスを生成...
(各wrapperのソースは人がコーディングせず動的にインスタンスが作られる)

管理下のオブジェクトの数がある程度多い場合には、全オブジェクトを改修するより効率的だろうね。
0341仕様書無しさん
垢版 |
2018/05/29(火) 21:16:42.35
> 各メソッドに割り込むフィルタ実装FをDIコンテナに組み込んで設定する。
DIで各メソッドに割り込むフィルタを作ることはできない
それはDIとは関係のない機能

言語仕様としてあるメソッドの前後に処理を付け加えることが
できるのであれば、それは別にDIを使わずともできる
0343仕様書無しさん
垢版 |
2018/05/29(火) 23:49:00.41
あ、ごめん
DIじゃなくてインジェクションねインジェクション
インジェクショーン!!
0344336
垢版 |
2018/05/30(水) 00:17:55.28
なるほどこういうことか。
DIコンテナ無しで楽にAOPできる環境があればその方が便利?
別概念ではあってもDIコンテナといえばAOPは付き物のようだが…

DIコンテナとAOP
ttps://gamp-ameblo-jp.cdn.ampproject.org/v/s/gamp.ameblo.jp/ouobpo/entry-10013926093.html?usqp=mq331AQCCAE%3D&amp_js_v=0.1#amp_tf=ソース%3A%20%251%24s
0345仕様書無しさん
垢版 |
2018/05/30(水) 07:22:52.34
>>344
AOPも「やりたいこと」ではないからね。
本当のやりたいことっていうのはロギングだったり
トランザクション制御だったりするわけ

DIもAOPもそれがあるだけじゃ
ロギングもトランザクションも実現できない

かといってそれをDIやAOPの利用者が実装するとなると大変
そこでDIやAOPをベースとしたフレームワークが登場する
それがSpring FrameworkやASP.NET Core
フレームワークの開発者にとってはDIやAOPは便利な道具

だけど別にDIやAOPを使わなければフレームワークが作れないわけじゃないし
ロギングやトランザクション制御ができないわけでもない
だってフレームワークはDIやAOP登場以前からあったわけだし

だけどDIがあるおかげで間接的にメリットがある・・・と思うだろ?
そうじゃない。フレームワーク開発者がロギングやトランザクション制御に
DIを使うということは、それらをカスタマイズしようと思ったら
利用者に対して、DIのやり方でやってくださいと強制してしまう
(頑張れば完全に隠蔽も可能だろうけど、そういうフレームワークは聞いたことないな)

それに対してDIを使わないフレームワークでは簡単な設定で
ロギングやトランザクション制御を変更することができる。
なぜなら複雑な仕組みになるがゆえに、フレームワーク利用者に簡単に
使ってもらうために、フレームワーク開発者が内部にうまく隠蔽しようと頑張るから

その結果、DIを使うフレームワークは、フレームワーク開発者にとては開発が楽になるのだろうが、
フレームワークの利用者にとっては面倒なDIの設定が増え、ソースコードの複雑さが増し
理解が困難になってしまう。
0347仕様書無しさん
垢版 |
2018/05/30(水) 10:19:10.43
このスレはウザいけど勉強になる良スレ
AOPってなんだよ
検索したら変なアイドル出てきたぞ!
0348仕様書無しさん
垢版 |
2018/05/30(水) 16:46:01.54
なつかしいな10年くらい前に流行ったアスペクト指向だろ
横断的関心事をコードから分離するうんぬんのやつ
0349仕様書無しさん
垢版 |
2018/05/30(水) 16:59:45.40
20年ぐらい前だと思うぞ。AspectJとかあったよな
当時から理屈はわかるがロギングぐらいしか
応用例が見つからず、今はトランザクションとか見つかってはいるが。

正直ログもトランザクションも横断的関心事ではあるんだが
単に関数呼び出しの前後に入れるだけで使いやすくなるのか?って思っていたな

ログの場合、すべての関数の前後で出したら多すぎて邪魔だし
関数の処理の途中で出したいときもあるし、
トランザクションも途中でコミットしたいときとか例外あるだろと

汎用的な仕組みがあるだけならそれでいいだろうけど、
ユースケースに応じた使いやすい仕組みを求めるなら
コールバックとかで作り込んだほうがいいだろうな
0350仕様書無しさん
垢版 |
2018/05/30(水) 17:14:16.00
つまり、アスペルガーってのは
関数の前後にhookできる機能って解釈でおけ?

便利だなーふつうにその機能欲しい
0352仕様書無しさん
垢版 |
2018/05/30(水) 17:19:40.18
アスペクトな
これ大抵の言語ではDIなんか使わずに実現できるんだけどね
0353仕様書無しさん
垢版 |
2018/05/30(水) 17:25:27.10
オブジェクト指向だって、クラス構造が言語仕様に無くても書けるだろ。実装方法が云々とかアホか。
…って、DI自体がクラスの持たせ方を実装から論じてるだけだけどな。
0354仕様書無しさん
垢版 |
2018/05/30(水) 17:25:27.61
というかDIを使わないとAOPができないっていうことは、
DIが使われない場面ではAOPできないということ

その問題を解決するために、どこでもAOPができるようにすると
DIはAOPを提供する意味はなくなる。

はずなんだが、DIなしのAOPが普及してないのは
AOPを使う機会は少ないってことなんだよね
便利だけど複雑なコードでしか実現できない言語(Java)はかわいそう
0355仕様書無しさん
垢版 |
2018/05/30(水) 17:27:46.26
結局実装ありきの技法だから、デザインパターンとかオブジェクト指向論から外れた重箱の隅の話になってるんだしな。
0356仕様書無しさん
垢版 |
2018/05/30(水) 17:39:00.28
他のデザインパターンが明確な問題があって
それを解決するためのものであるのにたいして、
DIは依存関係がコードから分離していたほうがいいだろ?
という程度で、問題がないのに、こうすべきという方針だけで
作られたものだから駄目なんだよ

解決すべき問題がないから、問題を解決することができない
それでいてコードは複雑になる

それに分離と言ったって、結局インターフェースは分離できておらず、
またインターフェースだけでは動かないので、そのオブジェクトが
正しく動くと証明するには何かしらの実装が必要になる

つまり結合した状態でないと使えないものを分離したって
意味がないんだよ。分離したままじゃ使えないものなんだから
それが問題なく動くかなんてわからないだろ?
0357仕様書無しさん
垢版 |
2018/05/30(水) 17:44:53.03
結局、else不要論とかと同じ実装上の話だから、設計側の人間にはあんまり興味を持たれないんだよな。
ここで騒ぐほどに底辺コーダーの自己紹介になるんだし。
0358仕様書無しさん
垢版 |
2018/05/30(水) 17:54:38.98
>>356
インジェクションしたら少なくとも直接書くより柔軟性生まれるじゃん?
0359仕様書無しさん
垢版 |
2018/05/30(水) 18:56:20.01
REST APIって大きな意味でオブジェクト指向な気がするけどどうなんでしょ
0360仕様書無しさん
垢版 |
2018/05/30(水) 19:23:34.11
>>358
ソースコードを複雑にしないでできるなら構わないけど、
今必要となってない柔軟性のために、
DI使うのが無意味でデメリットしかないって話をしてる
0361仕様書無しさん
垢版 |
2018/05/30(水) 19:25:07.89
>>357
それとは違う。else不要とは違って
DIは使うだけでデメリットが発生する。
そして問題が発生する前から使うものだから
多くの場合デメリットしか存在しない
0362仕様書無しさん
垢版 |
2018/05/30(水) 19:30:41.64
>>360
「いま必要となってない柔軟性」とかいってる地点でオブジェクト指向を履き違えてる。

オブジェクト指向は、将来起こりうる変更に対して柔軟に対応するために、クラスに抽出するプログラミングスタイル。

それに俺がいってるのはDIじゃなくてメインからのインジェクションの話だから!

君がはじめに言ったんだろ?DIコンテナを使わないDIはDIと呼べないってさ。
0363仕様書無しさん
垢版 |
2018/05/30(水) 19:38:21.98
>>362
> オブジェクト指向は、将来起こりうる変更に対して柔軟に対応するために、クラスに抽出するプログラミングスタイル。

どこの誰がそんなこと言ってるんだ?
0364仕様書無しさん
垢版 |
2018/05/30(水) 19:39:32.55
> それに俺がいってるのはDIじゃなくてメインからのインジェクションの話だから!
ほらね。ソースコードが複雑になってしまった
DIコンテナを使うのは、そのやり方だと複雑になりすぎるから
少しでもそれを抑えようとするからなんだよ
0366仕様書無しさん
垢版 |
2018/05/30(水) 21:23:09.64
>>365
なんで俺が思っていることを聞くのかな?
世間一般で言われてる定義じゃだめなの?
0370仕様書無しさん
垢版 |
2018/05/30(水) 21:28:56.70
>>368
そこにクラスに抽出してるじゃん

クラスに抽出するってことは、将来起こりうる変更に対して柔軟に対応するのと同じ意味、
そこには、将来起こりうる変更に対して柔軟に対応するためとは書かれてないが、
書かれて無くてもいい。だって俺がそう言ってるんだから
0371仕様書無しさん
垢版 |
2018/05/30(水) 21:29:15.45
> クラスに抽出するってことは、将来起こりうる変更に対して柔軟に対応するのと同じ意味

んなわけないw
0372仕様書無しさん
垢版 |
2018/05/30(水) 21:30:27.45
どこの誰がそんなこと言ってるんだ?

だって俺がそう言ってるんだから


なんだこの茶番
0373仕様書無しさん
垢版 |
2018/05/30(水) 21:32:49.56
つーか、オブジェクト指向の時点で
"将来起こりうる変更に対して柔軟に対応"してるんだから
そこにDIを持ち出す必要ない

DIを使わずとも
"将来起こりうる変更に対して柔軟に対応"してるんだから
DIは不要
0375仕様書無しさん
垢版 |
2018/05/30(水) 22:27:30.16
いやいや、オブジェクト指向はクラスモジュールの再利用は積極的だけど、
別に同じフレームワーク使えなんて一言も言ってないよな?
システム違うならメインから作り変えるんだから、DIはs無駄なんだよ。
0376仕様書無しさん
垢版 |
2018/06/01(金) 15:11:42.28
DI不要派はどんな物を作るケースを想定してるの?
HelloWordやfibなら、DI不要には賛成だけど
0377仕様書無しさん
垢版 |
2018/06/02(土) 11:25:59.30
マイクロサービスで作ってるけど?

DI推奨派は各々のマイクロサービスが各自で生成するインスタンスを決めるんじゃなくて
どこか一箇所にまとめておくべきって言ってるんだよね?アホすぎw
0379仕様書無しさん
垢版 |
2018/06/02(土) 12:27:31.88
>>377
お前はDIを否定するな。関係ない話だ。

DIの使えなさは、マイクロサービスとは関係ない
0380仕様書無しさん
垢版 |
2018/06/02(土) 12:29:09.06
ドカタしかいない場所でマイクロサービスとか言い出したら
嫉妬で狂いそうな子が沢山出ちゃうから止めよう
0381仕様書無しさん
垢版 |
2018/06/02(土) 12:55:59.26
>>376
どんな規模でも他プロジェクトのメインを使い回すなんて新規プロジェクトは無いだろ。
0382仕様書無しさん
垢版 |
2018/06/02(土) 14:28:41.55
>>381
今話をしてるのはmainの中のコードではなく、
(mainで書いていることにしている)
オブジェクトの依存関係の定義の話やで?

まあ「DIを採用したプロジェクト」では一般的に
mainで依存関係を定義したりしないがな。
そのDIフレームワークのやり方で定義するので

それでだ、プロジェクトの依存関係全体が全く同じになることはないが
局所的に見た場合、あるオブジェクトに対する依存関係は
だいたい同じになるわけで、オブジェクトが
使いまわしできるならば依存関係も同じになるはずだ
0383仕様書無しさん
垢版 |
2018/06/02(土) 15:01:37.12
>>382
DIじゃなければそもそも依存関係をいちいち記述し直す必要もない箇所の話?
それこそDIのメリットって何?
0384仕様書無しさん
垢版 |
2018/06/02(土) 18:29:55.55
>>381
「メインを使いまわす」の意味が分からない
具体的にどういうこと?
0385仕様書無しさん
垢版 |
2018/06/03(日) 19:23:16.35
DI使わん派ってどうやって分業してんの?
リポジトリの実装タスクが終わるまでドメインサービスの実装タスクはストップ?
0386仕様書無しさん
垢版 |
2018/06/03(日) 19:33:43.23
>>385
へ? DI使っていても、ダミーのオブジェクト作って作るんだろう?
同じやり方でいいじゃん
0387仕様書無しさん
垢版 |
2018/06/03(日) 19:44:57.83
え?
じゃあ本実装が出来上がったらダミーは用済みなの?
0388仕様書無しさん
垢版 |
2018/06/03(日) 19:49:44.31
>>387
残したければ残せば?

でもダミーオブジェクトを使ったらテストに通りますが
本実装を使ったらテストには通りません
ってことがないなら、消しても問題ないでしょ?
0389仕様書無しさん
垢版 |
2018/06/03(日) 19:52:55.19
え?
開発用サーバーが障害でたら本実装コードをダミー実装に書き換えて作業するの?
0390仕様書無しさん
垢版 |
2018/06/03(日) 19:54:52.95
>>389
そこまで馬鹿だとはw
テスト用サーバーで作業するに決まってるだろw
0391仕様書無しさん
垢版 |
2018/06/03(日) 19:56:41.92
テスト用サーバーと書いてしまったが、
開発用サーバーやステージングサーバーもありだな。
ようは本番用サーバーでやらなければいい
0392仕様書無しさん
垢版 |
2018/06/03(日) 19:59:40.51
>>390
え?
テスト用サーバーやステージングサーバーに迷惑かけるの?
ネットワーク死んだらどうするの?
遊びじゃないんだよ?
0393仕様書無しさん
垢版 |
2018/06/03(日) 20:02:15.91
ローカルにテスト用サーバーやステージングサーバー立てればいいだけだろ?
てか普段どうやって開発してるんだよw

まさか、みんなでサーバーを共有してんのか?
迷惑かけたらどうするんだよw
ネットワーク死んだらどうするの?w
0394仕様書無しさん
垢版 |
2018/06/03(日) 20:03:11.73
テスト・ステージング用サーバに繋いでデータを書き換える迷惑な人が後を絶たないから開発者を重要なサーバーから隔離するのが現代のシステム開発の定石になってる
0395仕様書無しさん
垢版 |
2018/06/03(日) 20:04:22.32
その定石だと、なにをやっても迷惑はかからない
だからDIとは関係ない話だな
0396仕様書無しさん
垢版 |
2018/06/03(日) 20:04:40.78
>>393
え?
そんなリソースの余裕あるとは限らないよ?
DI使えばサーバーもネットワークもリソースも気にしなくていいのになあ
0399仕様書無しさん
垢版 |
2018/06/03(日) 20:08:01.77
>>397
サーバー立て直せば?
っていうか、開発サーバー使わずに作っても
動くことは保証できないよ。

なぜかって?いやアホかお前
例えば開発サーバーのバージョンが変わったとき
同じように動くと思ってんの?

そう思うなら、サーバーのバージョン
気軽に上げてみやがれってんだ

実機と同じものを使わないと動くことなんて保証できないんだが
0400仕様書無しさん
垢版 |
2018/06/03(日) 20:11:40.92
ローカルサーバーを使うとなるとそこそこスペック必要だよな
派遣にはIDEとエクセルが動く最低限のスペックしか貸し出さないからローカルサーバーなんて動かせんよ
0403仕様書無しさん
垢版 |
2018/06/03(日) 20:13:39.45
>>401
DIしなくても簡単に実装を切り替えられるだろ

そういうのもわからないのは
本当に馬鹿なんだなぁって思う
0404仕様書無しさん
垢版 |
2018/06/03(日) 20:14:57.41
>>399
サーバー直すまで待ってるの?

結合テストは他にやるに決まってるでしょ?
まさか君の会社はユニットテストやったら結合テストやらんの?
それはちょっと非常識すぎないかね?
0406仕様書無しさん
垢版 |
2018/06/03(日) 20:16:18.32
実装を簡単に切り替えられるが、
それはそれとして、本番で使わないものを使ってテストしても
本番で使うもので正しく動くとは限らないぞ
0408仕様書無しさん
垢版 |
2018/06/03(日) 20:16:58.29
>>404
> サーバー直すまで待ってるの?
サーバーなんて一瞬で作れるじゃん
Dockerとか知らないの?
0410仕様書無しさん
垢版 |
2018/06/03(日) 20:19:06.11
>>406
もちろんいずれ本実装で結合したものを使ってテストを行う
でもそれまでは別に本実装で結合したまま開発する必要は全くない
本実装で結合したままだとインフラの影響を受けるから開発の邪魔になる
0411仕様書無しさん
垢版 |
2018/06/03(日) 20:20:14.17
>>410
はい、だからDI使わなくても、
それを使えばいいだけの話ですね
0412仕様書無しさん
垢版 |
2018/06/03(日) 20:21:09.96
>>408
どの現場でもDockerをインストールできると思ってるの?
開発者がDockerインストールして自由にコンテナ動かせるなんてセキュリティ意識の低いWeb系かよほど強い政治力もった開発者じゃないとね
0415仕様書無しさん
垢版 |
2018/06/03(日) 20:23:59.73
>>414
技術の問題と、お前の会社の問題を
区別してくれない?

そのうち、お前
「パソコンはウイルスに感染するから許可しませーんwww」
とか言いそうだから
0417仕様書無しさん
垢版 |
2018/06/03(日) 20:25:09.10
>>416
? DIを使って切り替えするのって、クラス名を変更するだろ?
DI使わなくても、クラス名を変更するだけだろ?
どちらも同じなんだが
0418仕様書無しさん
垢版 |
2018/06/03(日) 20:25:42.01
>>413
そう
環境は自由にならない
なので設計で対処する
そのためのDI
DI要らんとか言ってる子はいままで運が良かっただけ
0419仕様書無しさん
垢版 |
2018/06/03(日) 20:26:59.65
>>416
話をすり替えるな。

DIを使わなくても同じことはできると言ってる
DIを使ってコードを複雑にして理解を困難にしてまで
やることじゃない
0421仕様書無しさん
垢版 |
2018/06/03(日) 20:28:37.02
>>415
技術とビジネスは表裏一体
ビジネスの都合が何も無いと考えるのは子供だけ
ホビーの世界なら何の制約もなく(金という制約があるが)環境を選べるだろう
しかしビジネスの世界はそうではないのだ
0423仕様書無しさん
垢版 |
2018/06/03(日) 20:31:22.21
>>417
変えんよ?
ありがちなパターンだと環境変数とか設定ファイルをちょっと変えるだけ
それで開発用のDIとテスト用のDI、ステージング用のDI、本番用のDIが切り替わる
0424仕様書無しさん
垢版 |
2018/06/03(日) 20:31:44.48
データベースサーバー作る代わりに
データベースサーバーのモックを作るほうが
コストかかるだろw
0425仕様書無しさん
垢版 |
2018/06/03(日) 20:32:31.47
>>419
いやいや
DIを使わないとめんどくさくなるよ
君は使ったことないからわからないんでしょ?
0426仕様書無しさん
垢版 |
2018/06/03(日) 20:34:36.94
>>423
> 変えんよ?
> ありがちなパターンだと環境変数とか設定ファイルをちょっと変えるだけ

変えんよ→変えるだけ

笑うところかな?w

> それで開発用のDIとテスト用のDI、ステージング用のDI、本番用のDIが切り替わる

private hoge = is本番 ? new Hoge() : new HogeTest()

これだけの話をしていたわけねw
0427仕様書無しさん
垢版 |
2018/06/03(日) 20:37:44.68
>>422
サービス起動する方がメモリ食う

>>424
そうでもない
例えばリポジトリをサーバー用の実装からローカルSQLite用の実装に変えるのは比較的容易(設計がマトモなら)
0428仕様書無しさん
垢版 |
2018/06/03(日) 20:40:19.22
> 例えばリポジトリをサーバー用の実装からローカルSQLite用の実装に変えるのは比較的容易(設計がマトモなら)

SQLの文法違うんですが?
0429仕様書無しさん
垢版 |
2018/06/03(日) 20:44:35.13
>>426
君「クラス名変わるだろ」
僕「変わらんよ」
僕「クラス名じゃなく設定が変わるだけ」
君「クラス名変わっとるやん。笑うとこかな」どやーん

笑っちゃったごめん

>>428
今時のFWはSQL書かんし
どうしてもマニュアルで書きたい時もビルダーパターン挟むんで文法の差異は吸収されるんすわ


なんか連投規制うっといからそろそろ消えるわ
DIの炎上学習法、頑張ってや!バイバイ!
0430仕様書無しさん
垢版 |
2018/06/03(日) 20:45:46.33
>>429
・・・あぁ、設定を変えることで
使用するクラス名を変えてるってことに、
自分で気づいてないのか。
ちょっと可愛そうになった
0431仕様書無しさん
垢版 |
2018/06/03(日) 20:47:32.38
> なんか連投規制うっといからそろそろ消えるわ
それはお前が連投しているだけだろw
必死すぎの証
0432仕様書無しさん
垢版 |
2018/06/03(日) 21:05:13.76
結局またDIのメリットも言えずにトンズラか
いつものパターンだな
0433仕様書無しさん
垢版 |
2018/06/04(月) 08:54:35.06
>432
プログラマなら自分で考えろよそんくらい…

DIなんてただの道具やテクニックなんだから、適用できるケース、使いこなすための知識や技術、効果の得られる規模、そういった物がプロダクトとチームにマッチして初めて使えるわけじゃん。
自分達に必要無いならそれはそれでOK。

ただ、お前よりよっぽど頭の良いセンセイ達が、何かしらの問題を解決するために作り上げて、世界でそれなりに使われてる存在なんだから、もうちょっと謙虚に学んでみれば?
0435仕様書無しさん
垢版 |
2018/06/04(月) 09:44:58.67
つか、スタブや別クラス使ってテストするのは単体テストまでだろ?
以降は物理的もしくは論理的に隔離された完全同一環境でテストするだろ。
0436仕様書無しさん
垢版 |
2018/06/04(月) 10:21:26.15
>>433
お前まだ理解してないのか?

DIを使うとコードが複雑化する上に、DIで解決できるとされるものは
DIを使わなくても解決できるんって話なんだが
0437仕様書無しさん
垢版 |
2018/06/04(月) 10:23:27.45
それが理想だけどそうもいかない部分もあるよ
システム外に影響でちゃう所とか

他所のサービスAPIでテスト契約が限られてたり
メールやSMSが変なところに飛ばないようにしたり
帳票にサンプルマーク出るようにしたり
0438仕様書無しさん
垢版 |
2018/06/04(月) 10:44:40.32
>>436
>DIを使うとコードが複雑化する
これはわからん
もしかしてフレームワークやライブラリのコードを足してる?

>DIを使わなくても解決できる
まあわかる
江戸時代の人は新幹線使わずに京都へ行ったし
原始の人はスマホ無くても生きてけた
0439仕様書無しさん
垢版 |
2018/06/04(月) 10:49:38.15
>>438
>>DIを使わなくても解決できる
>まあわかる
>江戸時代の人は新幹線使わずに京都へ行ったし
>原始の人はスマホ無くても生きてけた

どう考えても、DIが出てきて以降の技術(Dockerとかね)に
ついてこれずに古臭いやり方に固執してるのがDI派なんだが...w
0440仕様書無しさん
垢版 |
2018/06/04(月) 10:57:55.90
DockerがDIを置き換えるってこと?
そこは勉強不足だったわ
0441仕様書無しさん
垢版 |
2018/06/04(月) 11:21:52.15
>>438
> >DIを使うとコードが複雑化する
> これはわからん

マイクロソフトがそう言っている

https://msdn.microsoft.com/ja-jp/library/ff921152.aspx

> デメリット
> 依存関係の挿入パターンには、次のようなデメリットがあります。
>
> 管理するソリューション要素が増える。
> オブジェクトを初期化する前に、依存関係の挿入フレームワークがオブジェクトに必要な依存関係を解決できることを確認する必要がある。
> ソース コードの複雑さが増し、理解が困難になる。
0442仕様書無しさん
垢版 |
2018/06/04(月) 11:24:58.79
>>440
DockerがDIを置き換えるわけじゃないぞ?
モックなどの偽物を使ってテストするということは
それで動いたとしても、それは偽物を使って正しく動くことを
証明しただけで、本物を使った場合に正しく動く証明にはならない
できる限り本物を使ってテストするのが良いということだ

特にデータベースなんかは、十分な品質の偽物を難しいので
素直に単体テストの段階から本物を使ったほうがいい
Railsなんかもそれが基本となっている
0443仕様書無しさん
垢版 |
2018/06/04(月) 11:25:33.36
あぁ、でDockerを使うのは、
その本物のデータベースサーバーなどを
すぐに用意できるって話ね
0445仕様書無しさん
垢版 |
2018/06/06(水) 11:45:24.29
DIとDockerじゃ全く関心ごとが違う。同時に使用できる

DIはアプリサービス層やドメイン層からインフラ層を分離して疎結合にする仕組み
ちゃんと契約プログラミングしてれば、アプリサービス層やドメイン層のテストには本物のDB使う必要なんか別にない

データベース使うインフラ層は本物のDB使ってテストしないといけない
テスト時だけ起動する使い捨てのDBはDocker使ったらいい
0446仕様書無しさん
垢版 |
2018/06/06(水) 13:35:43.20
> ちゃんと契約プログラミングしてれば、アプリサービス層やドメイン層のテストには本物のDB使う必要なんか別にない

それは偽物のDBが本物のDBと同じように動くことが担保できていることが条件
でないと、いくら偽物のDBを使って動くことを保証しても
本物のDBで動くことの保証にはならない

偽物のDBが本物と同じようになればいいと思うが、
そのために時間と偽物のDBのテストが必要になる
0447仕様書無しさん
垢版 |
2018/06/06(水) 13:39:51.63
ほぼ9割ぐらいはDIなんか使わないで普通のインターフェースで事足りないか
0448仕様書無しさん
垢版 |
2018/06/06(水) 13:49:38.06
そう、俺もDIなんていらないと思うんだけどね。
どうしてもDIパターンでなければだめだって思ってる人がいるようだ

挙句の果てに何でもかんでもインジェクションといって
これもDIなんだって嘘をつく
0449仕様書無しさん
垢版 |
2018/06/06(水) 14:47:59.71
DIが疎結合だって?あはは、ご冗談を。
テンプレートでも使ってどんなクラスでも取り込んじゃうならそう言ってもいいけどさ。
0450仕様書無しさん
垢版 |
2018/06/06(水) 16:45:18.94
このスレのDI否定厨は、ストラテジーパターンも意味ないと思ってる人たちなの?
0451仕様書無しさん
垢版 |
2018/06/06(水) 16:49:02.29
いらないのはDIパターンであってストラテジーではない

 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

ストラテジーパターンを使うときは、そうしなければいけないという
目的が最初にあって使うものだが、DIはその目的がない
0452仕様書無しさん
垢版 |
2018/06/06(水) 16:57:20.11
DIなんていらない。
バージョンに合わせるほうが苦労する。
プログラマなら自分で作ったほうが速い。
0456仕様書無しさん
垢版 |
2018/06/09(土) 20:11:33.47
>>455
じゃあコメント付けてください
0457仕様書無しさん
垢版 |
2018/06/10(日) 13:00:14.09
なんか400ぐらいからDIと関係ない開発環境の話が出てきてるので。

・特殊なセキュリティの案件を主体の開発会社でなければ、ローカルVMは当たり前。vagrantでもdockerでもなんでもok。そもそもセキュリティ厳しかったらネットが隔離される
・i5第3世代以降+メモリ8GB有れば十分なスペックなのにそれすら満たせない開発PCしかない会社は、根本的に開発する気がない。人を雇うよりまずPCを買い直すべき
・VMツールのインストール禁止は聞いたことがない(申請制は良くある)。セキュリティ的に考えても、オンプレ開発サーバに接続するよりミニマムだから、適切に申請すれば必ず通る。

んで、これが出来ないからDIってのはだいぶ暴論だしそもそも飛躍しすぎかな。
0458仕様書無しさん
垢版 |
2018/06/10(日) 16:59:45.80
セロリン メモリ2G 14インチデスプレー ボール型マウス
IE8 派遣社員はネット接続不可 全てのフロア、トイレの前に監視カメラ
by 金融系案件請負系の某会社
0459仕様書無しさん
垢版 |
2018/06/10(日) 22:22:01.26
金が良くなかったらPC変えられないのがわかった時点で転職活動開始だな...
0460仕様書無しさん
垢版 |
2018/06/10(日) 22:24:49.83
事務員のお姉さんが使ってるPCのほうが性能高そう
0461仕様書無しさん
垢版 |
2018/06/12(火) 19:17:39.69
Docker知ってる人殆どいなかった弊社
転職したいけどコミュ障だから面接がこわい
0462仕様書無しさん
垢版 |
2018/06/12(火) 19:31:29.25
docker for windowsきどうしたらメモリが足りないって言われた
i5, 8Gは貴族階級の戯言だわ
0465仕様書無しさん
垢版 |
2018/06/13(水) 00:19:42.09
class Foo {
private Bar b = new Bar();
public void aaa() => b.Method();
}

class Bar {
public void Method() {
if (ENV.IsDev) ...;
else ...;
}
}

使う側は何も考えずnewすりゃいい
実装を切り替えたければ使われる側が透過的に対応すればいいだけ
interfaceもDIも不要
0466仕様書無しさん
垢版 |
2018/06/13(水) 02:36:05.36
流石に通常のコードとdebug用コードが高頻度に混在してたら消せよバカって思いたくなるし、
根本的にモックと差し替えるのを素直に表現できん
0467仕様書無しさん
垢版 |
2018/06/13(水) 09:44:30.92
某メーカーの仕事した事あるけど、歴代の機種の差分が全部#ifdefで括られてたぞ。
実コード半分以下の超大作が何本も…。
0468仕様書無しさん
垢版 |
2018/06/13(水) 14:46:29.20
>>467
その話の結論は、機種ごとにファイルに分けろで終わるので
ぶっちゃけどうでもいい
0469仕様書無しさん
垢版 |
2018/06/13(水) 15:02:47.66
>>466
ここで書くことじゃないけど
デバッグコードとログコードの違いを知らないやつが多いんですわ
まあ、ログ機能をデバッグに使えてしまうし、
ログレベルにdebugとかあるから勘違いしやすいんですが

デバッグコードっていうのは開発時のデバッグに
一時的に入れて最終的には消すもの。だから最終的残ってるのはおかしい

ログっていうのは製品版でもそのまま使われるコードで機能の一つ
適当に入れるものじゃないし、これはコードと混在させるしかない
混在させると言っても、 log(ERROR, 'メッセージ'); みたいな感じで一行になってる
if(DEBUG_MODE) printf('メッセージ')みたいな条件文があったらおかしい

ちなみにDIを使えばログを入れられると思うかもしれないが、
インターフェースの関数呼び出しのログしか出力できない
コードの途中のログは出せないし、ログレベルごとに出力内容を
変えるときには使えない(複雑になりすぎる)
本質的にはログはモジュールの機能の一つなのでDIで入れるべきものではないんだ

かといってデバッグのために使えるかと言うと・・・
素直にデバッガの関数呼び出しのトレース機能を使ったほうが良いかな
0470仕様書無しさん
垢版 |
2018/06/13(水) 17:54:33.97
Logじゃなくてグローバルイベントにして
依存してないものをもたせちゃだめh
0471仕様書無しさん
垢版 |
2018/06/13(水) 18:10:51.58
そうするとグローバルイベントを発生させる
オブジェクトに依存するんだけどなw

Logger.log(ERROR, 'メッセージ');



Event.raise('log', ERROR, 'メッセージ');

になるだけというw
0472仕様書無しさん
垢版 |
2018/06/13(水) 18:16:25.83
JavaScriptだとconsole.logがどこからでも使えるように、
ログ出力機能っていうのは、言語の基本ライブラリ
(デフォルトでimportされるライブラリ)
として使えるべきなんだよな

そうなってないからDIでインジェクションとかするはめになる
0473仕様書無しさん
垢版 |
2018/06/13(水) 19:20:16.77
ログに関しては収集解析するサービスもセットだよね
なのでメインの開発者と実行時にできるだけ負荷かからないシンプルな構成でいい
となるとインジェクションは選択肢から消える
0474仕様書無しさん
垢版 |
2018/06/13(水) 20:03:54.18
>>468
そんな事したら似たようなソースファイルが沢山出来て管理出来なくなるじゃん。
0475仕様書無しさん
垢版 |
2018/06/13(水) 20:40:40.11
>>474
同じところがあるならまとめればいい
違う所だけ抜き出してファイルに分けろと
0476仕様書無しさん
垢版 |
2018/06/17(日) 16:16:58.19
国内のシステムはオブジェクト指向もDIもいらない
オブジェクト指向とDIは画面とエンティティとテーブルに綺麗な対応関係があるって前提からスタートしてるから現実の世界では役に立たない
非正規型のデータウェアハウスみたいなDB、あらゆるところからあらゆるデータにアクセスする複雑怪奇なな業務ルール、多数のエンティティをバラバラに引き裂いて混ぜ合わせたようなぐちゃぐちゃな画面要求
こういうシステムは人海戦術で複雑なSQLとhtmlを書きまくってダイレクトに結合させるほうがうまくいく
0477仕様書無しさん
垢版 |
2018/06/17(日) 16:20:20.28
それ、階層足りないだけで、きちんと集約されてないから複雑に見えるだけなんだけどな。
要するに分析が出来て無いだけ。設計が手抜きって事。
0478仕様書無しさん
垢版 |
2018/06/17(日) 17:19:54.26
>>477
〜設定してるときに〜見たいじゃんって要求が必ずしも綺麗に行くとは思えない
え?でもその可能性を考慮しちゃうと
すべてのデータがすべてのデータにアクセスできる必要があっちゃわない?
ってとこまで行く経験は俺はよくあるけどね

〜を触ってるときに〜を知る必要はない
って思い込みで設計をしたところから地獄が始まる
せめてその意図を同時に記述しておき
それが崩れたときはすべての隠蔽コードを破棄するべき
0480仕様書無しさん
垢版 |
2018/06/17(日) 18:01:09.78
業務系のユーザーは欲張りだからね
要望を聞くと「1画面にあらゆるものをしこたま詰め込んでカオス化させること」が要件になってしまう
シンプルな画面を沢山つくるんじゃ「画面遷移が多くて生産性が上がらない」ってクレームがついて前述の要件を満たせなくなる
0481仕様書無しさん
垢版 |
2018/06/17(日) 18:39:59.54
まあ、別アプリ組み合わせてオペレーターに作業させればいいだけだったりするよな。
0482仕様書無しさん
垢版 |
2018/06/17(日) 23:52:27.35
>>480
そりゃそうでしょ
毎日同じ画面と向き合って入力するのに、何回も何回も画面遷移したい?
0483仕様書無しさん
垢版 |
2018/06/18(月) 00:47:34.09
>>482
俺がどう思うかは興味ない
客が巨大な神画面を要求するという事実が重要
神画面が要件に入るとオブジェクト指向もDIもまともに機能しなくなる
高尚な理論を説いても現実の世界では使い物にならない
0484仕様書無しさん
垢版 |
2018/06/18(月) 02:20:07.14
>>482
そこに関しちゃそうだな
どっちかというと、ユーザーの要望と要件は1/3ぐらい真の要件や最適解とは程遠いので、そこを整理せずに設計するとカオスになるんだと思うよ
0485仕様書無しさん
垢版 |
2018/06/18(月) 07:14:41.26
>>476
>オブジェクト指向とDIは画面とエンティティとテーブルに綺麗な対応関係があるって前提からスタートしてるから

どのオブジェクト指向がそんなことを前提にしてるって?
OOA/OODのことか?OOPとは別の話だろ。
DIは完全にOOP側の要素だし。

OOA/OODやDIを否定して勢い余ってOOPまで否定するのは感心せんな。
0486仕様書無しさん
垢版 |
2018/06/18(月) 07:17:19.27
>>483
お前に技術力がないだけでは?

もともと画面(View)はモデルとは分離して作る
コントローラー側で複数のモデルにたいしてデータを作成するだけ

お前が、画面をもとにモデルを設計してるからそうなるんだよ。
というか設計してない。単に画面をそのままコードに変換してるだけ
0491仕様書無しさん
垢版 |
2018/06/18(月) 08:34:56.58
>>488
そら設計できないお前にとってはありとあらゆる設計手法が机上の空論やろw
0492仕様書無しさん
垢版 |
2018/06/18(月) 12:44:38.66
>>486
じゃ、データがリアルタイムで更新されるとして
そこに表示されるコンボボックスの要素もリアルタイムで更新されるとしたとき
どんな設計するん?
モデルとビューは関係ないとかキチガイ発言繰り返すのん?
0493仕様書無しさん
垢版 |
2018/06/18(月) 14:26:26.57
>>492
なにその初歩的なお題
そんなところで躓いてる奴が「机上の空論」ってドヤってんのか

そうやって煽ってアドバイスをもらおうとするのやめた方がいいよ初心者さん
0494仕様書無しさん
垢版 |
2018/06/18(月) 18:51:47.24
>>493
でも解決方法はこんな簡単な問題でもビューとモデルを包括した仕様の変更しか無いよね?
この程度で限界が来ちゃう理論を大事に守ってるのってなんか意味あるの?
0495仕様書無しさん
垢版 |
2018/06/18(月) 19:19:16.24
>>492
MVVMという言葉で調べておいで。
本当に能力不足だったようだw
0496仕様書無しさん
垢版 |
2018/06/18(月) 19:20:08.86
>>494
この程度で、自分の限界が来ちゃってるのねw
お前、この業界にいる意味あるの?
0497仕様書無しさん
垢版 |
2018/06/18(月) 20:18:43.80
画面を区分けしてそれぞれにViewとModelを割り当てる
画面全体は各Viewを取りまとめたり、相互作用を仲介したりする
0498仕様書無しさん
垢版 |
2018/06/18(月) 20:40:04.70
>>496
え?このままじゃどうにもならないでしょ?
頭悪いの?
コンボボックスで選択してる間に選択項目消えちゃうって言ってるんだよ
0500仕様書無しさん
垢版 |
2018/06/18(月) 23:28:53.37
>>498
選んでる最中に消えるからどうにもならないって?
どうするか決めろのが設計だろアホw
0501仕様書無しさん
垢版 |
2018/06/18(月) 23:40:21.48
この分じゃ楽観的ロックも知らんのやろうな

こいつが問題にしているのは

コンボボックスの中身を更新するために全部消してリセットしたら
選択位置がリセットされちゃうんです。
え?全部消すんじゃなくて変わった部分のみを変更すればいいって?
そんなのどうやるんですか?そんなコード会社で見たことないです!

程度の話だろw
0505仕様書無しさん
垢版 |
2018/06/19(火) 07:18:28.77
全部消えちゃった時どうすればいいかわかんないんです。
0507仕様書無しさん
垢版 |
2018/06/19(火) 07:26:00.21
仕様がないんです。会社のコード見てもよくわかんないんです。
どうしたら良いんでしょうか?誰か教えてください。
0512仕様書無しさん
垢版 |
2018/06/19(火) 17:15:37.12
ビューとモデルが分離されてると
使いやすいUIに変更するときも便利
良いことならたくさんあるよ
0515仕様書無しさん
垢版 |
2018/06/19(火) 17:43:58.81
逆にビューとモデルを分離せずにいいことあったかどうかを聞きたいね
別にシンプルになるわけでもないし
0516仕様書無しさん
垢版 |
2018/06/19(火) 17:52:42.07
やたらめったら抽象化された7個のインターフェース、13個のクラス
オープンソースライブラリ使いまくりのゴミコンソールアプリを作ってるバカな同僚がいたから
同じことをする10行ぐらいのスクリプトを書いてやったら急に怒り出した
DI厨ヤバすぎ
0518仕様書無しさん
垢版 |
2018/06/19(火) 19:24:17.79
>>517
めちゃあるよ
DIするとバカみたいにクラスやインターフェースが増えて大したことしてないのにメンテナンスコストが増える
0520仕様書無しさん
垢版 |
2018/06/19(火) 19:50:15.21
DIを使うとコードが1割、2割は確実に増える
経験的に最悪で2倍ぐらいかな
0521仕様書無しさん
垢版 |
2018/06/19(火) 19:53:29.08
DIのデメリットはコードが増えると言うよりも
価値がないコードができるということ
0524仕様書無しさん
垢版 |
2018/06/19(火) 20:02:42.71
シェルのパイプラインでサクサクつなげて30秒で入力おわり即実行みたいな処理も
JavaやC#でDIを使うとサブプロセスをインターフェースで隠蔽してインジェクト、
データベースもインジェクト、Webアクセスもインジェクト、設定ファイル読むのもインジェクト
って具合にアホみたいに大量のクラスとインターフェースが作られる
ビルドも遅いしコンテナサービスセットアップしてクラス全部登録すんのも超めんどくさい
0525仕様書無しさん
垢版 |
2018/06/19(火) 20:03:46.05
>>523
だから俺は価値がないDIを使わないって。
DIは特になにか必要になってるわけじゃないのに
こんなふうに(冗長に)書け。そうすれば
そのうち役に立つかもしれないって押し付けるパターンだからね
0528仕様書無しさん
垢版 |
2018/06/21(木) 22:54:49.91
>>524
それで済む程度の処理にDIなんか使うわけないじゃん
「同僚」とやらが実在するなら注意してあげな
0529仕様書無しさん
垢版 |
2018/06/21(木) 23:06:29.63
そのとおり
DIなんて使うわけないんだよ普通はね
0531仕様書無しさん
垢版 |
2018/06/22(金) 06:38:06.50
ではどういうときに必要になるかと言うと、
その具体例はでてこないという
だって、必要だからDIを使うのではなく
とりあえずDIを使っとけになってるから
0534仕様書無しさん
垢版 |
2018/06/22(金) 08:42:43.84
しょぼい案件で工数がそれほど見込めない時に水増しする為に無駄な実装でかさ上げするのに有効。
0537仕様書無しさん
垢版 |
2018/06/23(土) 09:39:53.14
DIは最高すぎるけどなぁ
本当に同じものについて語ってるのだろうか
0539仕様書無しさん
垢版 |
2018/06/23(土) 11:07:26.10
300行で書けるスクリプトがJavaとDIのせいで2000行ぐらいに膨れ上がった
ほんと害悪なんだが
0542仕様書無しさん
垢版 |
2018/06/23(土) 13:43:59.61
ドカタがドカタ言語で書くとDIは冗長になるのは分かるよ?
でもそれはドカタが悪いのであってDIの所為じゃない
こっちはDI使ってシンプルで読みやすく保守しやすいコードが書けるんだから寄ってくんな
0544仕様書無しさん
垢版 |
2018/06/23(土) 13:54:28.72
というかjavaやc#がうんこだからDIで安全マージンとりながらやらなければならない
スクリプトだったらそんなん要らん
0547仕様書無しさん
垢版 |
2018/06/23(土) 14:58:12.71
>>542
> ドカタがドカタ言語で書くとDIは冗長になるのは分かるよ?
俺はわかんないよ

なんで、ドカタがドカタ言語で書くとDIは冗長になるのか
説明してくれよ
0549仕様書無しさん
垢版 |
2018/06/23(土) 16:25:52.61
DIで冗長になる前提で話してるのが意味不明
冗長になるって言うならコード書いてみてよ
0550仕様書無しさん
垢版 |
2018/06/23(土) 16:29:22.88
ドカタがドカタ言語でどんなコード書くのか興味深い
0552仕様書無しさん
垢版 |
2018/06/23(土) 17:07:44.52
じゃあお題

$app = New-Object -ComObject Excel.Application
$app.DisplayAlerts = $false
$app.Visible = $false
Remove-Item ./* -Recurse
git clone $env.REPO_URL
Get-ChildItem ./spread/*.xlsx | foreach {
$book = $app.Workbooks.Open($_.FullName)
$sheet = $app.Worksheets("datasheet")
[pscustomobject]@{
Foo = $sheet.Range("A1").Text
Bar = $sheet.Range("D5").Text
Baz = $sheet.Range("G2").Text
}
$.Close($false)
} | where { $_.Foo -ne "xxx" } | foreach {
$cmd = "insert into XlsxImp (foo,bar,baz) values ('$($_.Foo)', '$($_.Bar)', '$($_.Baz)');"
$cmd | sqlplus -s -l $env.DB_CONN_STR as sysdba
}
$app.Quit()

JavaとDIを使うとどうなる?
0554仕様書無しさん
垢版 |
2018/06/23(土) 18:34:11.17
ドカタはexcel使う必要あるんだね
成る程ドカタだわ
0555仕様書無しさん
垢版 |
2018/06/23(土) 19:14:20.37
ほらみたことか
DIじゃろくな事にならないからって無様な捨ぜりふ吐いて逃げるんだもんなぁ
普段偉そうなこと言ってるわりにこれだもん
DI厨の限界見えたわ
0556仕様書無しさん
垢版 |
2018/06/23(土) 19:32:29.71
処理の概要とideone.comなどコードが見易い所にあげるぐらいの気遣いは欲しいな

色んな依存はある気がするが処理がこれしかないならこのままでいいんじゃね?
0557仕様書無しさん
垢版 |
2018/06/23(土) 19:36:15.29
DI厨「DIの不利を悟ったから関係ないこと言ってお茶を濁そう」
0558仕様書無しさん
垢版 |
2018/06/23(土) 19:41:55.71
全体で20行ぐらいのコードしかないのに
DIする奴いるの?
0559仕様書無しさん
垢版 |
2018/06/23(土) 19:44:18.96
アンチDIって、DIやってる人がいつでもどこでもDIやってると思ってるんだろうか
0561仕様書無しさん
垢版 |
2018/06/23(土) 19:50:03.16
Mochなどと同じで汎用性が欲しい時、テストとかしやすくしたいときに使おうってだけの話だよね
0562仕様書無しさん
垢版 |
2018/06/23(土) 19:51:43.39
>>561
またテストか。DIはテストだけのものじゃないって言ってるだろ
0563仕様書無しさん
垢版 |
2018/06/23(土) 19:54:55.70
クッソ笑える
DI厨全滅かよwww
なーにが「い、いつもDIするわけじゃねーし」(ふるえ声)
だよwwwww
0565仕様書無しさん
垢版 |
2018/06/23(土) 19:58:43.75
じゃあJavaとDIでシステム組んで最後の1つの機能が>>552で、これ移植したら円満にプロジェクト終了って時はどうすんの?
そうなってもいつもDIするわけじゃねーし、だの、1つくらいDIじゃなくても問題ないなんつって逃げそうだよなお前らw
0566仕様書無しさん
垢版 |
2018/06/23(土) 20:07:51.84
>>564
適材適所がわからないんだな
スクリプトでやるようなことをDI使ってやれって、頭沸いてんのか?
0567仕様書無しさん
垢版 |
2018/06/23(土) 20:15:23.96
>>566
やっぱり言い訳するんだ
99%Javaで美しいDIで一生懸命組み上げたシステムの最後のピースがやっつけのスクリプトってさぁ
やれやれだよホント
0570仕様書無しさん
垢版 |
2018/06/23(土) 20:23:34.02
まったくだ
JavaもDIも役立たずのゴミ
スクリプトを書いたほうが短く簡潔で保守性も高まる
0571仕様書無しさん
垢版 |
2018/06/23(土) 20:29:07.45
全ての規模をスクリプトで書くのか
まあがんばれ
0572仕様書無しさん
垢版 |
2018/06/23(土) 20:32:13.56
>>571
少なくともここにいるDI厨はスクリプトでやるらしいぞ
大規模システムの一部という前提を与えてやってもDIでやる場面じゃないだのなんだのと言い訳してDIを拒む
じゃあもうどこでDIすんだって話だよ
0575仕様書無しさん
垢版 |
2018/06/23(土) 20:41:56.64
おうおう
出るわ出るわ負け惜しみ
ここでサクッとJavaのDI使ったコードを書いて黙らせるぐらいのことできんのかねぇ
0580仕様書無しさん
垢版 |
2018/06/23(土) 21:08:21.11
Javaで作るような大規模システムをサクッと書いてよ
0581仕様書無しさん
垢版 |
2018/06/23(土) 21:33:48.06
エクセルの内容をノールックでDBに入れるだけの簡単なお仕事
0583仕様書無しさん
垢版 |
2018/06/23(土) 21:53:04.63
書き直す気力も起きない程の圧倒的ドカタコードを提示する事で
相手のヤル気を削ぐ作戦に出るとは恐れ入った
0587仕様書無しさん
垢版 |
2018/06/23(土) 22:00:27.65
DIは百害あって一利なし
利用者もゼロ
これが現実
0593仕様書無しさん
垢版 |
2018/06/23(土) 22:03:11.72
>>589
できるが無駄が多すぎと言ってる
そもそも出来ない君たちとは違うんだな
0596仕様書無しさん
垢版 |
2018/06/23(土) 22:04:19.06
>>591
そうやって悪口言うしか出来ないんだね
完全敗北ってやつだよソレ
0599仕様書無しさん
垢版 |
2018/06/23(土) 22:05:39.48
>>592
みた結果がこれだよ

>>594
普段からDI推奨してるこのスレの住民ですらお題を出したらまったくDIを使わないということが明るみに出てしまった
0600仕様書無しさん
垢版 |
2018/06/23(土) 22:06:37.64
>>597
ほらまた言った
負け惜しみの悪口はやめて素直に参りましたって言えば良いのの
0604仕様書無しさん
垢版 |
2018/06/23(土) 22:09:16.56
プログラマならコードで語れ
DI派はDI使ったコードを書いてようやっと議論のスタートラインに立てる
でも何を言われても書かこうとしない
負けを認めてんだよ内心ではね
でも悔しいから負けたという事実は言葉にはせず悪口に逃げるんだ
0605仕様書無しさん
垢版 |
2018/06/23(土) 22:10:17.96
>>603
君がお題に対してDIを使ったコードを書いたら1にカウントしてやるよ
0607仕様書無しさん
垢版 |
2018/06/23(土) 22:11:25.14
業務用のコードこんなところで晒して勝った気になるのはまずくないか?
0614仕様書無しさん
垢版 |
2018/06/23(土) 22:21:34.31
そもそもオブジェクト指向もDIも大規模開発の複雑さに立ち向かうための手法なのに、それを理解してない奴が
1ファイルのスクリプトを例に出して、ほらDIなんていらない、とかドヤってんだよなww
0617仕様書無しさん
垢版 |
2018/06/23(土) 22:29:44.72
>>614
雑魚の理論
小さいまとまりの集まりで大きなものを作るんだ
大きくなると造りを変えないといけないんんてのは多分何も作れてないんだそいつ
0619仕様書無しさん
垢版 |
2018/06/24(日) 02:37:42.98
>>552
このくらいの規模だとDIに限らず
関数もクラスもモジュールもクロージャも要らないけど
だからって大きなプログラムで不要な事にはならないよね?

いや、もしかしたらドカタはmain関数で全てやりくりするから不要なのかな?w
0620仕様書無しさん
垢版 |
2018/06/24(日) 02:41:43.67
>>619
もしかして、クラスに分ける=DIを使うと思ってる?
ならアホだよ。

main関数ですべてやりくりするわけ無いじゃん。
DIは使わずにクラスに分けるだけ

はぁ。そんなこともわからんのかね
0621仕様書無しさん
垢版 |
2018/06/24(日) 02:49:59.29
>>552にDIが不要だからって、常にDIが不要な事を示せてないって言ってるだけなんだけど
>>620には理解できなかったみたいだねw
流石ドカタやってるだけあるわ
0622仕様書無しさん
垢版 |
2018/06/24(日) 02:54:53.60

お前はDIがいると言ってる。
俺はいらないと言ってる。

で?お前はDIがいると言うだけ?
理由は? お前がDIがいると言ってることなんて
最初からわかってるんだよ。理由を言え
0623仕様書無しさん
垢版 |
2018/06/24(日) 03:00:39.24
俺にはDIはいるけどお前のようなドカタには不要だよ
だから意見は一致している
ドカタはドカタとして生きていけ
0626仕様書無しさん
垢版 |
2018/06/24(日) 07:50:21.99
スクリプト厨「DIが優れてるというなら>>552をDI使って書き直してみろ」

DI厨「いつでもDIするわけじゃない。この程度ならDIは不要」

スクリプト厨「じゃあこの処理が大規模システムの一部だったらと仮定しよう。他の99%の機能はDIで作られてるので、アーキテクチャの一貫性のためにこの機能もDIで実装しなきゃならないよね」

DI厨「罵詈雑言。罵詈雑言。罵詈雑言」

これじゃあどう見てもDI厨の負けだぞ
お前ら普段からDIなんて使ってないんだろ?
0629仕様書無しさん
垢版 |
2018/06/24(日) 09:24:12.28
>>552をクラスには分けないんでしょ?
なんでDIだけ入れろというの?
0630仕様書無しさん
垢版 |
2018/06/24(日) 10:32:58.22
>>629
分けたいなら分ければ?
DIに必要なことならなんでもやっていいよ
まっ無駄な工数だけどDIには必要なんだろ
0631仕様書無しさん
垢版 |
2018/06/24(日) 10:53:08.78
依存オブジェクトの固定化をやめるだけで盛り上がってるな
0632仕様書無しさん
垢版 |
2018/06/24(日) 11:01:23.65
>>630
20行のコードを
クラスに分ける必要ないし
DIにする必要もない
でもだからと言ってクラスもDIも不要にはならない
0634仕様書無しさん
垢版 |
2018/06/24(日) 11:16:56.77
>>633
ドカタ「じゃあこの処理が大規模システムの一部だったらと仮定しよう。
他の99%の機能は関数で作られてるので、アーキテクチャの一貫性のために
この機能も関数で実装しなきゃならないよね」
0636仕様書無しさん
垢版 |
2018/06/24(日) 11:32:08.03
DIするとテストが簡単になるらしい。
なら>>552のコードをテストしていただきたい
それでDIの真価が発揮されるのだろう?
0637仕様書無しさん
垢版 |
2018/06/24(日) 11:39:02.13
$app = New-Object -ComObject Excel.Application

お前はCOMのインターフェースを実装したオブジェクトをインジェクションしている
0638仕様書無しさん
垢版 |
2018/06/24(日) 11:51:50.39
>>637
じゃあそれをインジェクションしないコードに書き換えてみてよ


できないでしょ?w
なんでもかんでもインジェクションといってるから
恥をかくんだよ。
0639仕様書無しさん
垢版 |
2018/06/24(日) 11:52:26.90
DI厨ってさ遊び半分なんだよね
論理的にDIが綺麗だってのはわかるよ
でも現実の仕事じゃコードを冗長でわかりにくくしてるだけ
テストもモック書くのがめんどくさいし
工数を数倍に膨らませてまでやるこっちゃない
0641仕様書無しさん
垢版 |
2018/06/24(日) 12:03:38.61
>>640
実装に依存した考え方しかできないなら
ドカタと言われてもしょうがないね
0642仕様書無しさん
垢版 |
2018/06/24(日) 12:05:39.60
DIはいらない。COMで全部作れば
インジェクションになるからだ

誰だ?  DIとはオブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン
というやつは?
俺は認めないぞ!

俺の考えるDIこそが世界唯一のDIなんだ!
0643仕様書無しさん
垢版 |
2018/06/24(日) 12:07:55.57
という茶番からもわかるように、

依存関係を"ひとまとめに"定義する部分と、それを利用するために
オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン
でないものはDIではないのです。
DIではないのだからインジェクションと読んではいけません
0645仕様書無しさん
垢版 |
2018/06/24(日) 12:17:59.88
適切なデザインパターンを適用すればいいだけでは?

つまり依存関係をひとまとめに定義なんかする必要はないということ
それはDIではないということを意味する
0649仕様書無しさん
垢版 |
2018/06/24(日) 13:03:23.73
>>646
ほとんど切り離し不可能
COMは実装ありきのインターフェースだから複雑すぎるんだよ
0651仕様書無しさん
垢版 |
2018/06/24(日) 14:43:53.04
interface IExcelFileProvider {
IEnumerable<FileInfo> GetExcelFiles();
}

class GitExcelFileProvider {
private GitExcelFileProviderOptions Options { get; }
public GitExcelFileProvider(IOptions<GitExcelFileProviderOptions> options) {
Options = options.Value;
}
public IEnumerable<FileInfo> GetExcelFiles() {
if (Directory.Exists(Options.LocalRepo)) Directory.Delete(Options.LocalRepo, true);
Directory.Create(Options.LocalRepo);
var spi = new StartProcessInfo("git", $"clone {Options.RemoteRepo}");
spi.WorkingDirectory = Options.LocalRepo;
var proc = Process.Start(spi);
proc.WaitForExit();
var spreaddir = Path.Combine(Options.LocalRepo, "spread");
return Directory.GetFiles(spreaddir, "*.xlsx");
}

Gitの処理だけで力尽きたわ
DIってバカバカしいなぁ
Javaだとさらに長くなるんだろこれ
0652仕様書無しさん
垢版 |
2018/06/24(日) 15:51:30.46
何でもインラインで空行も入れないから見にくくてしかたないな
0655仕様書無しさん
垢版 |
2018/06/24(日) 16:19:03.87
こんな汚いコード書く奴がDIの可読性うんぬん言ってんだから滑稽だわ
0656仕様書無しさん
垢版 |
2018/06/24(日) 16:23:27.70
威勢のいいことを言うけど綺麗なDIコードは書けない
それがDI厨なんだなぁ
プログラマならコードで語りなよ
ほんと情けないよDI厨
0658仕様書無しさん
垢版 |
2018/06/24(日) 16:30:08.44
むしろ打ちのめされて元気ないように見えるDI信者さんたち
0660仕様書無しさん
垢版 |
2018/06/24(日) 16:37:23.63
そっか
負けっぱなしじゃツマラナイもんな
飽きてもしゃあない
0664仕様書無しさん
垢版 |
2018/06/24(日) 20:52:07.62
ここまでのやり取りで、ドカタはエンジニア様がDI使って作ったものを
10行程度のスクリプトで利用するだけだって分かったね
良かったよかった
0665仕様書無しさん
垢版 |
2018/06/24(日) 21:25:09.37
ドカタが10行程度のスクリプトでできる事をDI厨はできなかったという事だよ
0666仕様書無しさん
垢版 |
2018/06/24(日) 21:27:30.26
ドカタ「じゃあこの処理が大規模システムの一部だったらと仮定しよう。
他の99%の機能はクラスで作られてるので、アーキテクチャの一貫性のために
この機能もクラスで実装しなきゃならないよね」
0667仕様書無しさん
垢版 |
2018/06/24(日) 21:29:48.89
>>666
なんでもかんでもDIすりゃいいってもんじゃない
99%DIだろうとこの程度のスクリプトにはDIは使わん
サブプロセス呼び出しで十分
0668仕様書無しさん
垢版 |
2018/06/24(日) 22:51:07.15
>>552もよく見りゃDBの接続を環境変数に外出ししてるな

こういった処理が数100もあって、例えば対象のフォルダ、シート名、セル参照、テーブル名といったものが微妙に違った時に、否定派はその都度書くのだろうか?
0669仕様書無しさん
垢版 |
2018/06/24(日) 22:58:23.13
微妙に違うならパタメタライズすればいいだけだよ?
むしろそういうのはDIのほうが苦手
DIはどちらかというと特化する方向に作りこんでいくからな
リポジトリなんてほとんどテーブルと1:1だろ?
テーブルが100個あったらインターフェースとクラスとエンティティが100個ずつできる
スクリプトならパラメータ化したやつ1個で十分
0670仕様書無しさん
垢版 |
2018/06/24(日) 23:01:59.04
シート名やセル参照も同じ
DIだと神エクセルのパターンごとに読み取りクラスを作る
神エクセルの種類が100パターンあったら読み取りクラスも100種類
バカバカしいよほんと
スクリプトならシート名とセルアドレス、プロパティのマッピング定義を指定するだけでOKな関数を1つ書くだけなのにな
0671仕様書無しさん
垢版 |
2018/06/24(日) 23:08:22.10
思い込みが強くて応用の効かない阿玉の固い人間というのは良くわかった
0674仕様書無しさん
垢版 |
2018/06/25(月) 00:17:07.79
DIはクラス間の依存関係を解決するためのもので、
設定ファイルから設定値を読み込むのはDIじゃない
0675仕様書無しさん
垢版 |
2018/06/25(月) 07:33:14.28
設定値の読み込みはインフラに依存するのでDIしないとだめだよ
0676仕様書無しさん
垢版 |
2018/06/25(月) 07:59:06.06
なんでもDIでやるからほら変な癖がついてる
DIでやる必要のないものまでDIでやってる
設定の読み込みはDIとは無関係
0677仕様書無しさん
垢版 |
2018/06/25(月) 09:50:30.59
設定をコードに散らばらせずに一箇所にまとめるメリットは分かるのに
クラスの依存関係をコードに散らばらせずに一箇所にまとめるメリットは分からないの?
0678仕様書無しさん
垢版 |
2018/06/25(月) 09:58:08.32
設定だから一箇所にまとめることにメリットあるわけで、
設定じゃないものは、一箇所にまとめるメリットないぞ?
すべての処理を一箇所にまとめたらデメリットだってわかるだろ?

一箇所にまとめる = メリットなんじゃなくて
設定を一箇所にまとめる = メリットなんだよ
0680仕様書無しさん
垢版 |
2018/06/25(月) 10:52:37.67
「設定」は一箇所だろではなく
「シングルトン」は一箇所だろに
話が変わっているところに注意

今話をしているのは「設定」だから
一箇所にすることにメリットが有るという話で
設定じゃないもの(クラスやシングルトン)は
一箇所にしたところでメリットはない
0681仕様書無しさん
垢版 |
2018/06/25(月) 10:57:10.70
データベースも最終的に呼び出す場所は1箇所だけどな。
0683仕様書無しさん
垢版 |
2018/06/25(月) 11:02:48.36
なるほど、設定だから、一箇所にまとめるわけですね。
設定じゃないものは、まとめないしDIを使う必要もないと
0684仕様書無しさん
垢版 |
2018/06/25(月) 11:06:14.17
DI厨の基本能力が低すぎる。
すぐ矛盾点が露呈するし
言ってることの辻褄が合ってない

たぶんなにも考えずいわれるがまま
DIを使ってるんだろうな
0686仕様書無しさん
垢版 |
2018/06/25(月) 11:31:11.55
>>678
>すべての処理を一箇所にまとめたらデメリットだってわかるだろ?

クラスの依存関係は処理じゃない
一種の設定です
0687仕様書無しさん
垢版 |
2018/06/25(月) 11:32:34.93
クラスの依存関係は、アプリの利用者が
変更するものではないので設定ではありません
0688仕様書無しさん
垢版 |
2018/06/25(月) 11:35:01.56
えっ?
じゃあ定数とか設定に追い出さないで
全部コードにマジックナンバー埋め込むってこと?
DI否定厨は凄いなぁw
0689仕様書無しさん
垢版 |
2018/06/25(月) 11:37:12.61
>>688
マジックナンバーは定数にはしますが
設定にはしませんよw

定数と設定を並べて書いても、
私は引っかかりませんwww
0690仕様書無しさん
垢版 |
2018/06/25(月) 11:42:14.37
またDI厨の行き当たりばったり感あふれるレスが
一瞬で潰されたのかw
0691仕様書無しさん
垢版 |
2018/06/25(月) 11:48:36.29
いや、お前が定数を設定を呼ぼうが何と呼ぼうが勝手だが
定数は一箇所にまとめるだろ?メリットあるだろ?
DIも一緒だからね
言葉遊びで逃げないで、このメリット否定してみてよ
0692仕様書無しさん
垢版 |
2018/06/25(月) 11:57:03.79
設定は一箇所にまとめる。そんだけ
設定じゃないもの話を持ってくるな
連想ゲームやってるんじゃねーんだ
0693仕様書無しさん
垢版 |
2018/06/25(月) 11:57:39.62
> 定数は一箇所にまとめるだろ
普通モジュールごとに定義する場所を分けるわなw
0694仕様書無しさん
垢版 |
2018/06/25(月) 12:04:07.32
じゃあ定数をモジュール別にわけるメリットを言ってみろよ!


という感じで、なし崩し的に、
わけたほうが良いという話題に持っていきません?w
0695仕様書無しさん
垢版 |
2018/06/25(月) 12:12:04.12
夢見がちな設定まとめ厨には残念なお知らせだが、現実の世界では設定は一箇所にはまとめんよ
クラウド、データベース、レジストリ、ローカルファイル、定数クラス、エントリーポイント、、、
目的や要件によってどこに設定を置くべきかは変わってくるし、置き場によって取得方法は異なる
でも設定を利用する側のクラスは設定値だけが欲しいのであって、設定がどこにあるか、どうやってとってくるのかは意識したくない
なので設定読み取りをクラスにしてインジェクションするんだよ
設定読み込みにDIは必須と言える
DIは素晴らしい!最高だ!
0696仕様書無しさん
垢版 |
2018/06/25(月) 12:13:12.86
ということで、設定でも
まとめたりしないということで、
DI厨はピンチに陥りましたw
0697仕様書無しさん
垢版 |
2018/06/25(月) 12:16:48.19
common.Constantsスタティッククラスに定数を一生懸命集める香具師、オブジェクト指向全くわかってない
0699仕様書無しさん
垢版 |
2018/06/25(月) 14:49:14.34
モジュール毎にまとめるか、アプリの単位でまとめるかは、システムによるからなぁ
0700仕様書無しさん
垢版 |
2018/06/25(月) 17:49:44.56
newでインスタンス生成ってマジックナンバー埋め込みと一緒じゃん
0702仕様書無しさん
垢版 |
2018/06/25(月) 19:05:08.92
>>701
変更したくなったときに全体調べて書き換えていく必要がある点が一緒じゃん
0703仕様書無しさん
垢版 |
2018/06/25(月) 19:15:36.22
DBのドライバをクラス名で設定ファイルに書くのはDI?
0704仕様書無しさん
垢版 |
2018/06/25(月) 19:34:00.00
DBのドライバは、アプリの利用者が
変更するものではないので設定ではありません
0706仕様書無しさん
垢版 |
2018/06/25(月) 19:42:09.87
我々が設定ファイルと呼んでるものはDI否定厨にとっては設定ファイルじゃないらしいが、
じゃあ何て名前で呼んでるんだろう?
0707仕様書無しさん
垢版 |
2018/06/25(月) 20:35:25.25
一時的なものならハードコートした方が手っ取り早いのは当たり前だあな
0708仕様書無しさん
垢版 |
2018/06/25(月) 20:55:37.95
>>702
> 変更したくなったときに全体調べて書き換えていく必要がある点が一緒じゃん

マジックナンバーを変更したいととなんてないんですが?
0709仕様書無しさん
垢版 |
2018/06/25(月) 20:56:15.28
>>703
> DBのドライバをクラス名で設定ファイルに書くのはDI?

全く違う

 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン
0710仕様書無しさん
垢版 |
2018/06/25(月) 20:57:30.11
>>705
> 我々が設定ファイルと呼んでるものはDI否定厨にとっては設定ファイルじゃないらしいが、

設定ファイルと読んでいるものではなくて、
その設定ファイルそのものを見せてくれませんかね?

どう見ても設定ファイルではないと一蹴してあげますんでw
0713仕様書無しさん
垢版 |
2018/06/25(月) 22:19:44.20
有名なフレームワークは様々な需要に応えなきゃならん
本来不要なDIも一部のワガママで削除することができない
0715仕様書無しさん
垢版 |
2018/06/25(月) 22:40:43.99
>>710
SpringのapplicationContext.xmlは設定ファイルじゃなかったら何なの?
0716仕様書無しさん
垢版 |
2018/06/25(月) 23:17:53.53
>>715
あー、そういうこと?

アプリの動作を変えるために、アプリの利用者が設定するファイルと
アプリをビルドするのに必要なファイルをごっちゃにしてるのか。

今の話は、アプリ利用者が設定するファイルの話
その設定ファイルは一つにまとめるメリットは有るが
アプリをビルドするのに必要なファイルはそうする必要ないでしょってこと
0717仕様書無しさん
垢版 |
2018/06/25(月) 23:31:45.11
設定を1ファイルに書くとめちゃくちゃになる
使うクラスごとに設定ファイルを分けろ
0718仕様書無しさん
垢版 |
2018/06/25(月) 23:37:29.86
>>716
お前以外はアプリ利用者の設定なんて話はしてなかったぞ
ていうかDIの分脈でアプリ利用者の設定ファイルなんて出てくるわけないじゃん
お前ワザと話を逸らしてるんじゃなかったら頭の病気を疑った方が良いぞ
0719仕様書無しさん
垢版 |
2018/06/25(月) 23:40:21.52
DIは依存関係を集約するが、それを1ファイルに書かなきゃいけないなんて決まりはない
0720仕様書無しさん
垢版 |
2018/06/26(火) 00:08:33.09
>>716
結局>>715は設定ファイルなんですか?はっきり答えてください。
そして>>703をapplicationContext.xmlに書いたらDIにならないのは何故ですか?
0721仕様書無しさん
垢版 |
2018/06/26(火) 00:19:34.15
>>718
は? 接続先DBとか、アプリをビルドするために必要なものじゃなくて
アプリのユーザーが指定するものじゃん
(ローカルデータベースじゃなくて、DBサーバーを指定する場合)
設定ファイルってこういう物の話でしょ?

で、話を戻すけど、そういうアプリのユーザーが決める設定ファイルは
一箇所で指定する必要あるけど、そうでないものは一箇所で指定しなくていい
だからDIを使って一箇所に依存関係をまとた方が良いという理由にはならんのだ
0722仕様書無しさん
垢版 |
2018/06/26(火) 00:25:34.41
>>720
> 結局>>715は設定ファイルなんですか?はっきり答えてください。
わかったわかった。設定ファイルでいいよ

アプリをビルドするのに必要な設定ファイル。
ただしこのタイプの設定ファイルは一箇所にするメリットはない

> そして>>703をapplicationContext.xmlに書いたらDIにならないのは何故ですか?
それは話が変わってる。依存関係を一箇所にまとめるメリットがないという話をしている。
依存関係を一箇所にまとめるメリットがないから、DIを使うメリットもないという話

しかし、おかしいな。
> 677 名前:仕様書無しさん[sage] 投稿日:2018/06/25(月) 09:50:30.59
> 設定をコードに散らばらせずに一箇所にまとめるメリットは分かるのに

ここでいう「設定」がDIコンテナのための設定であるならば、
DIコンテナの設定を一箇所のまとめるメリットがあるから、
DIコンテナの設定を一箇所にまとめよう。という事になって、
おいおい、話が循環してるじゃねーかwって事になってしまう。

その流れで行くならそのそも「設定」は一箇所にまとまってないよね
ってことになる
0723仕様書無しさん
垢版 |
2018/06/26(火) 00:25:53.06
装備に含まれるデータは、半分以上が、日付と製作者・錬金者の情報と思われます。
(こちらにもう少し詳しく書きました。
https://hiroba.dqx.jp/sc/diary/278225439938/view/5325444

初めて装備した時に職人評判が上がるシステムのため、製作者情報は必須ですが、
装備後は必要無い情報ではあります。
フレンドに作ってもらった物は名前を残したいという気持ちはありますが。

提案です。
「装備圧縮袋」
・装備済の物のみ入れる事ができる。
・入れた装備は「装備の履歴」の情報が消える。
・パルプンテや強化した紫文字の情報も(システム的に問題無ければ)消す。

これにより装備品データの約8割が削減されることになるはずです。
10枠の容量で50個の装備が入れられるのです。
ぜひご検討お願いします。


オブジェクト指向プログラミングを知っている人へ。
0724仕様書無しさん
垢版 |
2018/06/26(火) 00:27:17.57
勝手にDBのドライバの話(>>703)をDBの接続先サーバの話に変えるなよ
0726仕様書無しさん
垢版 |
2018/06/26(火) 00:33:15.58
DBのドライバをクラス名でapplicationContext.xmlに書くのはDI?

という質問にしてくれればわかりやすい。
「意味不明な質問であること」がわかりやすい

何が意味不明かと言うと、
DIを使うから、applicationContext.xmlに書くのであって
applicationContext.xmlに書くからDIになるのでは無いとういこと。


そもそもの発端は、一箇所にまとめることがメリットであるかどうかという話で、
DBのドライバのクラス名を一箇所に書いておくことにメリットはありません。
0727726
垢版 |
2018/06/26(火) 00:35:32.87
DBのドライバのクラス名を一箇所に書いておくことにメリットはないので
applicationContext.xmlに書く必要もないということね

何も考えないで言われたことをやってる人は、DI使うのは当たり前、
applicationContext.xmlに書くのが常識。で終わっちゃってるけど
なぜそれが必要か?の理由まで考えると、DIを使わなくていいし
一箇所にまとめる必要もないことに気づくはず
0728仕様書無しさん
垢版 |
2018/06/26(火) 03:31:30.37
DI否定厨の無駄に長い話をまとめると、
設定ファイルの話は完全敗北で分が悪いから
DIのメリットの有無に話を逸らしたい、だね
0729仕様書無しさん
垢版 |
2018/06/26(火) 05:28:10.79
DIが本題で設定ファイルの話にすり替えられていたのが
もとに戻ったというところか
0730仕様書無しさん
垢版 |
2018/06/26(火) 07:14:21.31
設定ファイルについて双方の意見をまとめて
流れがめちゃくちゃで何を言ってるかわからん
0731仕様書無しさん
垢版 |
2018/06/26(火) 08:17:30.58
結論
DIで書く理由が宗教的なものでしか無いので却下
0732仕様書無しさん
垢版 |
2018/06/26(火) 09:57:40.95
>>730
設定ファイルについては忘れていいよ。

本来コードの中から分離すべきでないクラス間の依存情報を
設定情報として分離したら(←そもそもこれが間違い)
一箇所にまとめるのはメリットが有ることでしょう。なぜなら
設定情報はメリットがあるから一箇所にまとめてあるんだからという理屈
(↑この理屈も、設定情報は必ずしも一箇所にまとまってるわけじゃないのだからおかしい)

どんなものでも設定情報という扱いにしてしまえば
一箇所にまとめるメリットがある!という暴論になってる
0734仕様書無しさん
垢版 |
2018/06/26(火) 14:25:18.25
DIを否定する人は、どういう理由で否定してるの?
以下に当てはまる理由はありますか?

(1) クラスAに依存してるコードをクラスA'に書き換えたいとき、DIなら設定してる一箇所を変えるだけで良いと言われてるが、それは事実と異なる

(2) A'に書き換えたいケースなんて存在しない

(3) Aに依存してる全てのコードをA'に書き換えて回る方がコストが安い
0737仕様書無しさん
垢版 |
2018/06/26(火) 19:23:42.90
クラスAに依存してるコードをクラスA'に書き換えたいとき、DIを使わずともnewしている所を一箇所を変えるだけで良い

「一箇所を変えるだけで良い」というのはDI特有の話ではないので、二度と言うな
0738仕様書無しさん
垢版 |
2018/06/26(火) 19:27:42.00
>>736
確かにね

>>737
DIにユニークな特性じゃなかったら主張しちゃダメってのもよく分からん理屈だが、例えばDIの他では何がある?
0739仕様書無しさん
垢版 |
2018/06/26(火) 19:48:29.32
>>737
おおっと、完全に誤読してた

>クラスAに依存してるコードをクラスA'に書き換えたいとき、DIを使わずともnewしている所を一箇所を変えるだけで良い

newしてるところを書き換えるということは、Aをnewしてる箇所が100箇所あれば100回書き換えるということね
DIなら100箇所でAが使われてても修正は1箇所だよ
0740仕様書無しさん
垢版 |
2018/06/26(火) 19:50:32.89
>>738
だからnew。newする場所はコンストラクタでもメソッドでもいいが、
クラスAに依存したコードを、クラスA'に変えるんだろ?
以下のコードを見れば分かる通り、一箇所しか書き換えていない

class My {
 private InterfaceA a;
 public My() {
  a = new A();
 }
 public void method() {
  a.method();
 }
}


class My {
 private InterfaceA a;
 public My() {
  a = new ADash();
 }
 public void method() {
  a.method();
 }
}
0741仕様書無しさん
垢版 |
2018/06/26(火) 19:52:53.56
>>739
> newしてるところを書き換えるということは、Aをnewしてる箇所が100箇所あれば100回書き換えるということね

プログラミング初めて1ヶ月の初心者か何かですか?
まさかこんなコードかいてんの?

class My {
 public void method1() {
  InterfaceA a = new A();
  a.method();
 }
 public void method2() {
  InterfaceA a = new A();
  a.method();
 }
 public void method3() {
  InterfaceA a = new A();
  a.method();
 }
}
0742741の続き
垢版 |
2018/06/26(火) 19:54:45.03
こう書けば終わる話。newしてるのは一箇所だけにできる

class My {
 private InterfaceA createA() {
  return new A();
 }
 public void method1() {
  InterfaceA a = createA();
  a.method();
 }
 public void method2() {
  InterfaceA a = createA();
  a.method();
 }
 public void method3() {
  InterfaceA a = createA();
  a.method();
 }
}
0743仕様書無しさん
垢版 |
2018/06/26(火) 19:57:05.67
>>742
そのcreateAはMyクラス以外でも、Aを必要とするクラス全てで利用するという理解であってますか?
0744仕様書無しさん
垢版 |
2018/06/26(火) 19:57:20.45
そもそも、DIでは「Aをnewしてる箇所が100箇所」というコードを
書けないという問題があるんだよ。

できるって? まあそうだね(笑)
どういうコードになるか書いてみ。
>>742と同じようなコードになるからさ
0745仕様書無しさん
垢版 |
2018/06/26(火) 19:58:20.59
>>743
Aを必要とするクラスが複数ある場合、
DIでも「一箇所書き換えるだけ」にはならないってこと
わかってますか?
0746仕様書無しさん
垢版 |
2018/06/26(火) 20:00:42.81
>>743
具体的に書きますね?

DIを使った場合

クラスMy1がクラスAを使います。
クラスMy2がクラスAを使います。
クラスMy3がクラスAを使います。
クラスMy4がクラスAを使います。
クラスMy5がクラスAを使います。

と5箇所、書かないといけない。
DIでこれを全部A'に書き換える場合


クラスMy1がクラスA'を使います。
クラスMy2がクラスA'を使います。
クラスMy3がクラスA'を使います。
クラスMy4がクラスA'を使います。
クラスMy5がクラスA'を使います。

と5箇所書き換えなければならない
0749仕様書無しさん
垢版 |
2018/06/26(火) 20:07:22.46
>>748
YES / NO じゃ正確に答えられない

ようするに、DIでn箇所書き換えるなら、DIを使わなくてもn箇所書き換えればいい

DIで1箇所書き換える例を出してきたなら、DIを使わないで1箇所書き換えればいい例を出してやるし、
DIを使わないで100箇所書き換える例を出してきたら、DIを使っても100箇所書き換えることを示してやる
0750仕様書無しさん
垢版 |
2018/06/26(火) 20:10:21.26
>>749
貴方はDIで1箇所の修正で済む方法は知らないが、もしあるなら別の方法でも実現してみせる、と言っているのですか?
つまり貴方はDIについて無知なのに批判してるということになりますが、それで良いですか?
0751仕様書無しさん
垢版 |
2018/06/26(火) 20:22:26.23
>>750
DIで1箇所の修正で済む方法を出してきたら、
それと同じ方法がDIを使わなくてもできる。
0752仕様書無しさん
垢版 |
2018/06/26(火) 20:28:29.95
型情報を潰してるだけだからな
メリットがあったらスゲーよ

インターフェース使ってもいいけど
元の型も容易に取れる仕組みを入れて欲しい
0753仕様書無しさん
垢版 |
2018/06/26(火) 20:47:39.84
DIは所詮依存情報を外出ししただけに過ぎないんだよ
それ以外の違いは副次的なもので、DIを使ってできるから
使ってみましたと言うだけで、DIを使わなくてもできる
0754仕様書無しさん
垢版 |
2018/06/26(火) 21:51:50.87
ていうか、ごった煮リストだよね
別にごった煮リストじゃなくてもいいと思うんだけど
ごった煮リスト作っちゃうんだよね
0755仕様書無しさん
垢版 |
2018/06/27(水) 00:16:24.42
C#やjavaのようなインターフェースや予測入力がしっかりした言語じゃないとDIの意味なくて、phpなんかでDIって言われても「はぁ?」ってなる
0757仕様書無しさん
垢版 |
2018/06/27(水) 00:51:00.47
>>751
ご自身が無知であることを認めて頂き、誠にありがとうございます。
おかげでDIに対する貴方の意見には何の価値もないことが分かりました。感謝します。
0758仕様書無しさん
垢版 |
2018/06/27(水) 01:05:04.47
批判してる対象の技術で何ができるか、
それも主題としてる問題に対して何ができるかも知らずに
厚かましくも批判するなんて、
どういう神経してるんですかね?その点は興味深いです。
0759仕様書無しさん
垢版 |
2018/06/27(水) 01:36:01.64
お前らがやりたいことって
いつも連想配列な気がする
0760仕様書無しさん
垢版 |
2018/06/27(水) 02:37:48.63
>>757
どういうこと?
今はお前のターンで、DIで1箇所で済む方法を出さなきゃいけないはずなんだが?
まだ?まってるよ?
0761仕様書無しさん
垢版 |
2018/06/27(水) 06:47:32.09
アンチが何度もマーチンファウラーのやつ貼ってるのに
0764仕様書無しさん
垢版 |
2018/06/27(水) 17:48:11.81
アンチ本人は崖っぷちで耐えてると勘違いしてるけど
とっくの昔に崖の下に落ちてるパターンw
0765仕様書無しさん
垢版 |
2018/06/28(木) 12:02:30.78
DIは無意味
普通にnewすればいい
実装の差し替えも簡単にできる

class A {
public void method() { puts "hello" }
}

class B {
public void aaa() {
new A().method();
}

ここでAをA'にしたくなったら
Aをコピペして片方のAをAoriginに改名する
もう片方のAの実装をこう差し替える

class A {
// private Aorigin a = new Aorigin();
private Adash a = new Adash();
public void method() { a.method(); }
}

また気がかわってAoriginに戻したくなったらコメントアウトを切り替えるだけ
Bのほうを直す必要は一切ない

クソみたいなフレームワークを覚える労力はいらない
初心者でもわかるほどシンプルで簡単な実装
頭が悪すぎる巨大な泥だんご設定ファイルはいらない
参照ジャンプが有効なのでデバッグも楽々
仮装テーブル挟まないので速い
0768仕様書無しさん
垢版 |
2018/06/28(木) 12:46:41.24
素晴らしいアイデアだ
またDIはゴミと証明された
0769仕様書無しさん
垢版 |
2018/06/28(木) 16:44:50.73
>>765
デザインパターンとして相応しい名前つけてやるよ

ドカタコメントパターン
0772仕様書無しさん
垢版 |
2018/06/29(金) 11:22:15.02
>>765
設定ファイルそんなでかくなる?
差し替えが必要な要素は設定ファイル使うけど、大半のクラスはアノテーションとかメタデータで済ませるし
0773仕様書無しさん
垢版 |
2018/06/29(金) 12:58:45.70
>>772
覚えたての巨大な泥団子ってワードを使ってみたかっただけだよ
察してあげてよ
0774仕様書無しさん
垢版 |
2018/06/30(土) 15:43:11.73
>>772
アノテーション使うと一元管理できないですよね?
何に依存するかを、クラスの中に書くことになってしまう
0775仕様書無しさん
垢版 |
2018/06/30(土) 17:36:47.43
>>774
>何に依存するかを、クラスの中に書くことになってしまう

ならない
0777仕様書無しさん
垢版 |
2018/06/30(土) 18:18:18.82
>>776
>>746の時みたいに、DIアンチが圧倒的な無能を晒すまで追い詰めてやってもいいんだが、
結局恥知らずにも戻ってくることが分かったからなぁ
0778仕様書無しさん
垢版 |
2018/06/30(土) 18:53:22.15
>>773
「巨大な泥団子」ってプログラミング用語だったんか
一つ賢くなったよありがとう
0779仕様書無しさん
垢版 |
2018/06/30(土) 19:18:52.68
プログラミングっつーか業界用語っつーかスラング?
0780仕様書無しさん
垢版 |
2018/06/30(土) 19:54:54.57
>>777
いや、いつも追い詰めてないじゃんw
追い詰めたというレス見せてくれよ?
0781仕様書無しさん
垢版 |
2018/06/30(土) 22:56:54.55
class A {
[ここDIしてね]
private B b ;
}

ってあるとき、bのクラスはBでもいいし、Bのサブクラスでもいいのよ。
そこらへんは設定ファイルとか、外出しする。
0785仕様書無しさん
垢版 |
2018/07/01(日) 01:05:46.19
つまり必要なのはDIじゃなくて、
テストの場合にはデフォルトで使用するクラスから
すげ替えることができる機能なのでは?
0786仕様書無しさん
垢版 |
2018/07/01(日) 01:07:15.00
ここでいってるDIっていうのは
「オブジェクト指向の依存関係を"ひとまとめに"定義する部分」
の話ね。つまりapplicationContext.xmlや
それ相当のコードはいらない

依存関係はクラスそのものに書くべき
0787仕様書無しさん
垢版 |
2018/07/01(日) 07:23:21.54
その機能を使うと、
void foo(){
var b = new B();
}
の、bの型がB以外のものになるってこと?

じゃなくて、例えばBをダイナミックリンクしてるとして、
そのBで示されるものが本番用の実装だったりテスト用の実装であれば良いってこと?
0788仕様書無しさん
垢版 |
2018/07/01(日) 08:26:17.20
>>787
何度も言ってるんだがなw

依存関係を外部に外出しするんじゃなくて、
クラスそのものに書いたほうがいい

システムの仕様として実行時に依存するクラスが変わる場合
それは例えばストラテジーパターンのようなパターンであり
それが必要になったときに必要なものを実装すればいい
必要になるかもわからんのに予め依存関係をひとまとめにするようなDIはいらん。

DIは実質テストでモックにすげ替えるだけに使われてる。
というと何故かDI厨がそんなことはない!テストの話をするな!とか
言いがかりつけてくるんだけど、反論はしないんだよなw

アノテーションのように依存関係はそのクラスに書くほうが良い
残るはDIはテストのために使われているってことだけ
だけどモックにすげ替える機能はどの言語でもあるだろ?
だから結局の所DIなんていらん
0789仕様書無しさん
垢版 |
2018/07/01(日) 09:49:15.65
> DIは実質テストでモックにすげ替えるだけに使われてる。
まあ、これは実質的にはその通りだと思う(100%ではないと思うけど)。
だとして、じゃあ、どうやってすげ替えるか。

> だけどモックにすげ替える機能はどの言語でもあるだろ?
リンカレベルの機能であれば、あるよね。
じゃあ、切り替えるときどうしよう。
makefile書き換えようか?
実行時の環境変数でclassを探すパスを切り替えようか?

依存されるクラスB1, B2, B3があって、下記のような2系統のdllを作ったとしよう。
honban.dll : 本番用
testmock.dll : テスト用
でもテストのときに使いたいのはB1とB2で、B3は本番のままでいいよ。
ってとき、testmock.dllではB1とB2だけ実装したいよね。
でもリンクを切り替えるためにはB3も実装しないといけない。

んじゃあ、B1とB2はtestmock.dllからとってB3はhonban.dllからとるよ。
ってことができればいいんだけど....


> DIは実質テストでモックにすげ替えるだけに使われてる。
あと、まあデータストアを切り替えるときとか、使うよね。
(データの保存をRDBにしたり、ファイルにしたり...)

こういう例がちょくちょく出てくると、その都度実装するにしても、
結局「じゃあ、フィールドやプロパティにアノテーションつけて切り替えられるところを明示する?」とか
「そこに値を入れるんだったら、コンストラクタでやるのが自然だよね」とかになり、
結果DIになります。 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
0790仕様書無しさん
垢版 |
2018/07/01(日) 10:01:55.23
ストラテジーでやるにしても、
そのストラテジーをどうやって切り替えるか?
テストときとそうでないときで、ふるまいを変えるストラテジーが必要になります。
そのストラテジーは、たぶんインスタンスの管理をやるでしょう。

DIです。
0791仕様書無しさん
垢版 |
2018/07/01(日) 10:12:36.52
まあ「本質的にDIが嫌い」なのか「DIはともかく、何でもかんでも適用すりゃいいってもんじゃない」なのか、
ってのはありますな。
>>788は後者に思える。
0792仕様書無しさん
垢版 |
2018/07/01(日) 10:15:54.61
いまどきのDIはどっちかというとオブジェクトのライフサイクル管理が主目的
テストでモックを使うときはいちいちDIしないでモッキングフレームワークを使う
0793仕様書無しさん
垢版 |
2018/07/01(日) 10:24:49.05
狭い視野で大発見して「これすげぇ、これ無駄、みんなこうしようぜ」ってはしゃぐ子いるよね。
部分最適しか見てない善意の提案に対して、先輩とかリーダーとか誰かがコラって言ってあげないと、プロジェクト滅茶苦茶にされちゃうぜ。
0795仕様書無しさん
垢版 |
2018/07/01(日) 11:11:18.01
>>793
そういうやつのほうが、「黙って従う」タイプよりもずっと有望だがな。
0796仕様書無しさん
垢版 |
2018/07/01(日) 11:59:19.08
>>790
> ストラテジーでやるにしても、
> そのストラテジーをどうやって切り替えるか?

実行時になにかのパラメーターを使って切り替えればいいだけだよ。

DIは実行時に切り替えられないので使えない
DIは起動時の初期設定で決定してしまえば
実行中に帰ることはできない
0798仕様書無しさん
垢版 |
2018/07/01(日) 12:54:28.74
実行時にDIするオブジェクトが変えられない?
それ別に本質じゃない。
それで十分だからそう実装されてるにすぎないよ。
というか、あなたの主張はDI派のそれとほぼ一致するわ。
あなたもDIを要している。
0799仕様書無しさん
垢版 |
2018/07/01(日) 13:24:39.37
別にいまどきのIDEにはリファクタリング機能として
変数名やクラス名なんかをまとめて変更する機能が付いてるから、
べつに1箇所に記述する必要もクソも無いんだがなぁ。
0800仕様書無しさん
垢版 |
2018/07/01(日) 13:37:54.79
>>799
たとえばストレージを変えるたびにクラス名の置換とかしてるとか、ヤダわ。
0801仕様書無しさん
垢版 |
2018/07/01(日) 13:38:38.94
「クライアントクラスの中で直接サービスクラスをnewするのではなく外部から渡しましょう」がDIなんだから難しく考える必要ないよな
0802仕様書無しさん
垢版 |
2018/07/01(日) 13:51:41.67
>>800
え?
ストレージ変更なんかディレクトリ指定変えれば済むだろ?
クラス構成に影響あんのか?
0804仕様書無しさん
垢版 |
2018/07/01(日) 14:04:20.31
まさか、ストレージクラスが特定のデバイスしか扱えないとかアホな作りにしてるって事?
まさかデバイスドライバー直叩きなクラスとか?
…なんかDI必要って言ってる人って、システム構成からして汎用性考えて無いだけ?
0805仕様書無しさん
垢版 |
2018/07/01(日) 14:05:44.08
そもそも外からクラス指定を変更する理由が無いし。
0806仕様書無しさん
垢版 |
2018/07/01(日) 14:14:48.68
話が食い違ってるのに、“ストレージ” が指しているものがズレてることに気づけないのかな
なんか、DIとかそれ以前の問題だね
0807仕様書無しさん
垢版 |
2018/07/01(日) 14:17:34.25
ストレージって、保存先をディスクにしたり
SQL経由でデータベースに、とかそういうことよ?
0808仕様書無しさん
垢版 |
2018/07/01(日) 15:21:24.76
>>807
そんなん、そう言うストレージクラス作ってそっちで切り替えてしまえば良かろうが。
なんでメインをいじったり、全体を再コンパイルする必要があるんだよ。
0809仕様書無しさん
垢版 |
2018/07/01(日) 15:25:06.29
ちょっとストレージ変えたんで、システム全コンパイルしてください。


俺がチームリーダーなら張り倒すわw
0811仕様書無しさん
垢版 |
2018/07/01(日) 17:03:35.41
>>797
> だれが誰にそのパラメータをわたすの?

アプリのユーザーだろ。
例えば、ユーザーが拡大・縮小アルゴリズムとして
バイキュービックを選んだら、バイキュービックで処理する

DIはユーザーが選択するものじゃなくて
開発者がどのモジュールに依存するかを決め打ちするものだから
アプリのユーザーの選択で変わるようなことには使えない
0812仕様書無しさん
垢版 |
2018/07/01(日) 17:05:14.56
>>798
> 実行時にDIするオブジェクトが変えられない?

DIパターンはそういうものだからね。

 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
 > MovieLister クラスのフィールドへ適切に設定させるというものだ。
 > 依存関係は図2のようになる。

あんたは単に、インスタンスを値として他のインスタンスに渡すことを
DIという間違った名前で読んでいるだけ
0816仕様書無しさん
垢版 |
2018/07/01(日) 19:52:10.50
変更が掛かった箇所は再テスト。
それが分からない奴は工学学び直せ。
0817仕様書無しさん
垢版 |
2018/07/01(日) 20:43:11.04
>>814
インフラが変わってユニットテスト?やるべきは統合テストでは?
0818仕様書無しさん
垢版 |
2018/07/01(日) 23:03:44.11
>>817
インフラ扱う部分だけ変化してるなら、インフラ部分と統合テストでいいかもな。
全オブジェクトが書き換わるならユニットテストしなきゃならんだろ?
0821仕様書無しさん
垢版 |
2018/07/02(月) 10:59:35.89
小規模開発しか経験した事無い奴らしか居ないから、何社も関わって作る規模のプロジェクトに対して全コンパイル指示する大変さが分からないんだろうなぁ
0823仕様書無しさん
垢版 |
2018/07/02(月) 15:23:34.27
>>822
まず、A社に対してコンパイル&納品依頼書を提出するんだよ
そして双方のお偉いさんにハンコをもらって作業して納品してもらう
どんなに早くても2日はかかる
っていうのが関連会社の分だけ必要になる
0824仕様書無しさん
垢版 |
2018/07/02(月) 16:34:05.11
コンパイル、リリースする度バージョン管理の記録もしなきゃなあ
0825仕様書無しさん
垢版 |
2018/07/02(月) 18:43:15.44
はぁ?なんで触ってないとこまでコンパイルする必要あんの?
もう管理がおかしいじゃん
どこ直しても全コンパイル必須なんだろ?
スタンス関係ねーじゃん
0826仕様書無しさん
垢版 |
2018/07/02(月) 18:45:54.27
1つの実行ファイルである必要もないだろうし
一体なぜ全部つなげるのか?
0828仕様書無しさん
垢版 |
2018/07/02(月) 22:36:23.42
そもそも>>799とかがIDEのリファクタリング機能で云々とかいってるから「全コンパイル」とかそういう話になってるんだろ。
そして>>826。確かにその通りで、しかしそのためには依存性がなくなっている必要があるのだよ。
そのために使うのがDI。
※これはDI(DIコンテナを使ってやるDIパターン)だけが実現の手段ってわけじゃないし、
 これだけがDIの有用性を示しているというわけではないよ。
0829仕様書無しさん
垢版 |
2018/07/02(月) 22:42:47.37
べつにDIなんてしなくても機能のスイッチなんて簡単に出来るんだよな。
しかもメインを書き換える必要すら無く。
だいたい出力先や出力書式の変更なんて出力モジュールだけ弄ればいいんであって、
個々の方式毎に扱うクラスごと切り替えるなんてするなよ。
0830仕様書無しさん
垢版 |
2018/07/02(月) 22:45:24.88
洋服着替えるだけなのに血液型から変える必要は無いんだよな。
0831仕様書無しさん
垢版 |
2018/07/02(月) 23:50:51.92
●DI側
private ストレージ; // ←DIされるポイント
void update(int id, string newName) {
var なんかデータ = ストレージ.GetById(id);
なんかデータ.Name = newName;
ストレージ.Update(なんかデータ);
}
configファイル
ストレージはストレージforMySQL


●非DI側
private ストレージ = new ストレージForMySQL();
void update(int id, string newName) {
var なんかデータ = ストレージ.GetById(id);
なんかデータ.Name = newName;
ストレージ.Update(なんかデータ);
}
0832仕様書無しさん
垢版 |
2018/07/02(月) 23:50:57.08
で、ポスグレに対応しなきゃならなくなったら

DIのほうは
update()関数のほうはそのままで, configをいじる。(もちろんストレージforポスグレは作る)
config
ストレージはストレージforポスグレ

DIじゃないほうは、インスタンス作るとこを書き換える?
private ストレージ = new ストレージForポスグレ();

あるいはストレージをポスグレ対応にして、ストレージのほうは作成しなおして
private ストレージ = new ストレージ("ポスグレ");

ストレージがコンフィグを読むようにして
private ストレージ = new ストレージ();// ←中でコンフィグ読む
ってなるのかな。

出力先・出力書式の方式よってクラスを分けないってことは、
>>829のコードは、ストレージクラスのメソッドの先頭でポスグレ用・MySQL用で毎回分岐するのかな。
0833仕様書無しさん
垢版 |
2018/07/02(月) 23:52:59.08
>>830
その通り。
そのためには洋服が肉体に食い込まないようにしないといけないよね。
※まあ、肉体に食い込んでたとしても血液型を変える必要はないんだけど。
0834仕様書無しさん
垢版 |
2018/07/03(火) 00:02:50.79
だから、ダイレクトに固有の機能クラス呼び出しなんかしないんだよ。なーんで非DIがダイレクトにSQL呼ぶんだよw
もっと抽象クラスを呼び出す形にするのが普通だろ。
固有の機能差はその抽象クラスから下で吸収するから、そもそもメインで読んでるクラスを書き換える必要は無いんだよ。
0837仕様書無しさん
垢版 |
2018/07/03(火) 20:28:53.65
障害報告はスカスカのエビデンスで上がってくる
少ない情報を頼りに障害を再現しなきゃならん
現実的な方法はプロダクション環境を丸ごと再現して動かすしかない
そうなるとDIはほとんど役に立たん
プロダクションのDBを効率よく複製する方法を考えるほうが有益
0838仕様書無しさん
垢版 |
2018/07/03(火) 20:55:37.04
>>837
いや、大切なのはうまい飯を食い、愛する人と穏やかに暮らすことだよ。
プロダクションDBの復元なんて、なんの意味もないよ。
0839仕様書無しさん
垢版 |
2018/07/03(火) 20:58:08.88
まあ、DB絡みのバグなんて本番環境じゃないと再現出来ないものばかりだしな。
0841仕様書無しさん
垢版 |
2018/07/03(火) 21:06:20.45
DB設計の不備とかORMが作りやすさや使い勝手や運用面のことなにも考慮してないとかその辺の領域じゃないのか?
0842仕様書無しさん
垢版 |
2018/07/03(火) 21:09:05.67
まあ、オブジェクト指向のくせに限定的なクラスをダイレクトに使う奴にしか有用じゃ無い技法だやな。
0844仕様書無しさん
垢版 |
2018/07/03(火) 22:08:49.30
ログからモックを作るんだよ
インシデント調査に便利だぞ
0846仕様書無しさん
垢版 |
2018/07/04(水) 07:55:21.17
DIすると自然とSOLIDな設計になんだよね
テスタビリティもそうだけど設計ガイドラインとしての価値が大きい
0847仕様書無しさん
垢版 |
2018/07/04(水) 09:49:53.10
>>843
スタティックなcreate関数でも作って自身に内包じゃね?
どうせDBアクセスクラスなんてシングルトンなんだし。
0852仕様書無しさん
垢版 |
2018/07/04(水) 13:28:47.97
並列処理やマルチスレッドや手動スレー指定があるならスコープ関係あるだろうけど、そうでなけりゃ接続クラス自体はグローバルで唯一じゃね?
0853仕様書無しさん
垢版 |
2018/07/04(水) 14:26:14.92
マルチで繋げてもどうせどちらかが待たされるんだから一本化しちゃえよ。
0855仕様書無しさん
垢版 |
2018/07/04(水) 19:08:01.79
>>846
> DIすると自然とSOLIDな設計になんだよね

残念ながらならない。
どんな汚いコードでもDIを使うことはできるから
銀の弾丸に信じてる時点でアウトだな
0858仕様書無しさん
垢版 |
2018/07/04(水) 19:53:40.50
モジュールちゃんと分けてるか?
プロジェクト構成ファイルの所有者を管理者にしてパッケージを追加できないようにするんだ
こうしておけば余計な処理が紛れ込まなくなる

例えばリポジトリの実装モジュールにはプレゼンテーションのパッケージを参照させないみたいな感じな
プレゼンテーションのパッケージを参照してないとプレゼンテーション処理を書いたらエラーになる
だからこのモジュールは自然とデータアクセスの処理だけになるんだ

DIを使うとこういう風に自然とモジュールが分かれるからGoodなんだよ
0860仕様書無しさん
垢版 |
2018/07/04(水) 20:21:56.61
どうでもいいなら、DI使ったからって
きれいになるわけじゃないよって
言ってくれませんかね?
本当のことだし
0861仕様書無しさん
垢版 |
2018/07/04(水) 20:23:14.24
>>858
自然と分かれるという理屈が書いてない
根拠が無いので信頼性がまったくない
0862仕様書無しさん
垢版 |
2018/07/04(水) 20:24:50.24
例えば神クラスを作って、
すべてのクラスは神クラスをDIで
インジェクション使う。
開発規約にそうしなさいと書いてある

こういうのが綺麗なコードだよ
0863仕様書無しさん
垢版 |
2018/07/04(水) 20:25:35.32
間違ったw

例えば神クラスを作って、
すべてのクラスは神クラスをDIで
インジェクションする。
開発規約にそうしなさいと書いてある

こういうのが綺麗なコードだよ
0864仕様書無しさん
垢版 |
2018/07/04(水) 20:30:10.68
全部どこから使う時もcreate関数呼んで、同じ相手なら前と同じインスタンス返して、新しい相手なら新しいインスタンス返す様にすればいいじゃん。
0865864
垢版 |
2018/07/04(水) 20:33:28.01
設計的にも疎結合に出来るし、インスタンスを引き回す必要も無くなるんだから、楽だろ?
0866仕様書無しさん
垢版 |
2018/07/04(水) 20:54:48.66
まDIなんて必要なったときに
部分的に使えばいいんだよ。
それをDIって言わないんだけどなw
0867仕様書無しさん
垢版 |
2018/07/04(水) 20:55:54.43
 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
 > MovieLister クラスのフィールドへ適切に設定させるというものだ。
 > 依存関係は図2のようになる。
0868仕様書無しさん
垢版 |
2018/07/04(水) 21:00:08.95
>>860
どうでもいいけど、DI使うと設計が綺麗になりますね
例外も有ります
それだけ
ほんとどうでもいいです
0869仕様書無しさん
垢版 |
2018/07/04(水) 21:01:24.42
> どうでもいいけど、DI使うと設計が綺麗になりますね

残念ながらDI使わない状態で綺麗な設計ができない人が
DI使ったからって綺麗な設計にはならないんだよ
0872仕様書無しさん
垢版 |
2018/07/04(水) 21:08:46.30
例えばこういう人かな

例えば神クラスを作って、
すべてのクラスは神クラスをDIで
インジェクションする。
開発規約にそうしなさいと書いてある

こういうのが綺麗なコードだよ
0873仕様書無しさん
垢版 |
2018/07/04(水) 21:10:06.91
このスレ見てて、DIにする理由を理解してない人が
すごく多いってわかった。
誰もDIのメリットを答えられない
0875仕様書無しさん
垢版 |
2018/07/04(水) 21:13:52.46
そうそうDI使っててもわかってない人いるいる
銀の弾丸じゃあるまいし、DI使っただけで
綺麗になるとかありえない
0877仕様書無しさん
垢版 |
2018/07/04(水) 21:18:00.35
何も理解せずに仕事で前のコードがこうなってたから
DIやってますって人も多いだろうね
0879仕様書無しさん
垢版 |
2018/07/04(水) 21:20:57.37
綺麗な設計にするならフレームワークのほうが重要かな
用意された枠組みを真似て、それにそったコードを書けばいいから自然と綺麗になる
フレームワークの方でどんなクラスを作るかってのが決まってるからね

単にDIだと何をクラスにするか自由だから
それだけじゃ綺麗になったりしない
0881仕様書無しさん
垢版 |
2018/07/04(水) 22:56:03.99
>>879
フレームワークとDIって排他的ではないし、
きれいになり方も違うからねえ。
0882仕様書無しさん
垢版 |
2018/07/04(水) 23:36:23.41
フレームワークいいけど
フレームワークの上で作成したクラスは問答無用で全部他で使えないゴミになる
フレームワークのキャパを容易に上回るようなものを作るとき
フレームワークはタダひたすらにゴミである
0884仕様書無しさん
垢版 |
2018/07/05(木) 00:05:04.47
>>883
おかしくないか?
小さく単純なものを組み合わせて
大きく複雑なものを作ってきたのに
それができなくなっちゃうのはなんでなの?
0885仕様書無しさん
垢版 |
2018/07/05(木) 02:09:59.72
>>884
フレームワークの機能を使ってるからだろ?
DI使っていたってフレームワークの機能を使ったら
同じことになるじゃん
0887仕様書無しさん
垢版 |
2018/07/05(木) 09:50:36.16
フレームワークのキャパを超えるって意味不明。
それは単にマシンスペックに余るってだけじゃね?
0888仕様書無しさん
垢版 |
2018/07/05(木) 12:10:23.59
オブジェクトをコンポーネントとして扱える価値もわからないガイジが多いね
0890仕様書無しさん
垢版 |
2018/07/05(木) 22:15:29.08
俺の職場はフレームワークを脱却したがっているができていない
なぜかJDBCをラップして代替する機能がフレームワークについてて
底のほうまで浸食されてるせいだ

客を囲い込んで商売する連中が作ってるんだから
オブジェクト指向の理想なんてうわべだけになるのは当然
0891仕様書無しさん
垢版 |
2018/07/05(木) 22:26:11.74
ラップしてくれてるなら乗り換え簡単だね
ラッパーを別の基盤で実装すればビジネスロジックやプレゼンテーションはそのまま再利用できる
すごく理想的な状況だ
前任者に感謝しないとな
0892仕様書無しさん
垢版 |
2018/07/05(木) 22:50:57.26
ラッパー作れるだけの能力とマンパワーが無いんだろw
せっかく乗り換え易い様にしてくれた前任者の苦労が水の泡ww
0893仕様書無しさん
垢版 |
2018/07/05(木) 22:52:07.32
???
そのラッパーがフレームワーク固有だから困ってるって話なんだが
JDBC使ってたらまだなんとかなるのに
0895仕様書無しさん
垢版 |
2018/07/05(木) 23:13:08.12
どうしろってんだよ知ったげハゲめ
同じラッパー別のフレームワークで実装しろってのか
0896仕様書無しさん
垢版 |
2018/07/05(木) 23:30:17.77
class FooDao {
public List<Foo> getFooList(...) {
// jdbcつかった実装
}

class FooDao {
public List<Foo> getFooList(...) {
// 他のつかった実装
}

こうするだけじゃん
JDBC直接使ってたらシステム全体に修正が入ってたぞ 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
0897仕様書無しさん
垢版 |
2018/07/05(木) 23:35:01.11
ちがう
JDBCをべつのにしたいんじゃない
SQLやJDBC含めたビジネスロジックをそのままにして
その上のフレームワークをやめたいんだ
0898仕様書無しさん
垢版 |
2018/07/05(木) 23:48:26.52
SQLやJDBCを含めたビジネスロジック?
ちょっと意味がわからんよ
0900仕様書無しさん
垢版 |
2018/07/06(金) 00:32:52.97
>>896
・同一ソリューション(とか、ワークスペースとか)に共存させられないので、開発面倒じゃない?
・実行時のクラス検索システムで先に見つかったほうが使用されるんだよね?ちょっと心配じゃない?
・Javadocとかが集約したドキュメンテーションコメントが、どういう風に見えるんだろう。

この3点が疑問だが、でもそれ以外はうまくいくのか...な?
その方式って、実際に出荷している製品でやったことあるのか教えてくれると嬉しい。
0901仕様書無しさん
垢版 |
2018/07/06(金) 03:14:59.94
>>891
> ラップしてくれてるなら乗り換え簡単だね

ラッパーっていうのは最悪なものだぞ
ほとんどアンチパターンであるといっても過言じゃない

まずラッパーを使うと直で使うよりもできることが減る
直で使うのと同じことができるものを作る余裕が無いからだ
マイナーな機能まで対応する力はなが、そういうものに限って必要になる

ラッパーを使うことで簡単にかけるという謳い文句をするやつがいるが
信用してはいけない。簡単なことしかできないだけだから。
簡単に書きたいなら、簡単にかけるユーティリティライブラリを作ればいい
違いは、ユーティリティライブラリは、直で使ってもいいし、
ユーティリティを使ってもいいし組み合わせて使ってもいいものだが、
ラッパーは「このラッパー経由で使え。直で使うことは許さん」となっている

あと細かい点として、ラッパーを使うとパフォーマンスが下がる

ラッパーが有効なのは2つの異なった技術を同じように見せたい場合
例えば、DirectXとOpenGLの違いを吸収するもの
もう一つは古いライブラリを新しいライブラリに置き換えるためのヘルパー
Polyfillとも呼ばれる。これは古いコードが不要になればPolyfillも必要なくなる

「馬鹿でも簡単に使える」というラッパーはアンチパターン
0902仕様書無しさん
垢版 |
2018/07/06(金) 03:23:31.55
>>893
> そのラッパーがフレームワーク固有だから困ってるって話なんだが
> JDBC使ってたらまだなんとかなるのに

フレームワークを脱却するための正しいやり方は、
別のフレームワークを使うラッパーを作ることではない。
そんなことをすると死ぬぞ

なぜなら、古いフレームワーク前提で作られたラッパーと
同等の機能を持つラッパーを作ろうと思ったら、
便利な機能を持ってる新しいフレームワークを使う意味がなくなるし
また新しいフレームワークの機能を使って、古いフレームワークで
実現していたことを作り込まなければいけない。大変すぎる作業。


フレームワーク脱却でも脱却しない場合でも同じなんだが、
フレームワークに依存したコードを減らしていくのが正しい対応。
もちろんラッパーに依存したコードも減らす

汎用的なライブラリ(もちろんフレームワークの機能を使ってない)を
使って、フレームワークに依存した長ったらしいコードを短くしていく
フレームワークそのものは辞める必要はない。だって便利なものなんだから。

重要なのはフレームワークべったりなコード(ラッパー含む)を減らして分離すること
0903仕様書無しさん
垢版 |
2018/07/06(金) 05:40:15.88
>>900
今は実装を載せ替えるって話をしている
共存できるかと聞かれても、そもそも共存しないから問題ないよ、としか言えんな
FooDaoをダイレクトに書き換えるなら共存しないでしょ

もちろん丁寧に作業するなら
FooDaoからインターフェースを抽出
FooDao : IFooDaoに置換
NewFooDao : IFooDaoを製造
FooDaoのインスタンス化してる箇所をNewFooDaoのインスタンス化に置換
テスト
というステップを踏んだほうがいいし
俺だったらそうする
0904仕様書無しさん
垢版 |
2018/07/06(金) 06:01:26.30
>>903
ちゃんとリファクタリングの手順を勉強したほうがいいぞ

その丁寧な作業とやらは作業の手順になっていない。ただ構造を変えただけだ
インターフェースという余計な構造が追加されただけ
肝心の処理を置き換え部分が、単なるクラスの再実装になってる。

適切なやり方はこうだ

FooDaoとは別にNewFooDaoクラスを作る
FooDaoインスタンスの中に、NewFooDaoインスタンスを内包させる
FooDaoインスタンスの中の特定メソッドをNewFooDaoに移譲させる
繰り返してすべてのメソッドをNewFooDaoに移譲させる
最終的にFooDaoは何も処理をせず、単にNewFooDaoを呼び出すだけのコードになる
ここまでテストは一切変える必要はないので、変更でミスしてないことが証明される

FooDaoを呼び出しているコードをNewFooDaoを直接呼び出すように変更していく
最終的にFooDaoを呼び出しているコードはなくなるので、FooDaoを削除することができる
0905仕様書無しさん
垢版 |
2018/07/06(金) 06:07:36.29
>>901
>>891
>> ラップしてくれてるなら乗り換え簡単だね

>ラッパーっていうのは最悪なものだぞ
>ほとんどアンチパターンであるといっても過言じゃない

>まずラッパーを使うと直で使うよりもできることが減る

ラッパーにも種類がある

テスタビリティ確保のためにapiをほぼ完全に再現した極薄のラッパー
この種類のラッパーは出来ることはほぼ同じ

他のapiをラップして使いやすくするためのラッパーもある
このラッパーは意図的に出来ることを減らすことが多い
開発生産性を上げるためには複雑で汎用性の高いAPIよりシンプルで簡単だけどマイナーな機能が使えないかもしれないラッパーのほうが優れているということだ

アダプタやプロクシ、その他様々なデザインパターンの実装として使うラッパーも多々ある

>直で使うのと同じことができるものを作る余裕が無いからだ

前述の通り目的によって同じことが出来るラッパーとそうでないラッパーがあってそれらは使い分けるものだ

>マイナーな機能まで対応する力はなが、そういうものに限って必要になる

必要になるならラッパーを拡張するだけ
オブジェクト指向の基礎だよこれは
0906仕様書無しさん
垢版 |
2018/07/06(金) 06:09:19.44
>ラッパーを使うことで簡単にかけるという謳い文句をするやつがいるが
>信用してはいけない。簡単なことしかできないだけだから。
>簡単に書きたいなら、簡単にかけるユーティリティライブラリを作ればいい
>違いは、ユーティリティライブラリは、直で使ってもいいし、
>ユーティリティを使ってもいいし組み合わせて使ってもいいものだが、
>ラッパーは「このラッパー経由で使え。直で使うことは許さん」となっている

使わなくてもいいというのはデメリットになりうる
apiにバグがあった場合やapiの使い方を間違えた場合にコードを広範囲に見直さなければならない
ラッパーを経由して使えばラッパーを直すだけでいい

>あと細かい点として、ラッパーを使うとパフォーマンスが下がる

業務に支障が出るようなパフォーマンス低下にはならない
というか体感できない程度だろう

>ラッパーが有効なのは2つの異なった技術を同じように見せたい場合
>例えば、DirectXとOpenGLの違いを吸収するもの
>もう一つは古いライブラリを新しいライブラリに置き換えるためのヘルパー
>Polyfillとも呼ばれる。これは古いコードが不要になればPolyfillも必要なくなる

>「馬鹿でも簡単に使える」というラッパーはアンチパターン

馬鹿でも簡単に使えるのはどうみてもメリットだし
君が言うようにラッパーには他にも様々なメリットがある
バカが居ない現場でも積極的に採用したいね
0907仕様書無しさん
垢版 |
2018/07/06(金) 06:13:04.15
>>905
だからラッパーは作るな
お前が言ってるそれは、ラッパーではなく簡単なヘルパークラスで解決すべき問題
ラップして必要な機能を覆い隠すとかアホだし、逆に必要な機能をどんどん追加していって
ラップしないクラスと同じものを作り出してどうするんだって話だ
ラッパーを作るのは無駄な作業でしかない
0908仕様書無しさん
垢版 |
2018/07/06(金) 06:13:32.13
>>902
フレーム使用部分をラップして置き換え可能な状態を作るんだよ

そしてラッパーで旧フレームワークと同等の機能を再現する必要はない
粒度というものを少しは考えろ
0909仕様書無しさん
垢版 |
2018/07/06(金) 06:15:26.10
> フレーム使用部分をラップして置き換え可能な状態を作るんだよ

それは最悪の方法
時間をかけて使いづらくするだけ
そして新たなオレオレクラスができあがり
将来に渡ってその使いづらいオレオレクラスを
使いづつけななきゃならなくなる

フレームワークに依存するよりも
独自のフレームワークもどきに依存させるほうが
もっと悪い結果になる
0910仕様書無しさん
垢版 |
2018/07/06(金) 06:18:50.84
>>904
お前がファウラー好きなのはわかったがまずはレスを読めよ
今はリファクタリングの話なんて誰もしてねえよお前以外はな
FooDaoが依存してる基盤を別の基盤に差し替えたいって問題を議論してんの
単なるクラスの再実装をしたいんですけどどうすればいいですか?って問題だ
0911仕様書無しさん
垢版 |
2018/07/06(金) 06:25:41.99
>>907
わからん子だねぇ
簡単なヘルパーだと使わないという選択肢が生まれて管理が行き届かないんだよ
ホビープログラミングじゃないんだぜ?
みんながこれ系の処理はこのラッパークラス経由で使って統制をとりましょうって時に
お前だけ生のライブラリ使ったら大迷惑なんだよ
お前が書いた生コードの保守は誰がするんだ?
ラッパーのメンテナーはお前の書いたきたねえコードの面倒なんざ見たくねえんだよ
0912仕様書無しさん
垢版 |
2018/07/06(金) 06:28:25.03
>>909
置き換え可能なラッパーなら置き換え後にリファクタリングもできるってことに気が付かないのか?
まあライブラリ生で使うような素人じゃ経験ないからわからんか
0913仕様書無しさん
垢版 |
2018/07/06(金) 06:37:39.28
だいたいユーティリティ系クラスってのは
汎用性を犠牲にしないで便利な機能を提供したいライブラリメーカー側の都合が大きいんだよ
ApacheのStringUtilのようなライブラリがそれな
全てのStringをラップして使えなんてバカはいねーしこれはこれで良いんだ

今問題になってるのはそういうのじゃねえ
世界中のユーザーが使うライブラリじゃなくスコープの決まったシステム内で使うためのラッパー話だ
しかも文字列みたいなコアな部分じゃなくデータアクセスみたいなインフラへの依存やフレームワークみたいに特殊なライブラリに依存するものの話だ
大きすぎ汎用性は無秩序なコードを生む原因になるし、汎用性のために利用のための手続きが増えるから生産性も悪い
今作ってるシステムが必要とする機能だけをよりシンプルなインターフェースで提供したほうがいい

世界中のユーザーが使うライブラリには汎用性をもたせ出来ることを増やしていく
スコープの決まったシステムで使うライブラリは出来ることをを制限して単純なインターフェースを手に入れる
これが大事なんだよ
0914仕様書無しさん
垢版 |
2018/07/06(金) 10:31:50.93
>>910
丁寧な作業と言ってる内容が
全然丁寧な作業になってないから言ってるんだろ

どうせインターフェース抽出する目的は
なんだって聞いて答えられないだろ

形を整えれば丁寧な作業だって勘違いしてる。
例えば作文を書く時、マス目にきっちり文字を入れれば
丁寧な作業だ。みたいなそんな発想なんだよ
0915仕様書無しさん
垢版 |
2018/07/06(金) 10:33:46.64
>>911
だから「よく設計されたライブラリを使って統制を取りましょう」でいいだろ。
なんで片手間に作られたオレオレラッパーで統制が取れると思ってんだ?

現時点でクソなラッパー使わされて問題になってるから、
ラッパー取り払いたいってなってる事実が理解できないのか?
0917仕様書無しさん
垢版 |
2018/07/06(金) 11:00:47.82
>>915
基本を理解してないな
プログラムが成長して既存のコードが使いにくくなることはある
これはラッパーだろうがヘルパーだろうが同じこと

この場合はラッパーだからこの程度で済んでいたが
ヘルパーだったら不満があるところをシステム全部から探して検討して修正して個別にテストしなければならなかった
ラッパーでリスクを最小化してくれた前任者に感謝しなさい
0918仕様書無しさん
垢版 |
2018/07/06(金) 11:11:37.06
>>916
インターフェース作らなくてもテストできるしw

>>917
なるほど、お前が素人だってことはわかった。
ヘルパーを使っていても、そのヘルパーの中身を修正すればいいだけだ
お前はその程度だったんだな。
0919仕様書無しさん
垢版 |
2018/07/06(金) 11:40:25.73
分界点として一旦は公的なインターフェースに変換してるなら、移植は簡単だろ。
0920仕様書無しさん
垢版 |
2018/07/06(金) 12:14:12.35
>>918
だからホビープログラミングの話は他所でやってくれ
ヘルパーだと管理下にないコードがどんどん作られていくんだよ
ヘルパーをリファクタリングする前にヘルパーから逃れたコードを洗い出して保護する作業が始まってしまう
これは大仕事だぞ
0921仕様書無しさん
垢版 |
2018/07/06(金) 12:52:00.69
> ヘルパーだと管理下にないコードがどんどん作られていくんだよ
作られていくわけ無いだろw
そもそも俺がヘルパーといったのはどうしても必要なときだけの話
基本は何も作らない。

いいか?何も作らないんだ。

無駄なラッパーのメンテナンスで時間つぶしてるお前とは違う
0922仕様書無しさん
垢版 |
2018/07/06(金) 12:52:44.87
>>919
別にインターフェースにしなくてもクラスとして
公的なpublicメソッドにしていれば、何も変わらない
0923仕様書無しさん
垢版 |
2018/07/06(金) 12:58:47.01
それにしてもインターフェースにしていれば移植が簡単ってどういう理屈なんだろうね
同じインターフェースを持った別の実装が、いきなりバーンと
出来上がるとか思ってるんだろうか?
0924仕様書無しさん
垢版 |
2018/07/06(金) 13:01:14.34
>>923
公的な。な。
代替システムを売り込みたい企業なんかたくさんあるからな。
0925仕様書無しさん
垢版 |
2018/07/06(金) 13:13:59.40
>>924
何が言いたいの? ついでだからこの際
日本中、世界中の標準仕様を作りましょうとか
時間かかるだけの無駄な作業をするって話してるの?
0926仕様書無しさん
垢版 |
2018/07/06(金) 13:15:49.06
標準仕様は重要だぞ。
なんせ標準化されたらそれ使うだけだからな。
0927仕様書無しさん
垢版 |
2018/07/06(金) 13:32:33.46
はい、そうですね。だからオレオレラッパーなんて
作ってはいけませんね。標準的なものを使いましょう。
0928仕様書無しさん
垢版 |
2018/07/06(金) 13:37:59.54
話が噛み合って無いんだが。
ラッパーって、要は、俺様仕様→標準仕様のラッパーじゃねーの?
俺様仕様→俺様仕様だったらラッパーって言わねーだろ?
0930仕様書無しさん
垢版 |
2018/07/06(金) 13:49:57.20
>>928
今糞だって言ってるオレオレラッパーっていうのは
作る目的が、ライブラリそのままじゃ馬鹿には使いづらいだろ?
俺が簡単に使えるようにラップしてやるよ。
お前らクソ野郎は俺様が作ったラッパーを使っていればいい
文句言うな。俺がルールだ、それに従え

ってやつだよ。

こういうラッパーは使いづらい。インターフェースは行き当たりばったりだし
重要な機能が足りない。機能が足りないと文句をいうとラッパーを拡張して
限りなくそのままライブラリを使ったほうがいいものへと"成長"する
オレオレラッパーなんてググっても情報が出てこない
なにが問題があると、ラッパーが原因。そのラッパーのメンテナンスに時間がかかる
心当たりがあるから、ラッパーは糞と言われると
俺様が作ったものを否定するなんて許せないってムキになる
0931仕様書無しさん
垢版 |
2018/07/06(金) 14:26:29.89
レベルの低い職場でレベルの低いラッパーを日常的に目の当たりにしてる人とは
お互いがイメージするラッパーが乖離し過ぎてて会話にならない
0932仕様書無しさん
垢版 |
2018/07/06(金) 15:22:10.36
それ、もはやラッパーじゃ無くてフレームワークじゃね?
0933仕様書無しさん
垢版 |
2018/07/06(金) 15:26:37.65
レベルの高いラッパーってなんだよw

ライブラリをそのまま使えないほどレベルが低いから
ラッパーとかいいだしてるんだろ
0934仕様書無しさん
垢版 |
2018/07/06(金) 17:41:18.69
>>933
レベルの高いラッパーなんてないと思うじゃん?
俺もそう思うけど、世の中にはものすごく低レベルなラッパーがあるみたいだ
0935仕様書無しさん
垢版 |
2018/07/06(金) 18:40:53.06
日本のラッパーなんて世界から比べたらお遊戯レベルだろ。
なんせ日本語がラップのリズムに適して無いんだよな。
0936仕様書無しさん
垢版 |
2018/07/06(金) 18:56:54.08
俺のラップ聞いてからその台詞吐けよ?あん?
0937仕様書無しさん
垢版 |
2018/07/06(金) 19:12:18.63
>>935
それ考えると、吉幾三すごいよな。
ダサくなることを有利に変えた。
0938仕様書無しさん
垢版 |
2018/07/06(金) 19:45:02.52
最近の若者はSOLIDを知らんのかね?
都合のいい最小のAPIセットを先に決めて実装する
基本的なことだよね
なんでユーティリティみたいなアンチオブジェクト指向なクラスを作ってしまうのか
0939仕様書無しさん
垢版 |
2018/07/06(金) 20:07:39.27
死んだぜ麻原彰晃♪
信者は朝から焼香♪
YEAH〜♪
0941仕様書無しさん
垢版 |
2018/07/06(金) 20:33:42.58
>>923
むしろそのインターフェースでソースを一斉検索かけて
クラスが百個近くヒットしたら万事休す
0942仕様書無しさん
垢版 |
2018/07/06(金) 20:45:46.84
世の中にはインターフェースが同じなら
実装がバグっていても、正しく動くと信じてる人がいる
0944仕様書無しさん
垢版 |
2018/07/06(金) 20:48:16.35
UtilityでできることはWrapperでできるが逆はできない
なのでUtility作りたくなったらとりあえずWrapper作っとけばいい
0945仕様書無しさん
垢版 |
2018/07/06(金) 20:49:11.37
>>943
このタイミングで言っても、バグったものを
インジェクションしても、正しく動かないぞって
言われて終わりだろw
0947仕様書無しさん
垢版 |
2018/07/06(金) 20:51:22.65
>>945
どんなデザインパターンも低脳ドカタがバク仕込むのは止められない
でもドカタに無力だからってデザインパターンが無意味という事にはならない
0948仕様書無しさん
垢版 |
2018/07/06(金) 20:57:53.64
>>947
はい。だからミスしないようにやる方法が重要なのであって
インターフェースとかDIとか関係ないって話なんですが?
まさかインターフェースやDIを使えばバグが入らないとでも?
0949仕様書無しさん
垢版 |
2018/07/06(金) 20:58:32.91
コア丸出しのユーティリティクラスはバカがやらかしまくるので危険
バグを量産して苦行デバッグにより徳を高めたい場合には効果的かもしれんな
0950仕様書無しさん
垢版 |
2018/07/06(金) 20:59:03.37
>>944
だから今フレームワークのラッパーのせいで苦しんでるんですってば
話ちゃんと理解してますか?
0951仕様書無しさん
垢版 |
2018/07/06(金) 21:00:48.17
ラッパーを使うと、重要な部分が隠蔽され
その重要な部分が変更できなくなってしまうのでだめなんだよ

なぜライブラリはその機能を提供しているのか?を考えれば
それが必要だからとわかる。

その機能を使えなくしてしまうラッパーは糞だし、
じゃあその機能を使えるようにしましょうとなってしまうと
ならラッパーを使わないでそのまま使えばいいやんとなる。

ラッパーのメンテナンスという無駄な作業が発生してる
0952仕様書無しさん
垢版 |
2018/07/06(金) 21:09:27.16
>>948
なーんもわかってないね
ミスしないようになんてのは精神論だよ
部下に怒鳴り散らすバカと同じ
ミスはどうやってもある程度の確率で紛れこむという事実から目をそらすな
テストをサボるな
テストにためにインターフェースを使え
0953仕様書無しさん
垢版 |
2018/07/06(金) 21:10:48.35
>>950
前にも言っただろ理解してくれ
ラッパーだから今程度で済んでいたがこれがユーティリティだったらとっくにゲームオーバーだったんだよ
九死に一生を得るって奴だぜ
0954仕様書無しさん
垢版 |
2018/07/06(金) 21:12:42.08
>>951
隠蔽してるから柔軟に変えられるんだ
これさ
オブジェクト指向の基本中の基本な
基礎をおろそかにしちゃいかんぞキミ
0955仕様書無しさん
垢版 |
2018/07/06(金) 21:19:32.54
ラッパーが役に立つのは自分がつかうときだけだな
他人が作ったラッパーほど鬱陶しいものはない
0956仕様書無しさん
垢版 |
2018/07/06(金) 21:22:53.77
うっとおしくないけど
仮にうっとおしくてもいいんだよ

バカなやつに好き放題、生ライブラリでコード汚染されるより遥かにマシなんだな
0957仕様書無しさん
垢版 |
2018/07/06(金) 21:25:39.88
別にうっとおしくないけど
仮にうっとおしくてもそれでいいんだよ

バカなやつに好き放題、生ライブラリでコード汚染されるより遥かにマシなんだな
0958仕様書無しさん
垢版 |
2018/07/06(金) 21:29:32.80
対して文意がかわってないのに内容が気に食わなくて2重投稿してしまうメンタル
他人のコードを汚染呼ばわりする態度

きさまリファクタやろうだな鬱陶しい
0959仕様書無しさん
垢版 |
2018/07/06(金) 21:39:33.77
二重投稿は電波が弱いところ入ったからミスっただけだ
汚染コードは事実だろ
外部ライブラリをあっちこっちにばら撒く行為を汚染と言わずになんというのか
0960仕様書無しさん
垢版 |
2018/07/06(金) 22:37:18.97
じゃあなにか
jre.jar以外にはかたっぱしからラッパーつくってんのか?

そこまでして何がうれしいんだ
0962仕様書無しさん
垢版 |
2018/07/06(金) 22:40:49.15
お前がいったことといったら
馬鹿なやつと汚染呼ばわりだけじゃねーか!!

通じてたまるか
0966仕様書無しさん
垢版 |
2018/07/07(土) 10:07:05.45
> このViewModelが仕様通りに動くかどうかテストしたい場合、どうしますか?
> わざわざその時間になるまで待って動かしますか?
>
> それはさすがにありえないので、
> 任意の値を返せるTimeProviderのモックアップを作ってテストします。

一方俺は、コンストラクタで任意の時間を指定できるようにした
コードは短くなり、インターフェースなど不要になった

class GreetingViewModel {

 var now: Int

 init(now: Int) {
  self.now = now
 }

 func greet() -> String {
  switch self.now() {
  case (let hour) where (6 <= hour && hour <= 11):
   return "Good Morning"
  case (let hour) where (12 <= hour && hour <= 17):
   return "Good Afernoon"
  case (let hour) where (18 <= hour && hour <= 23) || (0 <= hour && hour <= 5):
   return "Good Evening"
  default:
   return "Hello"
  }
 }
}
var viewModel = GreetingViewModel(now: Calendar.current.component(.hour, from: Date()))
print(viewModel.greet())
0967仕様書無しさん
垢版 |
2018/07/07(土) 10:08:35.45
>>965
やっぱりDIを勘違いしてるなぁ

 DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
        オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン

 https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html

 > Dependency Injection の形式
 > Dependency Injection の基本的な考え方は、独立したオブジェクトを
 > Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
 > MovieLister クラスのフィールドへ適切に設定させるというものだ。
 > 依存関係は図2のようになる。


この依存関係の図2をみなよ
0968仕様書無しさん
垢版 |
2018/07/07(土) 10:12:28.71
Dependency Injection の基本的な考え方は、独立したオブジェクトを
Assembler(組み立て係)として用意するってところなんだが、
そのことについて全く触れていない

そしてそのAssembler(組み立て係)が、MovieFinder インタフェースの実装を
MovieLister クラスのフィールドへ適切に設定させるというものなんだが、
それについても全く触れていない
0969仕様書無しさん
垢版 |
2018/07/07(土) 10:48:01.81
そう思うなら指摘してあげなよ
これがDIだって広まってる
0971仕様書無しさん
垢版 |
2018/07/07(土) 13:29:05.26
>>966
5時を引数にインスタンス化して1時間後にgreetしたらテストエラーになるだろ
ほらなDIを使わないからバグが量産されるんだよ
0972仕様書無しさん
垢版 |
2018/07/07(土) 13:41:57.60
>>971
それとDIになんの関係が?
DIって 独立したオブジェクトを
Assembler(組み立て係)として用意するって
ことわかってるよね?
0976仕様書無しさん
垢版 |
2018/07/07(土) 14:46:05.38
ネタにマジレスっていおうとしたら回答がさらにネタだった
0977仕様書無しさん
垢版 |
2018/07/07(土) 15:01:57.46
>>975
え?どうやって??
お前数学的証明を数学的に証明することなんてできるの?
そんなもんできないから数学的証明っていうんだけど?
0978仕様書無しさん
垢版 |
2018/07/07(土) 15:03:52.20
>>977
あーあ
できないんだ
じゃあ最初の証明も嘘なんだね
本当に正しいことなら数学的に証明できるはずだもの
0979仕様書無しさん
垢版 |
2018/07/07(土) 15:05:51.54
>>974
とりあえず公理系を書き出してみて

え?できない?それ数学的証明じゃないよ
0980仕様書無しさん
垢版 |
2018/07/07(土) 15:08:42.12
>>978
フェルマーの定理とか実際は長すぎて誰もついてけない
プログラムだってすぐバグるのにどっか間違ってないはずがない
数学だから正しいなんてことがあるか

経験的に実証されたものこそ真実
0981仕様書無しさん
垢版 |
2018/07/07(土) 15:19:59.41
>>978
お前馬鹿か。
数学的証明をわかってないじゃないか。
何かを数学的に証明することはできるが
数学的証明だけは数学的に証明できないと決まってる
0983仕様書無しさん
垢版 |
2018/07/07(土) 15:24:23.06
>>979
> とりあえず公理系を書き出してみて

公理系もしらんのか?
常識だからぐぐれ
0984仕様書無しさん
垢版 |
2018/07/07(土) 15:25:42.15
そもそも数学的証明って何か知ってるのかな?

例えばお前が山田だっていうのは
数学的に証明できる

自分が山田だと名乗ればいいのだから
これが数学的証明

基本だからこれが理解できない人は
話に参加しないでほしい
0985仕様書無しさん
垢版 |
2018/07/07(土) 15:26:37.64
また別の例ではジョブズは死んだという命題があるとする

さてここでジョブズとは誰か?
それは数学的証明によってスティーブ・ジョブズのことであることが
証明されている

ここまではいいな?
0986仕様書無しさん
垢版 |
2018/07/07(土) 15:27:18.42
ではスティーブ・ジョブズとは誰かだ?

これも元Apple CEOのスティーブ・ジョブズであることが
数学的帰納法によって証明できる
0987仕様書無しさん
垢版 |
2018/07/07(土) 15:28:25.84
だが、ここでAppleとはなにか?という
命題が出てくる。

AppleといってもいろんなAppleがあるだろう。
例えばApple自動車保険だ
0988仕様書無しさん
垢版 |
2018/07/07(土) 15:29:17.78
だがここでアップル保険でないことは
数学的証明で証明できる
0991仕様書無しさん
垢版 |
2018/07/07(土) 15:30:43.63
この世にはアップル自動車保険などない
Appleといえば、Appleしかないのだという
公理系に置いてAppleはAppleなのだ
0992仕様書無しさん
垢版 |
2018/07/07(土) 15:31:25.35
故にジョブズは死んだにおける
ジョブズはスティーブ・ジョブズのことであり
スティーブ・ジョブズは元AppleのCEOであることが証明できる
0993仕様書無しさん
垢版 |
2018/07/07(土) 15:31:37.17
ドカタが無理に数学的って言葉を使ってるの痛々しいなw
0994仕様書無しさん
垢版 |
2018/07/07(土) 15:32:11.06
ではジョブズは本当に死んだのか?
それは、写真を見ればわかる。
あれはどう見てもガンだ
0995仕様書無しさん
垢版 |
2018/07/07(土) 15:32:50.92
もうここまで言えばわかるだろう?
数学的証明ができない問題などない
0997仕様書無しさん
垢版 |
2018/07/07(土) 15:33:32.97
ジョブスは三丁目の山田んとこの倅だよ
はいこれでこの数学的マンの証明が嘘と証明されました
同じように考えて>>974も嘘とわかりますね
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 48日 17時間 52分 17秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況