X



オブジェクト指向システムの設計 172 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0010デフォルトの名無しさん垢版2016/07/11(月) 21:53:10.62ID:aTiidMol
職場の人がみんなそうで、毎日変数一つにまとめろとかクラス一つにまとめろとかいろんな人から怒られたりして気が狂いそう
javaから入ってオブジェクト指向学んだんだけど、javaと同じようにオブジェクト指向で作っちゃいけないの?
戻り値列挙型で定義したら戻り値二択にしてboolで返せって、戻り値によってswitch文で処理書いてたんだけどそれも全部捨てろって
俺そんなにおかしいもの書いたのかな?
共通化したりするとわかりづらい読みづらいって言われる
0011デフォルトの名無しさん垢版2016/07/11(月) 21:55:32.79ID:aTiidMol
>>7
共通化メソッドって言うのは例外処理のことね
例外処理一つにまとめたら例外ごとにメッセージ出せって言われたからメソッドこしらえたら分岐とか読み辛いからやめろって
読みやすいように考えたのに、そんなダメだったかな。
0013デフォルトの名無しさん垢版2016/07/11(月) 22:09:20.16ID:aTiidMol
>>12
書いたらrunて押せばいいの?
0016デフォルトの名無しさん垢版2016/07/11(月) 22:23:16.01ID:aTiidMol
変なのだったらごめん。
あとクラス名間違えてるごめん。
0017デフォルトの名無しさん垢版2016/07/11(月) 23:27:03.16ID:qc/cfS6K
>>15
わかりにくい(怒)

try {
  // your code goes here
  Director.Create("C:\\testdir");
} catch (IOException ex) {
  MessageBox.Show("入出力エラーが発生しました。");
} catch (Exception ex) {
  MessageBox.Show("想定外のエラーが発生しました。");
}


これで十分だろ
何ErrHandlerって
再利用性もゼロだし、分割しなきゃならんほど複雑な処理してんのか?
ついでに言えばcatchすんのかthrowすんのか、どっちかにしろよ
このmainはcatchした上でまたthrowするの?

おまえ向いてないよ
0018デフォルトの名無しさん垢版2016/07/11(月) 23:30:23.93ID:qc/cfS6K
レビューは的確に
誤解がないよう断定調で書く
反省を促すためにも積極的に人格否定などを織り込む
これ良いレビューの基本ね

がんばれよ糞コードヴォーイ
お前はセンスない上頭が悪くてきっとチビデブハゲブサメンワキガだけど、ここにコードを書いたガッツだけは認める
今日流した悔し涙は、明日のお前の血になる
0019デフォルトの名無しさん垢版2016/07/11(月) 23:33:42.75ID:MJsMJlaT
>>6
なんとも言えんなー
ぶっちゃけまるっとtry-catchで括っちゃうと不味い場面のが多い気がする
今の職場では「ハイ例外ハイ死んだーエラーログ出てるからオッケー」
なんてノリだけどな
途中で死んで処理切り上げて抜けました後片付けは知りません
落ちて死んだりもしたけれどアプリケーションは元気です!
ってそれ不良品じゃねーか!
って気がしなくもない
DB関連の処理ならロールバックあるけど
やっぱ真面目に作ろうとすると昔ながらのc言語スタイルかなと
0020デフォルトの名無しさん垢版2016/07/11(月) 23:36:48.16ID:aTiidMol
>>17
返信ありがとう
createメソッドとかcopyメソッドとかが出現する場所全部に入れないといけないからそういう風にしてる
throwはするなって言われたからキャッチした場所でメッセージ出力して、場合によっては戻り値返してる
こうしたくてこうしたいんじゃないけど、現状非難は浴びてるから向いてないのかもしれない
0021デフォルトの名無しさん垢版2016/07/11(月) 23:37:44.57ID:qc/cfS6K
        .______
.        |    |    |
     ∩∩  |     |    |  ∩∩
     | | | |  |    |    |  | | | |  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    (  ,,)  |     |    | (・x・ )<おらっ!出てこい、 ID:aTiidMol
   /  つ━━"....ロ|ロ   . | l   |U \___________
 〜(  /   |    |    |⊂_ |〜
   し'∪  └──┴──┘  ∪

俺様が貴重な時間割いてレビューして下さったんだぞ?
涙の一つくらい流して感謝の言葉でも述べたらどうだ
お礼は三行以上
ついでに糞コード書いてごめんなさい、産まれてきてごめんなさいも言え、このビチグソが
こういう勘違いしたバカがリーダブルコード読んで利いたふうな口をきくからコードが糞臭くなるんだよ
PHPからやり直せ
0023デフォルトの名無しさん垢版2016/07/11(月) 23:41:00.30ID:aTiidMol
>>22
ちゃんと意見言ってくれただけでもありがたいよ。
薬飲んでるのか?
体は大事にな。
ゆっくり休んでな。
0025デフォルトの名無しさん垢版2016/07/11(月) 23:48:51.28ID:aTiidMol
>>19
そこまで複雑な処理じゃないんだ。
最初は下位で何かあったら共通処理から上がってきて、メソッド毎に○○処理中に〜みたいなメッセージ出力してまた投げて、メインで例外処理するだけのものだったんだけど、それじゃだめだって言われて
例外発生タイミングで例外処理しろって、投げるなって
じゃあチェック処理含めてcreateメソッド囲った共通処理作ってその中でメッセージ出力したらどうだって言ったら
ややこしいからコピペで一回一回囲めって言われたんだ
伝わるかな?
0026デフォルトの名無しさん垢版2016/07/11(月) 23:58:21.13ID:EacXB/Ox
>>23
ちなみにそういう時は、コードを2つ並べて書くものだ。
A. 俺はこう書いたんだが、
B. こう書けといわれて戸惑ってる
みたいに。どちらかは丸ごとコメントアウトしておけばいい。
>>15がAで、>>17がBであっているのか?

あとそれが正統Java流だと思っているのなら、とりあえずJavaスレでも聞いてみたらどうか。
もちろんここで既に聞いたことは明示して。
ちなみに皮肉で言っているわけではなく、俺では単に判定出来ないから「聞いてみれば」と言っている。
割とJavaってそんな感じで刻むイメージがあるから。
0027デフォルトの名無しさん垢版2016/07/11(月) 23:59:14.37ID:c813o9It
>>19
> やっぱ真面目に作ろうとすると昔ながらのc言語スタイルかなと
それはない。
C言語スタイルでは大規模アプリの例外処理は
大変すぎて手に負えなくなる。
0030デフォルトの名無しさん垢版2016/07/12(火) 00:42:17.97ID:M/oXbOZH
>>27
いやいや
だって例外を1番上で捕まえると
死ぬ箇所によって死に方が千差万別よ

それって折角閉じたクラスや関数であっても大ジャンプしてケツも拭かずに飛び出して来るからね

だから例外を一括で処理するとデリケートな処理してっとこだとまじーんじゃねーかな?ってのは思うわ
0031デフォルトの名無しさん垢版2016/07/12(火) 00:45:40.75ID:StomlD/Y
Cって例外ないじゃん
C++は既にJavaに似た例外あるじゃん

C言語スタイルってなんじゃん?
0034デフォルトの名無しさん垢版2016/07/12(火) 01:02:14.20ID:4M8hLvVe
>>30
> だって例外を1番上で捕まえると
> 死ぬ箇所によって死に方が千差万別よ

頭が硬すぎ。困るときだけ対処しろよ。

困らないときがほとんどなんだから
困るときだけ対処すればよい。
0035デフォルトの名無しさん垢版2016/07/12(火) 01:03:49.06ID:4M8hLvVe
C言語よりもあとにできた言語では
ほぼ全て例外機構があって、例外を使うのが推奨されている。
(例外を使うなって意見聞いたことあるか?)

という現実を見れば議論するべき内容じゃない。
例外が良い。の一択
0038デフォルトの名無しさん垢版2016/07/12(火) 01:17:32.84ID:rBak2gB5
>>36
Googleは例外が使われていない大量のレガシーコードを抱えている
そのレガシーコードと例外を扱う今風のコードを混ぜることにコストがかかるから例外を使わないというルールになっている
新規にコードを書くなら例外でエラーするのが一般的

>>Googleの既存コードに例外に対する耐性がないことを考慮すると、Googleのプロジェクトで例外を使うのは、新規プロジェクトで例外を使うのと比べて、ややコストが大きいと言えます。
>>例外の変換プロセスには時間がかかり、問題になりやすいものです。また私たちはエラーコードやアサーションといった例外の代替手段が大きな障害になるとは考えていません。
0039デフォルトの名無しさん垢版2016/07/12(火) 01:36:55.20ID:4M8hLvVe
>>36
Googleは特殊な事例があるからってだけだなw

もうネタ切れ? つまり例外を使うべきだよね。
(もう何度もやって答え出てること繰り返すのは面倒だ)
0040デフォルトの名無しさん垢版2016/07/12(火) 01:37:15.67ID:M/oXbOZH
>>34
会社でどっちに倒すか?
ってなったら俺ならその場で対処だな

ロールバックの付いてないDBみたいな処理のが世の中多いと思う

例えば0割とかモノによってはその場で対処必須なものもやっぱあるわけで

どっちかに方針を統一しろって話になったら例外大ジャンプは取り返しがつかない事態を内包すると思う

まあ、概ね大丈夫ってのはわかるけどね
0042デフォルトの名無しさん垢版2016/07/12(火) 01:38:41.27ID:4M8hLvVe
>>40
> 例外大ジャンプは取り返しが
だからさ、例外小ジャンプすればいいだけだろ

なんで使い分けられない?
0043デフォルトの名無しさん垢版2016/07/12(火) 01:45:58.42ID:4M8hLvVe
プログラミングやってて時たまいるんだが、
視野が狭いっていうか、何かをやれって言ったら、
それだけしかやらないやつな。

自分で適切なコードが何かがわからない。
マニュアル通りにしかコードをかけない。

そんなやつがいるんだよね。

例えば例外はちゃんとキャッチしろって言ったら、
はいはいわかりましたよって、すべての関数にtry-catchを入れる。
んで、え?あんたがキャッチしろっていったんでしょ?
だから全部入れてやったんですが?って言うようなやつ。
0044デフォルトの名無しさん垢版2016/07/12(火) 01:48:36.07ID:umCvEWis
>>38
そこは俺も読んでるよ。
しかし俺は逆に「例外を使え」ってのを聞いたことないんだが、
日曜コードではなくて、マジの商用コードでそういう方針の所ってあるか?
0045デフォルトの名無しさん垢版2016/07/12(火) 01:55:35.82ID:4M8hLvVe
> しかし俺は逆に「例外を使え」ってのを聞いたことないんだが、

なんのために言語に例外なんて機能を追加していると思ってるんだ?

言語マニュアルを読めば例外はどういうときに使うもので、
どういう使い方をするか説明してあるだろ。
それにその言語のライブラリは例外使われてるだろ。

ごく普通に使われってるとおりに使えばいいだけ。
0046デフォルトの名無しさん垢版2016/07/12(火) 01:58:01.82ID:4M8hLvVe
まああれだ。C言語のしがらみがないライブラリで
例外を使っていないライブラリありますか?
という質問に答えてみればいい。

例外を使うのが自然すぎてわざわざ使えという話じゃないことがわかるはず。
0050デフォルトの名無しさん垢版2016/07/12(火) 02:21:04.05ID:umCvEWis
>>47,48
情報ありがとう。頭だけざっくり読んだけど、詳細検討には時間がかかりそうだ。
googleのコーディングガイドでしれっと最後に
> Windowsのコードについては、このルールは例外です(シャレでなく)。
とあるのだが、Windowsで閉じている場合は環境が整備されているから
googleみたいな運用方法でも障害にはならないということなのかな?

大ジャンプが問題になっているけど、
現実的には大ジャンプ無しでの処理を強制するのなら例外を使う意味は無いよね。
例えば>>17なら従来方式、

int result = Director.Create("C:\\testdir");
if (result==1) MessageBox.Show("入出力エラーが発生しました。");
else if (result==2) MessageBox.Show("想定外のエラーが発生しました。");

でもほぼ同じなわけでさ。当然そのMSのサンプルコードもthrowしている。
その点>>15の方がそのMSのサンプルコードには似ている。
とはいえthrowするなってのは環境的な問題もあるとは思うんだが。
0051デフォルトの名無しさん垢版2016/07/12(火) 02:28:01.69ID:SKMsT/RZ
>>6
tryで囲む領域が大きくなると、どこでエラーが起きたか、わかりにくい

throwはややこしい。
一々、これは内側、これは外側の関数で処理するとか、変わるのはややこしい

LinuxのようなC言語だと、関数の下の方に、
リソース解放などの共通処理をまとめて、gotoでそこへ飛ばすようにするけど、
まあ、ややこしいプログラミングは避けた方がいい

仕事のプログラムは、個人のプログラムとは、書き方が違ってくる。
初心者・新入社員も入って来るから、自分だけがわかる書き方はダメ
0052デフォルトの名無しさん垢版2016/07/12(火) 02:33:58.13ID:4M8hLvVe
>>50
そんな小さい処理で同じとか言われてもな。

resultって数字しか返せないだろ。
例外ならオブジェクトを返すことができる。
エラーとして返せる情報は無限大だ。
見つからないパスがどこか情報だって返せる。

あと自動で上に戻る機能。
とかさ、例外の機能をお前は理解してるか?
してないだろ。

なんでどの言語にも例外があるのかを考えよう。
必要だったから例外を作ったんだよ。
これぐらいは理解しろ。
理解したら、なぜ必要なのかの理由を調べろ。
0053デフォルトの名無しさん垢版2016/07/12(火) 02:36:15.80ID:4M8hLvVe
> throwはややこしい。
> 一々、これは内側、これは外側の関数で処理するとか、変わるのはややこしい

うん。馬鹿だからだと思うよw

処理する必要があるときだけ処理する。
それだけのこと。

っていうかさ、さっき俺が言ったことじゃん。
自分で何が適切かを考えられない。

マニュアルを用意してほしい、そのとおりにやりたい
自分で何も考えたくない。
やれって言われたからやりましたー。
だから俺の責任じゃないですー。

自分で考えることを何もしようとしない。
0054デフォルトの名無しさん垢版2016/07/12(火) 03:23:53.60ID:umCvEWis
>>47,48
だいぶ読んだ。

どっちがいいかは結構微妙だと思うんだけどね。
結局の所全体ポリシーとして「例外」を考慮しないといけないし、もちろんRAIIも徹底してないと危険。
だから出来るだけスマポというのはその通りだけど、
言っちゃ悪いけどRAIIとスマポだけで行く気なら最初からGC言語使えばいいだけだし。
むしろGC言語でGCタイミングをユーザが完全に制御可能にして例外使いまくりというのが正解か?

ついでに教えて欲しいんだけど、下記URLにある
https://msdn.microsoft.com/ja-jp/library/hh279653.aspx
no-fail/strong/basic保証ってのは単なる知識として考慮しろって話であって、
コンパイラに型として指示してコンパイラ側で全部整合性をチェックしてくれるようなことはないんだよね?

どこまで処理するかにもよるけど、原因が分かってそれを通知出来ればいいだけなら、
むしろ「例外機構」の設計が必要になる分、無駄なような気も。
なんつーか、将棋ソフトの駒クラスの例外を設計しようぜ!みたいな。

例えば、
> 発生することのないエラーをチェックするには、アサートを使用します。
> 発生する可能性があるエラー (たとえば、パブリック関数のパラメーターにおける入力検証のエラーなど)
> をチェックするには、例外を使用します。(>>47内URL)
つまり、将棋で言うと「二歩」「打ち歩詰め」は例外として処理しろってんだろ?
なんだかウザイだけの気が。(まあそれ以前に駒クラスが不要だが)

元々は正常処理と異常処理のコードを「見やすさ」の為に分離したいというところから来ているはずなのだけど、
その「見やすさ」を得る為に他も色々注意して設計しろというのは無駄/本末転倒だと思うね。
ただそのコストが環境整備によって極限まで低下したのであれば、それもありかとも思うけど。
それがWindowsの世界なのかなとはgoogleの付け足しから感じた。
0055デフォルトの名無しさん垢版2016/07/12(火) 04:39:01.98ID:Vf+ZIi05
Googleのスタイルガイドを読む限り、Windowsのコードの場合は独自性ガ強くて
どうにもならんところが多いからコーディング規則を逸脱しても仕方がないって感じだな
0056デフォルトの名無しさん垢版2016/07/12(火) 06:14:29.07ID:4M8hLvVe
>>54
あんたが例外を使ったことがないから
例外がすごく使いやすいってことを知らないだけ。
何かと理由をつけて使いづらいってことにしたがってるだけだな。

戻り値だと注意が必要な場面がたくさんあるが、
例外だとさほど注意しなくても正しく動くアプリが作れる。
なにせ例外処理する必要が有るところだけ書けばいいからね。
すべて正しく書かないといけないC言語方式は大変。
0057デフォルトの名無しさん垢版2016/07/12(火) 06:16:12.63ID:4M8hLvVe
例えばC言語方式だと、
printfの戻り値までチェックしないといけない。

ちなみにprintfが失敗する例として書き込み不可能な
デバイスに標準出力をリダイレクトする等がある。

例外だとチェックしなくても書き込みができなかったときに
エラーで中断してくれる。
0060デフォルトの名無しさん垢版2016/07/12(火) 10:09:09.18ID:3O9ex62E
例外よりeitherの方が使いやすいよ
型安全だし
0062デフォルトの名無しさん垢版2016/07/12(火) 10:10:01.65ID:3O9ex62E
例外よりeitherの方が使いやすいよ
型安全だし
0063デフォルトの名無しさん垢版2016/07/12(火) 11:43:29.90ID:K7Zjf19C
>>17はずれてるだろ

例外処理のメソッドを作った理由は「分割しなきゃならんほど複雑な処理している」からじゃなくて
「あちこちで発生する例外」を共通に処理するためだろ
だから当然再利用もしている
「catchすんのかthrowするのか」ってのも意味不明
0064デフォルトの名無しさん垢版2016/07/12(火) 20:39:39.22ID:cQbnp1H7
>>63
意図を汲んでくれてありがとう
0065デフォルトの名無しさん垢版2016/07/12(火) 21:54:41.73ID:cQbnp1H7
>>26
規約も規則もないみたいで好きに作っていいっていわれたからこう作った。
https://ideone.com/g1uE5d
ちなみにローカル環境でしか動かさないツールだから例外処理はログ出力ぐらいでしか
使わない。
ツールが落ちないようになってるならthrowしちゃいけない理由も特にない。
そうしたらなんでこういう風に作るの?はぁ、ちゃんと見ておけばよかっ、た。
って言われて、レビューとヒアリング聞いてみたの結果これが最適解だった。
コメントは言われたこと少し載せてみた感じ。
https://ideone.com/lbl7VW
これで伝わる?
多少おかしなとこあったとしてもそんなに意味わかんないことしたのかな。
ややこしい?
ファイル作るのにファイル名抜けてたりなんだりしてるけど黙殺してくださいごめん。
0066デフォルトの名無しさん垢版2016/07/12(火) 22:51:05.48ID:StomlD/Y
う〜ん、PG歴2年目くらい?
コードをたくさん書きたいお年頃的な
なんつーかクドい

下のコードで必要十分に見えるよ

>予期せぬ値って何?想定があるの?必要?(笑)
同じ感想でワロタ
0068デフォルトの名無しさん垢版2016/07/12(火) 23:25:13.63ID:umCvEWis
>>55
最後の「ルールの例外」からするとそんな感じだな。
夜はそこまで読んでなかったわ。

>>60,62
大事なことなので?
ってのはさておき、それについても布教用のドキュメントはあるのか?(例>>47)
ググッてもいまいち出てこないんだが。

>>47,48
こんな記述を見つけた。これって何言語か知らないか?
> 言語によっては基本保証やno-fail保証を静的に解析可能なものがあります。
> いくつかの言語ではno-fail保証をそのまま言語レベルでサポートしています。
> コードを静的に解析することでno-fail保証を約束するものもあります。
> また、基本保証を強制している言語や機構があります。
http://qiita.com/Kokudori/items/987073d59529b6c9a37c
0069デフォルトの名無しさん垢版2016/07/12(火) 23:28:42.89ID:VAaNpcds
>>66
初心者であるとかお年頃であるとか
そーいうのじゃない可能性もあるな

文章にしたって簡潔に書けない人おるやろ
あの手の人は死んでも直らない
0073デフォルトの名無しさん垢版2016/07/13(水) 00:48:21.46ID:wcqcmuYS
>>66
共通の例外処理を繰り返したくないと書かれてるじゃん
読解力がない上に自分の意見を押し付けるってさあ…
0074デフォルトの名無しさん垢版2016/07/13(水) 00:49:32.32ID:uq0wU9fp
>>65
おー書いたか、ご苦労さん。
俺が想定したものとは異なるが、それ以上に情報を含んでいたので、
レビューの様子もよく伝わったぜ。

まあ感想は他の連中と同じだな。
君は難しいコードを書いている。だから駄目なんだよ。
張り切って色々やろうとしているけど、それが駄目なんだ。
手を抜くことには努力を惜しまないってのが優れたプログラマだろ。
少なくともそのレビューと上司はまともだから、言うことを聞いた方がいい。

その上司のコードが何故いいか?それは簡単だから。
構造が単純だから、ぱっと見たらちゃんと動くことが分かる。
それに対して、君のコードはちゃんと動くかはよくよく見ないと分からない。

上司のコードは「自分で処理出来る例外はcatch、それ以外は放置」というポリシーだから、
基本的に下から上がってきた例外は「予想外」として落としている。
つまり例外ツリーは単純なツリー構造で、
このポリシーさえ守れば今後とも簡単に処理を追加出来る。
そして処理も基本的に上から下に処理されるだけだ。単純明快でいい。

対して君のコードは、そうじゃない。
よくよく読まないと果たしてちゃんと動くかどうかも分からない。
そして追加するにしても君が作ったクラスを全部知ってからでないと追加出来ない。
つまり、やることが増えすぎているし、密結合になっている。
対して減らせたのはせいぜいDirectry/Fileの例外の被り部分だけだろ。
それは明らかに設計コストを増してしまっている。
0075デフォルトの名無しさん垢版2016/07/13(水) 00:50:08.11ID:uq0wU9fp
多分勘違いしているのだと思うし、実際そういう奴も多い気もするが、
ベタに書くのが悪いとか、同じようなコードが2箇所に出現するのが悪いとか、
そういう単純な問題ではないんだ。
分かりやすく言えば、
「そのコードを初めて渡されて、ああこのコードはちゃんと動くだろうねと分かるまでに、何秒かかるか」
について最適化しろということなんだよ。
当たり前だが全く同じ内容がダブってたら読むのに2倍かかるから、
それはループなり多態なりして一つに減らせってことになる。
だけど無理に多態したりして「コードを追う手間」が増えるようでは駄目なんだ。

その上司のコードはさらっと読んだだけで動くのが分かる。
でも君のコードはあちこち追い回さないと動くかどうかも分からない。

もちろん君が書いたコードだから、君のコードを君が読むのには苦労しないだろう。
だからもし君に同様の同僚がいて、同様に駄目出しをくらっているのなら、
その時の両方のコードを君が初見で読みこんで、
その構造と動くかどうかを把握するまで何秒かかるかを比較してみればいい。
0076デフォルトの名無しさん垢版2016/07/13(水) 00:53:31.98ID:2JhFq5Nw
>>65
まずMain関数はこれだけだ。
これ以外不要。

public class Test {
 public static void Main() {
  try {
    CreateTempFile("targetPath");
    MaggageBox.Show("一時ファイルが作成されました");
  } catch(XXXException e) {
    MaggageBox.Show(e.Message);
  }
 }
}
0077デフォルトの名無しさん垢版2016/07/13(水) 00:59:57.51ID:2JhFq5Nw
CreateTempFileの中身はこうだな

void CreateTempFile(string path) {
 String directory_path = ディレクトリのパス(path);
 Directory.CreateDirectory(directory_path);
 File.Create(path);
}

ディレクトリやファイル作成時にExistsなんてやる必要ない。
Existsのチェックした後に、他プロセスから作成されることもある。
「チェック→実行」のパターンはロック機能がない限りたいていアンチパターン。
0078デフォルトの名無しさん垢版2016/07/13(水) 01:03:40.12ID:2JhFq5Nw
結局のところこの程度であればMainに全部入れてもよい良い

public class Test {
 public static void Main() {
  try {
    String path = "targetPath";
    String directory_path = ディレクトリのパス(path);
    Directory.CreateDirectory(directory_path);
    File.Create(path);
    MaggageBox.Show("一時ファイルが作成されました");
  } catch(XXXException e) {
    MaggageBox.Show(e.Message);
  }
 }
}

このコードを出発点としてだ。
メッセージを変えたいのであれば、
メッセージだけを変えるように工夫すればいい。

Mainに全部入れても良いと言ったが、CreateTempFile()という1関数で実行したいならそれもあり
その場合、CreateTempFile()でメッセージを変えたい例外だけトラップして
メッセージを置き換えて投げ直すだけで、Main関数は>>76のようにシンプルのままでいられる。
0079デフォルトの名無しさん垢版2016/07/13(水) 01:19:00.17ID:OE4fGXcq
なにこのキモいスレw
0080デフォルトの名無しさん垢版2016/07/13(水) 02:08:26.36ID:uq0wU9fp
>>70,72
情報ありがとう。

> 契約プログラミング
考え方はよしとして、大して採用されてないのは効果がいまいちだったのかな?

> noexcept
お?これはなかなか良い感じ。

ついでにそこから辿れる以下も読んだが、こちらも例外を有効活用しようとしている。
(より正確に言えば、例外を有効活用する時のライブラリの作りについてだが)
http://boostjp.github.io/archive/boost_docs/document/generic_exception_safety.html
例外の文法を使えば、確かに表現力は上がる。それは事実だが、ここに書いてあるように、
当然STLや自前クラスがどの例外保証を持っているかすべて把握してないと駄目だし、
完全活用するとなるとなかなか難しい気がするね。
(プログラミング時に把握しなければいけない項目が増える)

> HaskellのEitherモナド
Haskellの知識はないのでとりあえず日本語部分だけ読んでみたが、
この読み方では有効かどうかは判定不可能だorz
> C++やC#でそれっぽいコード
このURLをくれればすごく助かります。
0081デフォルトの名無しさん垢版2016/07/13(水) 02:16:26.70ID:2JhFq5Nw
> 当然STLや自前クラスがどの例外保証を持っているかすべて把握してないと駄目だし、

例外保証ってなんや?

その例外保証があるかどうかわからんものが
戻り値でエラーを返したら、それを保証してくれると
思う根拠は何や?

気をつけることがあるとしたら、それは戻り値でも同じだし
正常処理とエラーを、一つの戻り値(変数)に入れる分
複雑度は上がるんだぞ。
0082デフォルトの名無しさん垢版2016/07/13(水) 03:23:41.31ID:vjGvgzcz
>>65
ディレクトリを作れない時に、throwして外のスコープに飛ばすのは、ややこしい。
そこでエラー処理できる

外のスコープから見ても、内側からも、throwしてくると考えると、
考える組み合わせ数が増える。
組み合わせ爆発を避けるため、早期に枝切りすべき

また、内外のスコープで、情報を共有するため、
Commonというグローバル変数もどきを、作らざるを得ないから、
内外の関数が、密結合を起こしてしまっている

修正・保守していくうちに、こういうのがいずれ、スパゲティ・泥団子へと成長していき、
誰の手にも負えないようになっていく
0084デフォルトの名無しさん垢版2016/07/13(水) 06:22:04.43ID:7t1kL6eB
>>80
>契約プログラミング
C++だとBoost.Contract
.NetだとSystem.Diagnostics.Contracts
があるね
使ったことないけど

>例外保証
なんか、まじめに考え過ぎな気がする
どのクラスがどの例外保証を持っているかなんて、気にして書いている人なんていないんじゃないか
(と、言うとちゃんとやってる人に怒られそうだが)

例外安全、例外耐性を考慮して、きれいにやるなら把握しているに超したことはないけれど
基本的には「いちいち戻り値でエラー判定するのが面倒。戻り値だとエラー判定忘れることがある(アプリがエラー状態のまま動き続けてしまう)。例外をつかえばそれらを簡単に回避できる」くらいの感覚で使われてるんじゃないかな

例えばオブジェクト指向でクラス設計するときはSOLID原則を意識することはあれ、
そこまで厳密に遵守して書かないし、他人の書いたクラスがSOLID原則に則ってるかなんて気にしないでしょ?

それに今時の言語なら標準ライブラリが例外を投げるから、それらを使うなら自分のコードでも例外を使うことで
「このコードでは、エラーは常に例外で通知する」という一貫性が生まれる

プログラミングにおいて一貫性は重要だ
先日のGoogleのスタイルだと「例外を使わない」という点で一貫性がある

もちろん、現実世界ではそんなにすべてうまくいかないから
必要があれば戻り値のエラー通知を部分的に使うのはかまわないと思うよ
.Netにも例外を投げるInt32.Perseと投げないInt32.TryPersreの2種類があるし

>Either
"C++ Either"や"C# Either"でググれば「書いてみた」系のブログが引っかかる
0085デフォルトの名無しさん垢版2016/07/13(水) 07:23:43.92ID:L2fL/y00
おはようございます!
ご回答ありがとうごさいました。
そうかー難しいのか。
難しいということはたまに言われますが、なにが難しいのかわからなくていつも悩んでいるので、自分は設計には向いていないのかもしれません。
下流で頑張ります。
皆さんも今日一日頑張ってください!
それでは!
0086デフォルトの名無しさん垢版2016/07/13(水) 09:37:32.17ID:2JhFq5Nw
>>84
> .Netにも例外を投げるInt32.Perseと投げないInt32.TryPersreの2種類があるし

名前が重要なんだよ。(ちなみにParseな)

例外を使ったときのメリットは、関数の名前通りの戻り値にできるってこと。

Parseはパースするんだよ。だから戻り値はパースした結果であり
エラーを戻すことはない。パースできなければ例外。

TryParseはパースすることをトライするんだよ。だから戻り値はトライした結果。
もしトライすることすらできなければ、それは当然例外。

その2つは、例外を投げるかどうかの違いじゃなくてやる処理の違い。
そしてどちらもやるべきことができなければ、例外を返す。
0087デフォルトの名無しさん垢版2016/07/13(水) 19:05:13.08ID:OE4fGXcq
そんなに力説するほどの事か?w
0088デフォルトの名無しさん垢版2016/07/13(水) 21:38:19.72ID:2JhFq5Nw
>>87
これは力説するほどのことだよ。
なぜなら可読性の話だから。

英語わからんとか、ソースコードを命令の並びだとかしか
認識してないレベルの人にはわからないだろうけど、
ソースコードは読むもの。

読みやすさを大きく左右する要素の一つが、
適切な名前をつけているかどうかだから。

たまに適当な関数名つけてる人がいるけど、ほんとやめてほしい。
適当な単語を並べただけじゃソースコード読めないから。
名前から意味がわからないから、中の処理を読んで解析しないといけなくなる。
0089デフォルトの名無しさん垢版2016/07/13(水) 21:54:55.05ID:OE4fGXcq
それなら問うが
Parseが返すパーズした結果とは何ぞや?
TryParseが返すトライした結果とは何ぞや?
俺には名前だけではさっぱり分からんのだが
これがお前の望む適切な名前とはとても思えんのだがw
0092デフォルトの名無しさん垢版2016/07/13(水) 22:44:01.74ID:uq0wU9fp
>>84
例外をエラー通知として使う分にはその辺は知らなくていいんだよ。
ただ、例外で復旧させようとするのなら、その辺を全て把握する必要がある。
そして彼等はそれにも耐えられるようにSTLを整備しようとしている。
それは無駄なコストを発生するから、それについて彼等も議論しているわけだ。

ただ、今見た限りはまだ環境が追いついていないね。(ドキュメントが出来ていない)
偶々このページを見ていただけだから、unordered_map自体に意味はないけど、
http://en.cppreference.com/w/cpp/container/unordered_map
個々のメソッドには例外発生時の動作が書いてあるけど、本体のページに纏まっていない。
だからunordered_mapを使ったらどの例外安全になるのかを確認する為には、
全部のメソッドを確認するしかない。
大半の奴は確認もせずに「例外を使った方が安全です」と信じているだけだろう。

例外を活用しようとなると、既に書いたように、大ジャンプを避けられない。
その場でいちいち判定するだけなら、余計に汚らしくなるだけだ。
ただしこれについては速度面ではtry/catchの方が上だと指摘されているし、
表面上のコード量では確かにそうだ。
とはいえ、x86に於いては分岐予測+投機実行なので、
ほぼ常に通らないパスのif-elseifについては、
気になるのなら1段目で切ってしまえば速度低下はしない。(if (result>0))
0093デフォルトの名無しさん垢版2016/07/13(水) 22:44:36.15ID:uq0wU9fp
> 必要があれば戻り値のエラー通知を部分的に使うのはかまわないと思うよ
個人的にはTryParseをよく使っている。それで十分だから。
必要性はない。try/catchでも書ける。

戻り値判定の場合は、その場での処理が強要される。
結果、65の上司型のコードしか書けない。
実際にあのコードを戻り値判定に変換するのも簡単だ。
この使い方をする場合は好みの問題でしかない。

一方、例外を用いれば、65がやろうとした「積極的にthrowして統合的に扱う」ことも出来る。
戻り値判定でこれをするのは大変なことになるので、これをしてこそ活用だと言える。
とはいえ、これがろくな事になる気配が全く感じられない。

ちなみに、言語的な例外復旧能力に必ずしも頼る必要はない。
上位レベルでの復旧も実は簡単だからだ。
例えばTryParse、ファイルから読むのならソースは保持する必要がない。
Seek出来ないネットワークストリーム等なら、MemoryStreamに一旦受ければいい。
JSONみたいに階層ありオブジェクトを丸々生成するのなら、成功した後に差し替えればいい。
これらの場合は、ロールバックを上位で行うことはほぼ自然に出来てしまうので、
結果的にSTLが実装した例外機構の為に無駄に税金を払う事にしかならない。
この点を修正しようというnoexceptはC++っぽくていいが、
なるほどこんな事をやっているうちは生Cを駆逐することは出来ないだろう。
0094デフォルトの名無しさん垢版2016/07/13(水) 22:45:05.83ID:uq0wU9fp
生Cはある意味世界がno-fail保証されている。
そして失敗した場合は上記のように自前で戻すか、諦めるしかない。単純な話だ。
ロールバックする気なら、この点については例外で処理した方がコード的には楽だ。
しかし実行効率ではどうやっても生Cの方が上になる。何もしてないコードだからだ。
生Cは世界が単純に出来ている。あまり気にしたことはないが、これは大きな利点だね。
言語がシンプルな結果、シンプルな記述を強要され、結果的に65のようなコードを記述出来ない。
65みたいな「考えすぎておかしくなっている奴」には生Cギプスが効くかもしれない。

> .NetだとSystem.Diagnostics.Contracts
以下を見る限り、型についてのTDDみたいな感じだな。
静的チェックが出来るのはいいね。ただ、流行るかと言われれば微妙かな。
https://visualstudiogallery.msdn.microsoft.com/1ec7db13-3363-46c9-851f-1ce455f66970

> C++ Either
以下でいいか?
http://faithandbrave.hateblo.jp/entry/2014/05/30/153325
つまりは例外を呼ばずに値として埋め込みたいだけか。
関数型で組んだ場合には個々の要素で例外呼ばれても困るから、そりゃこうなるだろう。
そういった意味ではC++の例外機構は「手続き型」にしか対応してないね。
そこですぐ呼ばれる前提だ。

他の関数型言語の例外機構ってどうなっているんだ?知ってたらよろしく。
Haskellがこの手で値埋め込み、後でユーザ側で確認するというのは分かった。
なおJavaScriptは0割は無限大になるというお気楽仕様だ。
当初は驚いたが、正直これで問題ないよなとも思う。
0095デフォルトの名無しさん垢版2016/07/13(水) 22:58:10.35ID:2JhFq5Nw
>>89
> Parseが返すパーズした結果とは何ぞや?

正しくはInt32.Parseなんだから当然Int32だろw
Int32に変換した結果を戻す
(変換できなければ戻さない)

> 俺には名前だけではさっぱり分からんのだが

あー、うん。クラス名が先に作ってことに
気づかなかったのねw
>>86で引用してる>>84にかいてあんだろ。
気づけよw
0096デフォルトの名無しさん垢版2016/07/13(水) 23:09:44.65ID:jyyAd6hv
Int32.Parse だからといって、必ずInt32が返るとは限らないだろ
おまえは、human.age()で必ずhumanが返ると考えるか?
0097デフォルトの名無しさん垢版2016/07/13(水) 23:11:23.52ID:2JhFq5Nw
>>94
> なおJavaScriptは0割は無限大になるというお気楽仕様だ。

いや、お前、例外っていったら0除算しか思いつかんのかよw
eval("{") とか実行してみろ。JavaScriptは例外を使う言語だ。

0以外の数値を0で割ったら無限大になるのは数学的に正しい。
JavaScriptが無限大を扱える言語ってだけだ。
もちろん数学的に正しいことをやっているから、 0 / 0 は NaN (非数)になる。
少なくともこの点は、お気楽ではなく高度な言語だと言える。

もっともJavaScriptに例外が搭載されたのはJavaScript 1.4(1999年あたり)からだけどな。
それ以前は(エラーを戻り値で返すのではなく)スクリプトが停止され
window.onerrorイベントが呼ばれたんだっけな?もう忘れたが。
0098デフォルトの名無しさん垢版2016/07/13(水) 23:11:30.03ID:jyyAd6hv
いっとくが、human.age()で必ずintが返るとは限らないからな
もしかしたらageオブジェクトが返るかもしれないからな
0099デフォルトの名無しさん垢版2016/07/13(水) 23:12:49.31ID:2JhFq5Nw
>>96
> Int32.Parse だからといって、必ずInt32が返るとは限らないだろ
> おまえは、human.age()で必ずhumanが返ると考えるか?

Parseとageで関数名が違ってるじゃんw
名前で返すものが決まるって言ってんだろ。

human.parseだったら、human返すんじゃねーの?
0100デフォルトの名無しさん垢版2016/07/13(水) 23:13:53.29ID:jyyAd6hv
>human.parseだったら、human返すんじゃねーの?

そんなの思い込みだろ
ヒューマンパーズオブジェクトが返るかもしれないだろ
0101デフォルトの名無しさん垢版2016/07/13(水) 23:18:25.58ID:2JhFq5Nw
>>94
> 他の関数型言語の例外機構ってどうなっているんだ?知ってたらよろしく。

関数型で戻り値でエラー情報なんか返したら
大混乱になるわw

関数呼び出しの中の、関数呼び出しの中の、関数呼び出しの中の、関数呼び出し で
エラー情報が返ってきたら、if式による分岐の嵐でもはや
関数型言語のように見えないだろうね。
0102デフォルトの名無しさん垢版2016/07/13(水) 23:22:40.62ID:2JhFq5Nw
>>100
> ヒューマンパーズオブジェクトが返るかもしれないだろ

ほらね? 何が返るか想像できてるじゃんw

Int32.Parseじゃ何を返すかさっぱりわからないって言ってるから
それが間違いだよって話。

なにも100%完全に返り値の情報がわかるなんて言ってないんだよw
0103デフォルトの名無しさん垢版2016/07/13(水) 23:36:52.14ID:C7S+nyqs
型を見りゃいいだろ

まさかこのスレに居ながら、屁臭いペチプ〜やゴミのペールやペールの糞からひり出されたルビーや・・・そんな糞まみれのウンコ野郎はおるまいね?
0104デフォルトの名無しさん垢版2016/07/14(木) 00:31:59.76ID:4Ps/X1K6
>>102
いやお前それ苦しいだろ

>ほらね? 何が返るか想像できてるじゃんw

想像?
思い込みでしょ
ヒューマンパーズオブジェクトが返るかもしれない、とは書いたが
実際には何が返るかわからないから、そう書いただけであって
どうせ、仕様を調べなきゃならないんだよ
0105デフォルトの名無しさん垢版2016/07/14(木) 01:02:32.63ID:9qkjMq+e
>>104
言うと思ったw

でお前これから先仕様なんて調べるの?
調べないよね。もう覚えてしまったから。
あとは文字を見れば思い出すはずだ。

適切な名前があると覚やすいっていうのはこういうこと。
0106デフォルトの名無しさん垢版2016/07/14(木) 01:31:15.59ID:rhZMoeJF
>>101
>関数型で戻り値でエラー情報なんか返したら
>エラー情報が返ってきたら、if式による分岐の嵐でもはや

ifの分岐しないためにfunctorだのアプリカティブだのmonadだのtraverseがあるじゃん?
try1 >=> try2 >=> try3 >=> ... tryN
みたいので「成功するまで処理を続けて失敗したら例外情報をもって途中で抜ける関数」を作れるし
こういう合成力は関数型の強み
0107デフォルトの名無しさん垢版2016/07/14(木) 06:27:39.21ID:cfi8dg7p
自分の思い込みの通りなら良い設計良いコードw
0108デフォルトの名無しさん垢版2016/07/14(木) 07:26:28.53ID:xgZTwt3g
正しく意図した通りに騙してくれるなら
明らかに良いコードだろ
頭のてっぺんからケツのシワまで数え上げてようやく読解できるコードが糞じゃなきゃ何なんだ
0109デフォルトの名無しさん垢版2016/07/14(木) 07:44:38.40ID:cfi8dg7p
クソの主観によりクソ認定されたコード達w
本当は良い奴も沢山いただろうに不憫だわーw
0111デフォルトの名無しさん垢版2016/07/15(金) 23:14:34.82ID:/IkQTUfk
DAO とかDTO ってのが出てくるアーキテクチャは手続き型であって、オブジェクト指向ではない

ってのが解る人ここにいるか?
0113デフォルトの名無しさん垢版2016/07/15(金) 23:39:15.88ID:iR/HdeCl
今の日本人は>>111みたいな馬鹿が普通なんだお
0115デフォルトの名無しさん垢版2016/07/21(木) 23:36:49.83ID:vaQfL518
オブジェクト指向なのはEntityを使ったタイプのO/Rマッパーだね。
Railsとかもそう。DAOやDTOなんてのは出てこないで
データベースがオブジェクトにそのままマッピングされる。
0118デフォルトの名無しさん垢版2016/07/30(土) 00:56:46.87ID:crIAC8Sk
言いたいのは単純に

DAO/DTO

オブジェクト指向論で定義されたものじゃない。
オブジェクト指向で実装されただけで、これらを使うには手続きが必要だ。

それだけだろ。
0122デフォルトの名無しさん垢版2016/07/30(土) 08:02:13.88ID:gkAo/Cig
>>118
逆だろ
使うのはオブジェクト指向にするためで
その実装の中身は程度の差こそあれ
DBを相手にする以上手続き的にならざるを得ない
0123デフォルトの名無しさん垢版2016/07/30(土) 08:03:21.46ID:cz6waps9
知ったかぶりにすらなってなくて意味のない単語の羅列にすぎん
0124デフォルトの名無しさん垢版2016/08/04(木) 16:27:41.40ID:pdTKskF+
クラスの中に別のクラスをコンポジットしてあり、
そのクラスの中にも別のクラスをコンポジットしてあり…という場合、

最下層のクラスに必要な値を入れるために何度もメソッドを経由するのが大変なのですが
オブジェクト指向ではこれが普通なのでしょうか?

カプセル化せずに
outerClass.middleClass.innerClass.set_value(100);
とした方が楽だと思うのですがまずいでしょうか?
0125デフォルトの名無しさん垢版2016/08/04(木) 19:08:09.61ID:w6fnMNqO
別に良いけど
innerClass.set_valueが呼ばれて値が変更されたときに
変更されたことをouterClassやmiddleClassに通知する仕組みが必要になるかもしれないよ
この場合、余計にややこしくなる

そのほかのディメリットはカプセル化しないことで発生するディメリットと同じ
0127デフォルトの名無しさん垢版2016/08/04(木) 22:17:26.33ID:9BD7w8j0
>>124
更に言えば
実装方法としても、set_valueは分かり難いし楽でも何でもない
あえてやるなら
outerClass.set_value(key, value)とか?
0128デフォルトの名無しさん垢版2016/08/04(木) 22:24:04.58ID:dkWDRS+N
>>127
最低のやり方だな
そのk,vのMap、実行するまで完全なブラックボックスになるじゃん
死んで、どうぞ
0129デフォルトの名無しさん垢版2016/08/04(木) 23:34:15.07ID:dkWDRS+N
>>127
くっせ〜なホント
こういうペチプ〜崩れの塵屑見ると延髄チョップからのバックドロップ食らわせてやりたくなるわ
まじな。死ね。
0130デフォルトの名無しさん垢版2016/08/04(木) 23:36:44.15ID:dkWDRS+N
なんでもarrayにしときゃいいと思ってるド低脳
チンパンジー以下のサルゥ
ほんとつっかえ・・・
0133デフォルトの名無しさん垢版2016/08/05(金) 07:18:34.18ID:ZdrtHNhg
イコール代入するなら、最後は明示されたセッター呼ぶのは中途半端な気がする。

各クラスにユーティリティメソッド実装できるなら、
outerClass.getNodeFromPath("middleClass.innerClass").set_value(xxx)
とか取得関数持っちゃうと、文字列だけ不細工だけどなんとでもなったりするんじゃないかな。
0137デフォルトの名無しさん垢版2016/08/11(木) 00:16:35.15ID:OU7OxTj6
>>136
トウアは仕事をしない、仕事ができない人間を抱えすぎていたのと、資金がもともとないのにオフィスを分散させたり、複数社のグループにしていたせいで効率が悪かった。

これは会社を大きく見せたい人間が社長の会社の典型的なパターン。

中間搾取でも取引先の支払いが遅いと資金が足りなくなって破たんする。

最後はとにかく仕事を増やして乗り切るつもりだったんだろうけど追いつかなかったんだろうな。

プロパーのレベルが低いのは、賢いSIer、ユーザー企業も分かってたし、仕事をここの下請けに丸投げ、押し付けているのも分かるから仕事が取れなくなっていた。

ドコモあたりのアホ企業頼みだった。
0140デフォルトの名無しさん垢版2016/09/17(土) 22:40:32.14ID:hd6Wyy09
人の意見を聞かずにバッサリ切り捨てる、典型的な2ch脳な人が
のさばり出した時点で離れた。
0141デフォルトの名無しさん垢版2016/09/19(月) 10:09:43.20ID:bJUofi69
それぞれに結論がでてる状態なんだろ?
俺も一連のやりとりでオブジェクト指向ってやっぱりクソだなって再認識した
0143デフォルトの名無しさん垢版2016/09/19(月) 12:18:29.50ID:0K/woKyj
手続き型は誰でもわかるが工数が多すぎてな
ビジネスでやる以上工数は節約しなきゃ
0144デフォルトの名無しさん垢版2016/09/19(月) 12:59:11.35ID:KUojTFe6
誰でもわかる明朗なコードを書かなくてはいけない
ビジネスだからこそ、手続き型がナンバーワン
ビジネスは君の趣味ではない
0145デフォルトの名無しさん垢版2016/09/19(月) 13:02:51.87ID:xTk+6xzH
ビジネスだからこそお荷物は解雇しなきゃならない
ある程度の能力のある人間が工数を減らせる手法で開発する
工数の掛かる手続き型しか書けない読めない人は解雇するべきビジネスだから
0147デフォルトの名無しさん垢版2016/09/19(月) 14:10:27.86ID:VkQagIEW
成長しない新米プログラマをいつまでも傭い続けるわけにはいかない
ビジネスってさボランティアじゃないんだよね
0150デフォルトの名無しさん垢版2016/12/27(火) 23:00:43.33ID:DbM4OtJE
ViewModelってどのレイヤーに属するんだ?
Viewに関する知識はないからUIレイヤーではないだろう
ビジネスルールに関する知識は必要だからドメインレイヤー?
0152デフォルトの名無しさん垢版2016/12/27(火) 23:10:35.70ID:+TUrL10Q
あ、あとViewModelに必要な知識はビジネスルールじゃなくて
ドメインレイヤーのインターフェースだけじゃないのかな?
ビジネスルールに関することはモデル内で処理するべきだと思って作ってるけど…
0153デフォルトの名無しさん垢版2016/12/27(火) 23:37:51.54ID:DbM4OtJE
>>152
俺も最初はそう思ってたけど現実にそれではうまくいかなかったんだ

Hoge
x
y
z => sqrt(x * y)
このエンティティはビジネスルール上の不変条件としてx * y >= 0でなければならないとする
普通ならxとyのセッターで不変条件を監視して不正ならすぐに例外を投げる実装になる
ドメインレイヤーのModelって基本的に全てこんな感じ

でもViewModelでは不変条件を常には満たさなくてもいい
その代わり不変条件を満たしていない事を検知する方法が必要って感じになると思う
つまりこんな感じ
HogeViewModel
x
y
z => x * y >= 0 ? sqrt(x * y) : null
hasError => x * y < 0
xとyのセッターでは不変条件の監視をしないで不正な値も受け入れる
ただし不正な状態ではhasErrorが真になる
xとyは入力コントロールに、zは出力コントロールにバインドされる
hasErrorはエラーアイコンやコントロールの色にバインドされる

両者はビジネスルール的には同じ事を表現しているはずなんだけどドメインModelとViewModelでどうしても別々の実装になってしまう
ViewModelからドメインModelを参照するだけではうまくいかないしどうしてもViewModelにビジネスルールが染み出してしまう
0154デフォルトの名無しさん垢版2016/12/28(水) 00:02:52.91ID:KMmXCa3M
自分は個人で作ってるだけで好きなようにやれるからだけど、
そういう場合、自分はxもyもそのままモデルに投げてその処理はいったんそこで終わり。
モデルで値をチェックしてエラーならエラーイベント発生
→入力用ViewModelがそのイベントを受け取ってViewに伝えるDataErrorイベント発生
→Viewが変化

zについても、モデルから受け取ったPropertyChangedイベントをViewに中継するだけにする、かな…

あくまでも、x,yの値によってモデルが例外を投げないように自分で作れるからだけど…
0155デフォルトの名無しさん垢版2016/12/28(水) 20:24:38.28ID:b06lzq40
限界あるな
xにうんこって入れられても一旦は保存するってことだろそれ
まさにクソまみれ
0156デフォルトの名無しさん垢版2016/12/28(水) 21:08:30.55ID:YF6A9Wev
ViewModelが勝手に「これはうんこだ!捨てておこう!」「これはうんこじゃない!大丈夫だ!」
なんてやってる方が、いずれシステムがうんこまみれになる危険が高い気がするが…

人間だって、目がうんこの反射光をとらえて、視神経がそれを脳に伝えて、
そして最後に脳が「うんこだ!汚い!」ってやるんだから
Modelが「うんこだ!汚い!」と判断するまで、
ViewやViewModelが入力情報をそのまま伝えていくことを
「うんこを一旦保存」とかとらえるのはおかしいと思うんだけどな…
0158デフォルトの名無しさん垢版2016/12/28(水) 22:03:00.40ID:b06lzq40
そもそも画面仕様が専用であるはずなのに
データ型のみModel依存ってこだわりがうんこ
画面なんか内部も含めて作り捨て上等だろ
0159デフォルトの名無しさん垢版2016/12/28(水) 22:06:08.16ID:b06lzq40
次の変更は一度にたくさん入力したいのでExcelかcsvから読み込んでもらえますか?
だったら一生懸命付けた汎用性もm9(^Д^)プギャー
0160デフォルトの名無しさん垢版2016/12/28(水) 23:01:11.92ID:gapvLjp6
画面の検証は入力長、上下限、正規表現など簡単なものだけ採用する
自動計算項目も簡単なものだけを採用する
例えば金額と税率から税込価格を自動計算するとか商品コード入力したら商品名取ってくるとかその程度で我慢する
画面の検証や自動計算項目はあくまで入力支援が目的なのでビジネスルールに完全に遵守する必要はない
ビジネスルールを厳密に守らなければいけないのはアプリケーションサービスインターフェースより向こう側だけ
アプリケーションサービスの内部で画面か受け取った入力内容をドメインモデルにマップしてそこで本気の検証や計算を行う
0161デフォルトの名無しさん垢版2016/12/29(木) 00:14:19.42ID:5yPVbf0y
一切関知すべきじゃないな。
うんこかもしれないもの、としてVM以降に渡して、うんこではないものを貰うしか無い。
0163デフォルトの名無しさん垢版2016/12/29(木) 02:16:04.01ID:ZpKqxRRa
>>161
小数じゃないのに小数点が入力できちゃったり
マイナス値なんて取らないのにマイナスが入力できちゃったり
全角なんて入力してほしくないのに全角で打てちゃったり
ファイルパスを入力して欲しいのにパスに入力できない文字が入る
その状態でファイルオープンダイアログ開いたら死ぬの?とか
素人丸出しアプリだな
visualstudioでプロパティいじれば解決する話をわざわざコードで記述してバグる超絶欠陥製品にしかならないだろうね
すべての値のチェックを入口で退治するんではなくて一度保持してしまうから問題を拡散している
undoしたらどこの値に戻るの?それ
0164デフォルトの名無しさん垢版2016/12/29(木) 02:36:25.34ID:RruPXahs
>>163
何を誤解してるかわからんが、それは、ビューモデル以外の場所で即座に否定されたり、是正されたり、これはは間違ってますよとエラーと判定されるから、
ビューモデルは、判定結果をおとなしく持って、ビューにレンダリングしてもらうだけじゃん。

お前がやってんのは、それはVMの仕事じゃない。
0166デフォルトの名無しさん垢版2016/12/29(木) 10:19:02.48ID:BD9K+jOv
>>163
そういうのは大前提としてやった上での話だよ
整数入力コントロールには指定した桁数いないの数字しか入らない(アルファベットなどはキーを押しても入力されない)
その上でビューモデルにどこまでビジネスルールの知識を与えるか、ドメインモデルとの違いはなんだ、という議論をしている
0167デフォルトの名無しさん垢版2016/12/29(木) 10:37:25.80ID:vPLPY1D6
>>165
データを処理する処理に徹することができるのと
データを描画する処理に徹することができるんじゃん。
0170デフォルトの名無しさん垢版2016/12/29(木) 11:49:35.65ID:3hi3YdfK
はっきり言ってしまうと経験が浅いから掲げる理想が陳腐
大規模DBとそれを操作するインターフェイスを真似たモデルであれば
画面なんてプロジェクトごと作り捨て上等なんだよ
DBはもう誰も仕様変更を入れられない
画面は実現したい内容によって完全廃棄もありうる
これが現実なんだよ
0171デフォルトの名無しさん垢版2016/12/29(木) 12:03:50.76ID:orpg8/1p
>>169
VとMVの分離のメリットなら2つ大きいのがある
1. UIの状態数の最小化
2. 手続型から宣言型への移行
0172デフォルトの名無しさん垢版2016/12/29(木) 12:23:28.51ID:orpg8/1p
>>170
画面を使い捨てる前提ならますます分離した方がいい
ひと昔前はViewにビジネスロジックが当たり前のように書かれていた
こういう画面は本当に使い捨てていい画面なのか判断が難しい
画面を使い捨てる前にリファクタリングを行いビジネスロジックを抽出して分析しなければならなかった
必要なビジネスロジックは残して別の画面から利用するように変更しなければならない
この作業が全てうまくいけばようやっと画面を使い捨てる事が許される
0173デフォルトの名無しさん垢版2016/12/29(木) 13:00:59.69ID:3hi3YdfK
だからさ
現実にはできないじゃん
ちょっと突っ込まれるだけでボロボロ抜けが出てくんだから
0177デフォルトの名無しさん垢版2016/12/29(木) 19:34:31.18ID:AIw2bcpm
>>168
割と大規模やってるけど、気合でWPFに移行してからそこそこうまく行ってるよ。
出来なくて切った会社は沢山あった。
0178デフォルトの名無しさん垢版2016/12/29(木) 22:28:45.06ID:ZpKqxRRa
>>177
そんな多大な犠牲を払ってようやくできたのか?(笑)
設計ってみんながわかりやすくするためにするもんじゃないの?
選ばれし者しかできない時点で失敗してるんだよ
わかる?
0179デフォルトの名無しさん垢版2016/12/29(木) 23:34:45.76ID:5yPVbf0y
>>178
莫大な犠牲は下請けが払ったんだと思うよ。
選ばれしものしかできないとは思わないが、
選ばれしものが出来ないのはある程度あるんじゃないの?
馬鹿とか。
0180デフォルトの名無しさん垢版2016/12/30(金) 01:32:03.00ID:JXfD++Nt
>>179
何のための画面と内部の分離だったの?
メリットが見えない
選ばれし者しか理解できないソースと組んだやつしか読めないソースの品質の違いが俺にはさっぱりわからないよ
0181デフォルトの名無しさん垢版2016/12/30(金) 08:31:43.34ID:fHdmB1av
>>180
前者は選ばれしもの(といってもWPF程度なら並みのプログラマで十分なので選ばれしもというのは大げさだが)なら超低コストで保守できる
後者は書いた本人も含めて保守に膨大なコストがかかる
このようにコストが全く違うわけだけど何故同じと思ったのか理解し難いね
メリットが見えないんじゃなくて見えないフリしてるだけだろきみは
0182デフォルトの名無しさん垢版2016/12/30(金) 09:27:05.84ID:0uD1Maua
インスタンスメソッドは選ばれしものにしか使えないから
全てスタティックメソッドにしなさい
ってことですか?
0186デフォルトの名無しさん垢版2016/12/30(金) 10:21:30.65ID:JXfD++Nt
>>181
え?でもいまの状態で画面と内部の分離ができてないじゃん
値のチェック前に一旦値を保存するんだよね?
内部に問い合わせないとチェックする内容がわからんから
偉そうなこと言ってるけどできたもんはゴミじゃん
0189デフォルトの名無しさん垢版2016/12/30(金) 12:14:51.41ID:tYlkXQKT
ViewModelからModelに入力値の通知を行うことを「保存」と呼ぶ頭のおかしい人が約1名いるだけ
0190デフォルトの名無しさん垢版2016/12/30(金) 15:13:10.80ID:NIWDNqpS
なるほど
どうりで話が通じんわけだ
0191デフォルトの名無しさん垢版2016/12/30(金) 15:29:32.71ID:7Zd5OH2Q
>>180
画面直すのかデザイナさんにもできる、
ロジック直すのが画面に一切影響しない事を謳ってプログラマだけで出来る。
これ大規模だと結構大きいよ。デザイナさんに動いてもらうのそこそこかかるし。

>>186
一旦保存って何かわからん。VMの変数に持つよね、って事?
VMの変数に持とうがなんだろうが、入力値と使用値と出力値が同じ所(例えばテキストボックス)に表示されるのは、そもそもが事故の元だよ。
0194デフォルトの名無しさん垢版2016/12/30(金) 21:13:04.65ID:0uD1Maua
なぜオブジェクト指向の設計の話になると喧嘩になってしまうのか?
やはり関数型にすべきでないのか?
0195デフォルトの名無しさん垢版2016/12/30(金) 22:35:50.28ID:VqDrYuY4
>>194
モナドを許すか許さないか論、原始再帰関数の定義の喧嘩になるのがオチ。
手続きとしてCPUが処理している所に別のパラダイム持ち込むとこうなるし、
関数としてGPUが処理している所に手続きを持ち込むと同じように異論は出てくる。
0196デフォルトの名無しさん垢版2016/12/30(金) 22:36:08.50ID:KB0M7zpX
喧嘩がなくなるなら関数型喜んでつかうわ
0197デフォルトの名無しさん垢版2016/12/30(金) 22:54:38.14ID:G92pvYFd
工数の少ない方を採用するなぁ
何が何でもオブジェクト指向!ってのは手段が目的になっちゃってるように感じる
0199デフォルトの名無しさん垢版2016/12/31(土) 07:44:43.00ID:XK+xRs9l
工数最小マンって無責任だと思うよ
保守は他人がやるからラピッドでええやんってクズばかりだから業界全体が停滞してるんだよ
多少工数が増えてもエレガントなOOPで作るべきだ
というかそもそも工数ベースで見てもOOPの方が優位だけどな
0201デフォルトの名無しさん垢版2016/12/31(土) 10:34:26.84ID:H2pBZ8ZG
>>199
ん?でもさぁ
汎用性つけまくった挙句に次の変更が来なかったら汎用化にかけた工数は無駄じゃない?
0202デフォルトの名無しさん垢版2016/12/31(土) 11:05:14.41ID:XK+xRs9l
>>201
汎用性と保守性を混同するのは初心者にはありがちだけど全く別のものだぞ
OOPはまず保守性を高めてくれるってのが主だ
結果として見ると汎用性もオマケで付いてくる場合が多いってだけだ
0206デフォルトの名無しさん垢版2016/12/31(土) 13:03:52.81ID:I0WFUQzY
>>204
OOPならではの部分を強調してほしかったが
疎結合とモジュール性についてまっさきに触れているので結果的に好感触

>>205
聞いて損した
0215デフォルトの名無しさん垢版2016/12/31(土) 17:40:02.54ID:YOFqYiBF
工数気にするのって完全受注型で自分とこで商品開発できないようなところだろうなと思うわ
0217デフォルトの名無しさん垢版2017/01/06(金) 17:03:12.17ID:rigfFBS6
オブジェクト指向の良書教えて
0220デフォルトの名無しさん垢版2017/01/07(土) 11:22:42.01ID:IG42UiTG
>>204
手続き型でもできる。
というよりオブジェクトみたいに状態に注目するより
メッセージやメソッド、関数に注目するほうが自然な場合もある。
まあオブジェクト脳だとそういった処理をまとめたクラスを作るんだろうけど。
0223デフォルトの名無しさん垢版2017/01/07(土) 21:45:21.54ID:6fDgBl5y
>>220
> 手続き型でもできる

それはとても興味深い指摘です。後学のため、
これぞ手続き型の(つまり「そこまでやったらもはやOOP」とは言わせない、そういった小細工のない)
コードで実演してみてもらうことはできますか?
0224デフォルトの名無しさん垢版2017/01/07(土) 23:48:37.74ID:8zzGw/ml
そもそもオブジェクト指向にメリットなんかないのにやり方がわからないとかさっさと廃業しろ
0225デフォルトの名無しさん垢版2017/01/08(日) 00:04:42.83ID:MJfiP+Ss
デストラクタは OOP でないと難しいね
え?ポインタの存在自体が邪道ですか?そうかもしれないですかね‥
0226デフォルトの名無しさん垢版2017/01/08(日) 01:57:35.09ID:91a1aYUK
デストラクタってOOP以前からあるしOOPと直結する関係性もない
それになぜいきなりポインタ?もはや何が言いたいのか判らない
0227デフォルトの名無しさん垢版2017/01/08(日) 08:49:06.62ID:FbXxDY90
そう難しく考える必要はなく物事をシンプルに考えていくと自然とOOPにたどり着くんだけどね
OOPに拒否感を持つ人はその当たり前の感覚を持っていないアスペなんじゃないかな
子供の頃いじめられたりしなかったか?

機械的な命令並べてgotoするより意味的な命令並べてifとかloopとか使ったほうが簡単だな
同じ処理をなんども書くより関数にしたほうが簡単だな
引数が多くて煩わしいから一緒に使う変数をまとめて構造体にしたほうが簡単だな
この構造体は特定の関数以外から変更されたらそれらの実行の前提条件が崩れるからそれら以外からメンバに触れないようにアクセス制御したほうが間違えなくていいな
それらの関数を構造体と同じ箇所で定義すれば管理しやすいな
メンバ変数みたいにドット演算子でそれらの関数にアクセスできれば楽だな
………

こういう感覚は別にOOPを知らなくてもコーディングを簡単に安全にしたいという欲求があれば自然とたどり着くものなんだけど
感覚がおかしいのかガチで気が付かなかったのか
たどり着けないかわいそうな子も世の中には少なからずいるんだね
0228デフォルトの名無しさん垢版2017/01/08(日) 08:58:29.82ID:FbXxDY90
なんていうかね
棍棒だと重いし動物殺しにくいけど木の棒の先っぽに鋭い石括りつけたら軽くてめっちゃ殺せるんだけどウホホwww
正直この程度の発想でしかないんだよ
OOPってそんなに高尚で難しいものじゃない
それをわざわざ難しい概念だと錯覚して悩むのは時間の無駄じゃないか?
OOPとはなにかOOPの存在意義はなんて哲学者みたいなことを考えてないでさ
自分の感覚に従ってOOPってよくわからんけど手続き型より楽だわウホホwwwって気楽にコーディングすればいいんだよ
0229デフォルトの名無しさん垢版2017/01/08(日) 09:38:52.74ID:oIuk3BCz
なんで人格攻撃に移るの?
自分の中で辻褄が合ってないから反論できないのに他人を叩くことでそれを解消しようとするのは間違ってる
お前は技術者を廃業しろ
0231デフォルトの名無しさん垢版2017/01/08(日) 10:35:35.87ID:uhuLxfGv
> 物事をシンプルに考えていくと自然とOOPにたどり着く

逆だろうね
物事を自分のおつむの程度にしかとらえられない人間がようやくたどり着いたのが>>227が書てるOOPもどき
この程度の理解の人間がOOPを真に理解してそのメリットを引き出せているとはとうてい思えない
0232デフォルトの名無しさん垢版2017/01/08(日) 10:35:39.50ID:jdkn79Su
>>229
残念ながらこれもOOPがらみでよく見られる光景
追い詰められてならまだしもわりと最初のほうからこれだもんね
さらにそれにしたってそれすらを長文でぐだぐだと…推して知るべし
0237デフォルトの名無しさん垢版2017/01/08(日) 13:07:40.60ID:TXqGgIea
継承やUTで簡単に使えるようにするため
privateは全てprotectedにしろと言われたことあったわ
0239デフォルトの名無しさん垢版2017/01/08(日) 13:34:11.82ID:kab+ZCih
OOPのメリットとして吹聴される要素の8割はクソ。
カプセル化はクソ(めんどくさい)
継承はクソ(親子のねっとりしたつながりがキモイ)
多態は野ぐそ(多態のための汎化、インタフェース抽出とか勘違いも甚だしい。保守性に逆行している)
俺OOP使ってこんな曲芸できます案件多すぎクソ。
0242デフォルトの名無しさん垢版2017/01/08(日) 14:08:45.35ID:XDbKIsfA
OOPみたいな簡単な仕組みも理解できない人って可哀想
もっと体動かすだけとか根性あればなんとかなる仕事に転職しないの?
0243デフォルトの名無しさん垢版2017/01/08(日) 14:17:09.32ID:+qBxgbmJ
OOPは本当に簡単で短絡的な思考のすえたどり着く結論だからね
オブジェクトに操作が内包されているというのは
まるで利権主義で、縦割り行政で、日本的といえる
自分の仕事しかしないし、利権はぜった他人に渡さない
利権という物質的なオブジェクトにすべてが紐づいていて整理されている

まぁ実用面では便利な部分もあるんだが
外でOOPサイコーとかいうと人格を疑われかねない
本音と建て前でこっそり使うものだ
0245236垢版2017/01/08(日) 15:47:12.81ID:TNnQVUnB
オブジェクト指向を用いるメリット
「ラクして、楽しく、良いもの」を作れる

スッキリJavaより抜粋
0246デフォルトの名無しさん垢版2017/01/08(日) 16:12:47.12ID:TXqGgIea
「ラクして、楽しく、良いもの」を作れる
オブジェクト指向登場後のソフトウェア業界は
さぞかし良い世界になったんだろなあ
0248デフォルトの名無しさん垢版2017/01/08(日) 16:46:50.39ID:XDbKIsfA
簡単になりすぎて捌ける規模が大きくなったから
逆に要求が膨れ上がって結局辛い世になってる気もするが
まあCOBOLとかやらされるよかマシかな
0249デフォルトの名無しさん垢版2017/01/08(日) 16:51:03.49ID:hENayCqC
オブジェクト志向言語使っててもアホが考えた社内規約とやらとヘボいフレームワークで全く楽にならねえw
0252デフォルトの名無しさん垢版2017/01/08(日) 21:51:12.89ID:tl4nBuMM
そういやこのスレって、どんな話題で始まったんだっけ?
「オブジェクト指向の利点を明確にする」
だったっけ?
0254デフォルトの名無しさん垢版2017/01/08(日) 23:00:17.73ID:iT+T8lZs
>>251
俺も最近正直そう思うようになった

最初の頃:おぶじぇくとしこう?
途中:OOP!ポリモ!デザパタ本!OOSC本!
その後:関数型?関数と変数だったら変数散らかるんじゃないんけ!
そののち:意外と関数型記述性ある!不思議と短く書けるなんやこれ!
しばらくして:いや?非OOPでも意外と書けた!
 OOP-OOPLというより大事なんは単にモジュール性や!直交性や!
 徹底してインタフェースと実装のシンプルさを保つことや!
今:そんでOOPのメリットって何なんやろな?
0259デフォルトの名無しさん垢版2017/01/08(日) 23:58:45.01ID:GQKjgtEl
>>254
要するに編集方針の違いでしかないんだよ。
出来るやつが書けばどれでもどうとでもなる。
それだけ。
それよりOAOO/DRY/メトリックス(トポロジー)の方が重要。
0260デフォルトの名無しさん垢版2017/01/09(月) 00:35:10.65ID:XasE0eMK
ソースのどこに記述するか?って方式の話でしかないよね
ボタン1を押したときの処理Aはオブジェクト指向で記述しようがそれ以外で記述しようが
ソースのどこかに記述しなければならない
オブジェクト指向ってのはつまるところその様式美



別にどこだっていいじゃん( ´∀`)b
0262デフォルトの名無しさん垢版2017/01/09(月) 07:16:32.07ID:MB0kUoDj
そのボタン1は、UIコントロールの基底クラスを継承するというOOPで作られてるとは思うけど
まぁだからといって使う側がOOPに従わなきゃならん、ということにはならないな

ボタン1を使いながら「OOPなんて不要!」と言ってるとしたらアホだとは思うが
0264デフォルトの名無しさん垢版2017/01/09(月) 10:27:05.05ID:VxLyi546
イベントハンドラの引数に押されたボタンのid渡すコード見るたびに
せっかくのオブジェクト指向が台無しになってる感はある。
0265デフォルトの名無しさん垢版2017/01/10(火) 22:51:34.90ID:drzFW1uA
クソコードハラスメントって概念を提唱したい
書いた本人が意図する、しないにかかわらず、相手が不快に思い、
相手が自身の尊厳を傷つけられたと感じるようなクソコードを指します。

糞レベル1. 汚いコードだなぁと思う
糞レベル2. 汚すぎて読むのためらう
糞レベル3. どうしたらこうなっちゃうのか理解不能
糞レベル4. なぜこれを人に見せたのか理解不能
0266デフォルトの名無しさん垢版2017/01/11(水) 00:22:47.67ID:GtOiWPCh
大概書いた奴は既に現場にいないという現実

某糞PHPの糞保守案件でガチで撲殺してやりたいコードあったわ
0267デフォルトの名無しさん垢版2017/01/11(水) 00:55:08.27ID:t4W503XG
自社で保守する仕事なら綺麗に書くけど
同業他社が保守するなら難解な方がいいだろ
足を引っ張って競争が優位になる
0270デフォルトの名無しさん垢版2017/01/11(水) 01:03:37.68ID:t4W503XG
アベノミクスで不景気だしどこも余裕がない
毎日残業で安月給じゃそりゃ人格も歪んでくる
0271デフォルトの名無しさん垢版2017/01/11(水) 01:06:16.95ID:1SbN3a75
>>265
その全てをパスしているが動かないコードと
その全てを満たしているが動くコードの
どちらを持っていくかと言われたら迷わず糞を持っていく俺
0273デフォルトの名無しさん垢版2017/01/11(水) 06:50:15.75ID:1SbN3a75
>>272
動いた上でさらに付加する価値だろ?
そんなの省かれるに決まってるだろ
いい加減テメェのこだわりは重要じゃねぇって気付けよ
0274デフォルトの名無しさん垢版2017/01/11(水) 12:29:20.79ID:1hmax6h/
結論が出た様です
>>265のセンスのない造語の使用は却下されました
妥当な結果でしょう
0280デフォルトの名無しさん垢版2017/01/14(土) 20:38:16.71ID:2kEkn3lr
初期化以降はリードオンリーとするフィールドint barがある場合
class Foo {
private int bar;
public Foo(int bar) {this.bar = bar;}
public int getBar() {return bar;} // ゲッターだけ公開
}
↑こうするより↓こうしたほうが色々気持ちよくない?
class Foo {
public final int bar; // C#ではfinalのかわりにreadonly
public Foo(int bar) {this.bar = bar;}
}
どうよ?
0285デフォルトの名無しさん垢版2017/01/15(日) 19:09:57.72ID:L9FFXvsx
>>284
それに対する俺の考えはこう
・あるものが不変で良いなら不変にしておきたい
・不変であるのならメソッドを経由しなくていい
・フィールドをpublicにしておける言語がある理由もそこらへんじゃないのかなっ
どう?
「OOPで〜」に対する返事にはなってないかもしれないけど
0287デフォルトの名無しさん垢版2017/01/15(日) 19:43:31.26ID:0NZmkTyB
オブジェクト指向的にはプロパティへのアクセスはメッセージに限定してカプセル化としたいんじゃないかなぁ?
って思う
0288285垢版2017/01/15(日) 20:03:27.72ID:zmg1eHAc
元の主張はいったん置いとくけど

>>286 >>287
そういうOOPLがあったらいいのにね(あるかどうかは知らない)
それはそれでスッキリすると思うよ

あとクラス図なんかにフィールド含まれてるのすら嫌だもん
>>286的理由で
インタフェースで考えていたいレベルに実装が飛び出てるのが嫌だしダメだと思う
0290デフォルトの名無しさん垢版2017/01/15(日) 23:28:22.35ID:W9Vj9w+K
ま、はしかみたいなものだね
OOの美学みたいな考えがあるんだろうけど
よくよく考えると大した概念ではないし、本質的でもない
多くのOOPはマルチメソッドをサポートしていないので
二つのオブジェクトに跨る処理をどちらに書こうかという
問題にぶち当たるし、得てしてそういった複数のオブジェクトに跨がる処理が
そのプログラムの本質的な部分であったりもするからね
プログラムの簡単な部分に関しては簡単に書ける、それがOOP
0291デフォルトの名無しさん垢版2017/01/15(日) 23:55:46.52ID:W9Vj9w+K
OOはどちらかといえばデータ構造に基づいた設計手法で
(あ、クラスはデータじゃなくて機能って言う人もいるだろうが
データに対する機能を提供している側面があるので・・)
空間に基づいた設計手法といえるが
当然、時間に基づいた考え方というのもあり得て
プログラムの本質が手続きであり、命令を上から順番に実行していくものだとするなら
こちらのほうが本題かもしれなく、少なくとも何がどの順で実行されるか
良くわからないという事態だけは避けなければならない
あまり自律的なオブジェクトを設計してはダメってこと
AがBのメソッドを呼んで、その中で今度はBがAのメソッドを呼び出す・・・
ということは避けなければならない
なぜならAがBのメソッドを呼び出したとき、Aは処理の途中であり
その状態でBがAのメソッドを呼び出すのは危険だから
デッドロックの危険性もある
オブジェクト同士がメッセージをパッシングし合い、まるで生態系のように振る舞い
結果として何らかの機能が提供されるというのは、機能の観点からは遠回りであるし
何がどの順で実行されるかよくわからないという意味で、手続き的には厄介だ
俺たちは何かのシミュレーションがしたいというわけではない
AとBをコミュニケートされるなら、それらの親にあたる部分が仲介すればよく
AとBが直接コミュニケートする必要はない
そうすれば手順が明確になる
オブジェクトとは良きパーツであるべき
0292デフォルトの名無しさん垢版2017/01/16(月) 00:16:59.04ID:WtkYzKjH
private Integer id;
private String domain;

String getAccountId() {
return domain + "-" + id.toString() + ;
}

こんな感じで、ゲッタの方が処理挟まないといけんくなったとき、ラクダからちゃう?
でもやっぱaccountId定義してコンストラクタ初期化すれば
やっぱフィールドおっ広げいいかとも思っちゃったり
0294デフォルトの名無しさん垢版2017/01/16(月) 10:25:44.18ID:Keb10HxT
>>292
それはじめると君の同僚たちもそれに倣って、
結果、画面にもSQLにも業務ロジックにも、至る所に文字列操作が書かれるぞ
連結してaccountId作ったり、accountIdを文字数や正規表現でidとdomainにバラしたり…
0295デフォルトの名無しさん垢版2017/01/16(月) 23:15:52.19ID:WtkYzKjH
class User {
private Integer id;
private String domain;

String getAccountId() {
return domain + "-" + id.toString() + ;
}
}

ならええやろ
user.getAccountId()や

至る所で
String aid = user.getDomain() + "-" + user.getId();
こんなんされるよりまし
0298デフォルトの名無しさん垢版2017/03/26(日) 09:22:55.90ID:BMgG41Fb
本来であればフィールドメンバと引数とわずかばかりのシステムメソッドで処理を完結するのがベストなのだが、
それしようとすると、やりたいことをやるために必要な情報がなかったりして
親の親から引数を渡し直さないとけなくなったりしてそうこうしてるうちに
結局グローバル変数やシングルトン(instance)で便利になったと喜んでしまう性。
0299デフォルトの名無しさん垢版2017/03/26(日) 22:59:55.37ID:EKCv78dE
>>295
現時点でCallerには「domain-id」の文字列以外必要ないなら、それでOK
Callerもid or domainが単独で必要ならgetIdやgetDomainもつける

IDだけじゃなくて、たとえばなんかのログインフォームのようにメールアドレスもサポートするならクラス側で承ける
文字列返すかAcccontDataクラスでも作るかは
idの形式があと3つ4つあるか(ついったと顔ブックとなんちゃらinアカでもログインOKみたいな、ならクラス)
or メルアドのみで数年やれるか(なら文字列でサクっと実装しちまえよ)による
0300デフォルトの名無しさん垢版2017/04/20(木) 23:17:36.80ID:nIwh3CMn
ワインと豆腐には旅をさせちゃあいけない
という山岡さんの名言がある

俺は変数にも旅はさせてはいけないと思う
つまり、変数はprivateにのみしておいて
それを外に参照させたり渡したりしないうちは安泰だということ
0301デフォルトの名無しさん垢版2017/04/21(金) 03:45:03.38ID:vq22u+1l
漫画を引用する様な見識の狭い奴の言う事を誰が本気で聞くのか
語りたい事があるなら自分自身の言葉で語れ
0302デフォルトの名無しさん垢版2017/04/21(金) 12:33:54.90ID:e2S2gBzR
旅をするのは変数ではなく値なんだけどね
0303デフォルトの名無しさん垢版2017/04/21(金) 21:12:23.25ID:JwbSy4qm
グロバール変数やめました
シングルトンもやめました
結果、
オブジェクトをたらい回しにしまくりんぐ地獄
0304デフォルトの名無しさん垢版2017/04/23(日) 15:03:38.82ID:jdVuS3ql
郵便物が来たってメモはたらい回しでいいけど、
郵便物自体はたらい回しするなよ。
0305デフォルトの名無しさん垢版2017/04/23(日) 15:28:16.71ID:mKAZq6VZ
それは郵便物オブジェクトが人間オブジェクトにメッセージパッシングして言ってんの?
0306デフォルトの名無しさん垢版2017/04/23(日) 15:45:39.68ID:jdVuS3ql
郵便物オブジェクトは何もしないだろ。
メッセージをパッシングしているのはメッセンジャーさ。
0312デフォルトの名無しさん垢版2017/04/23(日) 23:46:36.74ID:fe+cTrdN
ごめんやけど最近来たから勝負してたところを見たことない
どんな勝負だったの?
0320デフォルトの名無しさん垢版2017/04/24(月) 20:17:16.61ID:MN8pW2Am
なんだ
騒ぎ立ててるヤツが居るだけなのね

なんかおもしろい議論があるのかと思って期待してたのにな
0323デフォルトの名無しさん垢版2017/04/25(火) 12:08:14.39ID:5ILiyJO9
キャットドア問題が何を問題にしているのかわからない
合力できるようにDoorOpenerCompositionを定義すれば済む話では?

(new Cat(weight: 5)).can_open(new Door(weight: 4, knob: true)) //=> false
(new Human(weight: 15)).can_open(new Door(weight: 14, knob: true) //=>true
(new Cat(weight: 5)).can_open(new Door(weight: 4, knob: false)) //=> true
(new Cat(weight: 5)).can_open(new Door(weight: 10, knob: false)) //=> false
(new Cat(weight: 4) + new Cat(weight: 3) + new Cat(weight: 5)).can_open(new Door(weight: 10, knob: false)) //=> true
0327垢版2017/04/25(火) 23:25:27.84ID:RguWTiRy
キャットドアとやらが拠り所なのか…
0329デフォルトの名無しさん垢版2017/04/25(火) 23:57:29.33ID:qaES5lmc
ごめん、それでは理解できない
どんな勝負だったの?
勝利条件やルールは何だったの?
0330垢版2017/04/26(水) 00:00:54.76ID:R2CP97M0
何かの引用のもじりなんだろうか?
ひどい英語に見えるけどなんか意味あるのかな…
0333デフォルトの名無しさん垢版2017/04/26(水) 06:46:17.53ID:Ex4Hni8+
>>331
や、だから俺はそもそも勝負に参加してないっての
参加するにしても勝利条件とルールを聞いても誰も教えてくれないから参戦もできない
0337デフォルトの名無しさん垢版2017/04/27(木) 22:21:41.15ID:1aP1zib4
クラス階層をどう作るか、メソッドをどのオブジェクトに持たせるかっていう、大抵は主目的にならない部分の問題を、
現実世界の物理的な制約、言語学や分類学の観点から「〜であるべき」と主張しあうおバカな問題だよ>キャットドア問題
たまに出現してスレを白けさせる美少女クラス云々と同類。

プログラミングを知らなくても身近なものを抽象化して語ることは誰でもできるから、無駄にレスが稼げる
0338デフォルトの名無しさん垢版2017/04/28(金) 12:21:14.12ID:xTWRaXFB
それは抽象化ではないとだけ言っておこう
0339デフォルトの名無しさん垢版2017/04/28(金) 22:22:35.36ID:pTZXbcwl
>>337
おバカな問題だということが分からないやつがたくさんいるから
似非開発者をフィルタリングするのに便利だよ
0340デフォルトの名無しさん垢版2017/04/29(土) 00:17:16.42ID:QOk6w6Nc
頭が悪いという事実以外にどこに問題があるのか
0341デフォルトの名無しさん垢版2017/04/29(土) 01:10:48.87ID:PKfhB/PA
まあな、お前らほど優秀な奴らがあの場にいたらキャットドア問題など発生すらしなかったんだろうなw
0342デフォルトの名無しさん垢版2017/04/29(土) 03:01:54.61ID:eU1WntyZ
どんなに優秀なやつが居ても無理
自分の考えることが正解で他はダメみたいな考えしてるやつらの口論に出口はない
0343デフォルトの名無しさん垢版2017/04/29(土) 14:57:30.88ID:Y+QDu0qT
>>323
俺はこんなコード書きたくないなあ
0345デフォルトの名無しさん垢版2017/04/29(土) 18:32:37.57ID:u4T6eHTd
>>344
> お前に保守させるから

無理だろw
どうやって、やらせるんだよ。
お前に、他人に何かをやらせる力なんてないだろw
0346デフォルトの名無しさん垢版2017/04/29(土) 22:20:18.73ID:veSqK8ri
>>337
わかるわかる
美少女クラスがどうとかウンコがどうとか
そーいうので必死でレス稼いでる子がいるよな
自転車置き場議論の一端だよな
これならレスできる!って連中が集っちゃう
0347デフォルトの名無しさん垢版2017/05/01(月) 21:31:28.52ID:yowwCFAh
OOの技術って何って言われたら
整理整頓術、としか言いようがない罠
とりわけコードに対して、オブジェクト(クラス)にぶら下げとけば良いんじゃね?っていう
多態だ継承だっつっても、コードをオブジェクト単位で整理したときに
ちゃんと動くようにするための仕組みでしかないよ
それなのに犬は哺乳類で猫はニャーとか、最近はこういうこと言う人居なくなったけど
かつて本当にバカげたことを言っていたよね
仕事をするうえで整理整頓は重要だけど、作業性の問題であってサイエンスでは無いしな
いやね、まじめな話、作業性さえよければ何だってかまわないでしょ、マジで
だから結局、作業性の問題なんだよ、これは
0349デフォルトの名無しさん垢版2017/05/01(月) 21:59:16.41ID:Vg97aOxY
我々生まれもって木構造が好きだから
クラス階層というもんのドキュメント性も何か
心惹いてたんだろうねえ
継承がもたらすポリモの便利さにくわえてね
0350デフォルトの名無しさん垢版2017/05/01(月) 22:04:47.34ID:yowwCFAh
実際、作業性なんだよ
作業性が良いと、仕事が早く終わるし、ミスも減るんだよ
そのために整理する仕事があるんだよ
どこの工場でもやっていることだ
工場に限らず仕事は全てそうではあるがな

逆に物凄く崇高な理論や思想が何かあったとしても
余計に時間がかかってミスも増えるんなら糞くらえだろ
家に帰れなくだけ
0351デフォルトの名無しさん垢版2017/05/01(月) 22:12:12.09ID:yowwCFAh
まぁソフトウェアの設計といえば
どれだけの時間で処理が完了するか見積もったり
メモリ使用量を算出したり
そういう楽しいのはあるけども
OOはそういうのじゃ無いよね
OO設計は完全に整理整頓術以外の何物でもない
とりわけ、コードを、どこに、書くか、という問題
0354デフォルトの名無しさん垢版2017/05/01(月) 22:28:24.75ID:FwcOD9NG
作業性って工場系の用語だと思うんけど定義を教えてくれ
作業のしやすさ=作業性?
それとも作業効率を高める性質=作業性?

自分の周りじゃあまり使われない言葉だけど便利そうだな
0356デフォルトの名無しさん垢版2017/05/01(月) 22:57:39.04ID:yowwCFAh
大体において、作業がしやすければ、作業効率は高まるもんなんだよ
ここで、ごく一部の例外とか、そういうのはどうでもよい
基本的な原則といって良いだろう
だから両方の意味でつかわれるし、両方同時に言ってるし
付け加えれば品質の意味も含まれる
作業しやすいほうが品質が上がるのは当たり前だからな

ただ、作業性の意味が分からないってのはちょっとアレじゃねって
俺は思うが
別に工場用語でも何でもないし
0357デフォルトの名無しさん垢版2017/05/01(月) 23:05:09.52ID:yowwCFAh
あと、整理整頓術も工場用語でも何でもないぞ

それからソフトウェア業界であまり使われないのはそうだろう
俺があえてこの瞬間そう言ってる、言い直しているってこと
OO設計は結局整理整頓術ってのは俺の意見であって
Wikipediaに書いてあるようなことを書き込んでも面白くないだろ
要はバカっぽく言い直しているってこと
0358垢版2017/05/01(月) 23:10:42.49ID:nao9PwD/
工場での生産の作業性をぼんやりした形で適当に定義しないでほしいな。

作業性が良ければ早く終わる、は幻想。
早い、安い、旨いは3つを取れないもんなんだよ。早くてうまけりゃ安くは無いし、早くて安けりゃ旨くはない。
効率を上げるには工程に工夫がいるし、工程を楽にしたけりゃ単純性が居るし、単純性を上げるには効率をさげにゃならん。
0359垢版2017/05/01(月) 23:12:40.19ID:nao9PwD/
>>357
お前が馬鹿なのか勘違いしてるのか、恣意的に混同してるのかわからんが、少なくともお前が言ってることが机上の崇高な理論で思想だよ。
0361デフォルトの名無しさん垢版2017/05/01(月) 23:17:09.68ID:Qjntrl82
吉野家は3件全立してると思ってた
0362垢版2017/05/01(月) 23:20:32.57ID:nao9PwD/
>>361
高くはない、まずくはない、遅くもないものはなんとかなる。
その状態が、生産ラインの安定地点でもある。
0363デフォルトの名無しさん垢版2017/05/01(月) 23:46:27.89ID:yowwCFAh
>>358
そんな細かな話は一切してない
彼方を立てれば此方が立たないって領域の話は、個々に対応する話であって
それ言い出すと、美女のウンコの話になる
つまり、対象とする要件がわからないのに、美女クラス作るのは無理
不毛だろ
ただ明らかに作業性の悪い状態で作業すると作業効率が落ちるのは確か
そのことしか言えない

しかし、OOが整理整頓術と考えれば、美女のウンコであるとか
キャットドア問題とかいう意味不明なやつとか、心底どうでもよくなる
それが狙い
0364デフォルトの名無しさん垢版2017/05/02(火) 00:18:05.19ID:SbXhwJoo
POAやDOAは整理整頓術とは違うの?
整理整頓術は作業性を高めるためにあるとして
異なる整理整頓術があるのは重視してる目的が異なるからじゃないのか?
0366デフォルトの名無しさん垢版2017/05/02(火) 04:16:06.60ID:702+910T
オブジェクト指向って処理をソースのどこに書くかってだけの技術だしね
どんなにこねくり回しても直接的には1円にもならないんだよね
違うと認めないやつもいそうだけど
そろそろ自分が扱ってるモノの本質を見定めるべき
0367デフォルトの名無しさん垢版2017/05/02(火) 06:27:34.69ID:cIXPJSKK
それをバカにしつづけた結果
メンテ不能なモンスターができあがり
ビジネスチャンスを逃す
0371垢版2017/05/02(火) 10:53:02.51ID:Ua7wVMyf
>>363
個々に対応しない全体論なんてあるわけねえじゃん。
頭おかしいのか?
0373垢版2017/05/04(木) 12:00:51.58ID:iOTKQL/7
>>372
次世代言語の前スレで単なるオブジェクト指向では無理でしょ的にGoで断片書いた。
0375垢版2017/05/04(木) 13:35:48.87ID:iOTKQL/7
>>374
何でもう一度?一回やったのに生産性無い事をしたがる/させるんだなぁ。
もう一回話したいテーマ挙げてよ。
少なくともキャットドア問題とやらは問題自体に不備があるから、何の解もありえないだろ。
正しく問題を出し直すなら出し直せば?
0379垢版2017/05/04(木) 20:17:32.14ID:iOTKQL/7
砂上の楼閣が作れるスコップみたいな話か。
0381デフォルトの名無しさん垢版2017/05/04(木) 23:44:26.02ID:7TNYL3q7
>>380
分脈!!

何の役に立つかも考えずにCatやHumanをコードに登場させてるから駄目なんだよ
それが分からないうちあのスレにいた人たちと同レベル
オブジェクト指向わかったつもり系
0384デフォルトの名無しさん垢版2017/05/23(火) 17:41:22.37ID:kKBwFCtV
データと処理が分離してるクセに継承の嵐。
意味不明なラムダ式の多様。
意味不明なabstract縛り
邪魔なprivate宣言
csvの共通クラスだけで10以上のクラス

悪夢を見てるようだ。

これがオブジェクト指向というやつか。恐ろしい。
0386デフォルトの名無しさん垢版2017/05/24(水) 12:02:36.26ID:VdpFCLoQ
ドヤ顔で言語仕様に振り回されて無駄だらけで読みづらいクソコード量産すんなって話だな。
全部staticのほうが逆に使いやすいなんてのは、もう目も当てられない。
中途半端にスキルあるヤツに多いんだよなあ。
0387デフォルトの名無しさん垢版2017/05/24(水) 17:58:34.22ID:IXUmJ/sE
>>386
その中途半端なスキルの奴は、もう次の段階に行ってるよ。
そうやって設計手法に振り回されながらも実践し、失敗を繰り返すことで成長していくんだから。
で、お前はそいつの成長過程で産み落とされたゴミをメンテする役ね。成長はないけどまぁ食っていけてるならいいんじゃない。
0388デフォルトの名無しさん垢版2017/05/24(水) 21:18:50.72ID:VdpFCLoQ
レッテル張りして、プンスカ怒ってるみたいだけど、そうとう図星だったか。
設計ミスるのも程々にしとき。
0391デフォルトの名無しさん垢版2017/06/10(土) 08:24:17.90ID:F6bXk1dm
オブジェクト指向言語って、構造体を拡張して作ったクラスに一事実一箇所の概念を持たせたものって認識で良いの?
0392デフォルトの名無しさん垢版2017/06/10(土) 08:30:29.38ID:F6bXk1dm
オブジェクトという概念を実現するために、構造体に操作を持たせただけなのに、古い人が構造化プログラムから転向できないのは何でだろう

構造体知ってれば自ずと解りそうだけど
0393デフォルトの名無しさん垢版2017/06/10(土) 10:15:22.65ID:DbYsfAwS
>>392
多くの人にはドメインのモデリングが難しいから
手続きを箇条書きする方が簡単だから
構造体がわかることと構造体を組み合わせて大きなシステムを構築できることは別物だから
0394デフォルトの名無しさん垢版2017/06/10(土) 11:08:36.41ID:jC/WmgTy
古い人もオブジェクト指向が理解できないわけではないんだろうよ
ただ、今までそれなりに書いてきてて
要点がわかっているからオブジェクト指向があまり魅力的に見えないんだろう
あと、オブジェクトに着目するって発想がアホっぽくて嫌だとかかな
若い人は何も考えないからそのまま受け入れるかもしれないが
それなりの経験を積んできた大人からしたら
こういったアホっぽい発想に拒否反応が出ても仕方がないんじゃないかな
0395デフォルトの名無しさん垢版2017/06/10(土) 11:34:01.13ID:jC/WmgTy
やはりプログラムで一番複雑化しやすいのは複数のオブジェクト同士の相互作用で
自分自身にしか影響がないような処理はOOではカプセル化するが
そもそも自分自身にしか影響のないような処理はもとからそれほど複雑じゃないんだよな
だからOOは元から簡単なことをより簡単にする為のものともいえる
簡単なことがより簡単になるから、難しいことに集中できるってアイデア
もともとgoto文を使わずにfor文を使いましょうってのも
簡単なことを簡単に書くための物だから方向性はあってる
ていうか、プログラミング言語の進化自体が、簡単なことや頻繁に出てくる処理を
構文でサポートして、難しいことは自分で考えてね、って歴史だから
OOも例に漏れずって感じ

あとは、手続き型言語である場合は処理の順番も重要かと
処理の順番を間違えるとあっという間にバグる
継承による差分プログラミングが上手くいかないのも処理に順番があるから
継承元のクラスの処理のされかたについて正しく理解してないと差分だけ書いたって上手く行かない
協調動作させなければならないが、それには処理の順番が重要になってくる
それと、OOになってから処理の順番は、むしろ分かりにくくなってる節がある
クラス単位で処理が細切れになっていたり、仮想関数で目に見えない分岐をしたり
そーゆーのを嫌うってのはあり得る話
処理順が明確なプログラムのほうが読みやすいってのは普通に有る

↑のようなことを理解したうえでOOを使うのは全然よいんだろうが
適当に作られたOOのプログラム、特にOOを使うこと自体が目的であるかのような奴はマジで糞だから
そういう麻疹みたいなのに自分が巻き込まれないように、自衛のためにOOを避けたり
使わせなかったりってのはあるだろう(Linusとかね)
0397デフォルトの名無しさん垢版2017/06/10(土) 15:17:22.82ID:QncEdRe9
この業界はKKD法のシェアが一番
0398デフォルトの名無しさん垢版2017/06/10(土) 19:33:42.45ID:cjBRJJZZ
根性って大切なんやで
0400デフォルトの名無しさん垢版2017/06/11(日) 09:44:55.62ID:odJVzTG1
オブジェクト指向を理解した上で採用しないオジサン居るのかな

構造化プログラムで思考停止してるのばかりな気がするけど

たいてい制御系上がりの上司
0402デフォルトの名無しさん垢版2017/06/11(日) 15:04:37.95ID:qjl5AbWq
構造化という言葉の意味を知らないとしても、いまどき構造化プログラミングから外れるようなコードってあまり見ないよね。
0403デフォルトの名無しさん垢版2017/06/11(日) 17:13:48.04ID:djSLYxcn
構造化プログラミングは人類の至宝
制御構造、サブルーチン、ブロック
こんな大事なもんほかにあるか?
0405デフォルトの名無しさん垢版2017/06/11(日) 19:45:41.61ID:rkOEfbG/
俺は>>403に賛成なんだけど
面白いのは>>403のように、動き、動詞、メカニズムに拘る人もいれば
>>404のように、名詞、物体、に拘る人も居るってことだな
0406デフォルトの名無しさん垢版2017/06/13(火) 00:06:13.42ID:vFhinRVt
>>394-395
意見について反対は無いが、俺の例で言うと、

> 要点がわかっているからオブジェクト指向があまり魅力的に見えないんだろう
ただ単に必要を感じなかったから、だね。
とはいえ、適切に使えばOOPの方が見やすくなるのは確かだから、
やってないだけの奴にはとにかくやらせればいい。

> 自分自身にしか影響がないような処理はOOではカプセル化するが
> そもそも自分自身にしか影響のないような処理はもとからそれほど複雑じゃないんだよな
いや、元々自分自身にしか影響が無いのなら、べたに書いても疎結合化はされてる。
というか他の処理とつながりようがないし。
OOP構文を使えば、スコープが分離されて、文法的に疎結合化が確約されるだけで、
プログラム自体の構成には全く影響が無い。
だから所詮は編集方針の違いであって、本質的にはクラス階層が導入されたに過ぎないんだよ。
とはいえ、クラスライブラリが提供されていれば、それを使った方が楽なのは確か。
使わないのはただ単に、無くてもなんとでもなるのと、(俺の場合はこれ)
自分がすべてやることに慣れているから、逆にブラックボックス部分があると怖いとかじゃないかな。
あとCみたいに限界まで無駄をそぎ落とすことに慣れていると、
クラスみたいにある程度の無駄を許容してコードの簡素化を優先しようという思想が嫌いだったりする。
0407デフォルトの名無しさん垢版2017/06/13(火) 00:06:40.17ID:vFhinRVt
> 協調動作させなければならないが、それには処理の順番が重要になってくる
継承をガンガン使って思ったのは、コードの記述順が超重要だということ。
これは昔のコピペプログラミングだと、実はかなりルーズで、あまり気にしたことが無かった。
(動けばいい、位のノリで書いていた)
ただこれを仕様が確定する前に完全にうまく書ききることはかなり難しい。
だから差分のみでは済まず、結局元のクラスのメソッドをチョイ修正する必要があったりする。
結局、○○を使ったから馬鹿でも超楽勝!、なんてことにはならない。
むしろ、OOPの方がシビアになってる。
これを何とかするのがインミュータブルや参照透過や再代入禁止のはずなのだが、
(適切に使えばコード順はほぼ自由に出来る)
関数型()のアホ共はこれを理解できずに見当違いの方向に暴走してる。
まあOOP側もOOPが目的みたいなコード書いたりするし、結局本人次第でしかないが。

関数型についていえば、本来はOOPでも対応できない巨大コード/構成を相手にするためのものであって、
関数型()の連中はわずか数行のコードしか相手にしてないから駄目なんだと思う。
というか、大規模コードを書いたことの無い関数型信者は基本的に馬鹿なことを言っていると思う。

ところでlinusってOOPさせないのか?知らんかった。
0408デフォルトの名無しさん垢版2017/06/13(火) 00:18:29.15ID:8xDXZ/6F
せいぜい数十行のコードを書いて、あのメジャー言語よりみじけー!とか言って喜んでるのが関数型にわかだよ
0409デフォルトの名無しさん垢版2017/06/13(火) 00:53:29.31ID:vFhinRVt
ちなみにググッたら簡単に出てきた。結構有名みたいね。
https://cpplover.blogspot.jp/2013/05/linus-torvalsc.html

まあ言っている内容はごもっとも。流石と言うべきか。
とはいえ本質的には結局本人が出来る奴かどうかであって、
言語とか○○型とかは関係ない気もするが。

ところで話題のGitのソース眺めてみようと思うが、どれを見ればいいのかな?
https://github.com/git/git

>>408
ちなみにErlangは明確にスケールアウトを目指していいとは思う。
あれが正しい関数型の使い方だろう。
(あまり知らんが)Haskellは結局遅延評価だけで、
HaskellHaskell言っている奴は基本的にゴミのような印象しかない。
他に使われている関数型はOCamlか?あれは何がいいんだ?
知ってたら教えてくれ。
0411デフォルトの名無しさん垢版2017/06/15(木) 10:19:37.71ID:wH8Q5BS8
俺は本人じゃないが、そもそも元の文章は
オブジェクト指向は構造化プログラムを否定している
とは言ってなくね?
0412デフォルトの名無しさん垢版2017/07/11(火) 19:51:06.41ID:ipR8z5Od
状態によって実行できるメソッドが異なるクラスってどう実装する?
実直に実装するとinvalid state exceptionを投げまくるかっこ悪いクラスになってしまう

class order {
public void decide() { // 保留中の注文を確定する
assert<invalid_state_exception>(_state == order_state::pending);
_state = order_state::ordered; }
public void cancel() { // 注文済みをキャンセルする
assert<invalid_state_exception>(_state == order_state::ordered;
_state = order_state::canceled; }
// 省略
}

もちろんこれは単純なサンプルで現実的にはもっと複雑なビジネスルールがある

Stateパターン使うのかなとも考えたけど結局空のメソッドからnot supported exceptionを投げるようになるだけで本質的な解決策にならない
0413デフォルトの名無しさん垢版2017/07/11(火) 20:01:43.99ID:8ipoG7uk
状態によって実行できるメソッドが異なるクラスって実装しない
0414デフォルトの名無しさん垢版2017/07/11(火) 20:04:44.30ID:ir0k8ftd
Stateパターンつうのはこの場合
キャンセル、保留中、決定済み
これらそのものをオブジェクト化して置き換えて運用するんじゃないんけ
0416垢版2017/07/11(火) 20:52:36.85ID:atBExrFz
>>412
値を持ったデータの塊に生やしたメソッドでやるから話がややこしくなるのでは?
値は値なんだし。
値に何かさせたら、値自体が変わるってすごいめんどくさいと思う。
しかも、何かさせられない状態すら持ってる。これヤバい。
何かさせられない、の定義が変わったとき過去データの扱いとかどうなるのか、すごい慎重にクラス作らないといけなかったり色々辛いと思う。

Orderクラスはオーダの状態だけを管理して、
OrderManagerみたいなクラスと関数で、
Order OrderManager.Cancel(Order order)なり、
Order OrderManager.Decide(Order order)みたいな物で触った方がいいんじゃないの?
そしたら、各メソッドでの引数の条件のチェックも楽だし、何よりテストが楽じゃん。
0417デフォルトの名無しさん垢版2017/07/11(火) 22:47:27.60ID:ipR8z5Od
>>416
う〜ん
オブジェクト指向でやるか関数型でやるかは人それぞれだと思うので深入りしないでおく

ただその関数型方式でも結局、状態によって呼んではいけない処理を容易に呼べてしまう所は同じままだと思う
ビジネスルールが複雑化して状態数が増えるとソースコードがinvalid argument exceptionだらけになってしまう
0418デフォルトの名無しさん垢版2017/07/12(水) 00:06:27.75ID:iO19g1+a
interface IOrder
CanceledOrder implements IOrder
DecidedOrder implements IOrder

CanceledOrder cancel(DecidedOrder o) {}

これでどや
cancelメソに変なo渡そうとしても、コンパエラーで弾けるンゴ
0419垢版2017/07/12(水) 12:04:37.50ID:xgpaRPlM
>>417
関数型に見えるけど全然関数型じゃないよ。
オーダーってなんぞとモデル化した時に、
伝票と伝票処理する経理の人を浮かべただけ。

呼んではいけない処理を、「呼んではいけない」と決める事について、呼ばれる方が自分で宣言するってどーなの?

経理部の上長だけは注文済みから直接保留に戻せるとか、新しいロジックはいくらでも来そうな要件なんだし、その判断は操作する側が見てやる必要あると思う。

a+bしたら、勝手にa+=bされてるような気持ちわるさ。a.plus(b)は、aではないa+bした新しいインスタンス返してほしいってような感じで。
その上でa.div(0)が例外を吐くか、それともエラーな型返すかは別だけど、少なくともaが破壊される事はやめてほしい。

invalid argument exceptionで例外として扱うから辛い。
サブタイプでエラーなOrderのクラスにするか、
最初からにsanityみたいなプロパティのフラグ持たしといて変な事したら倒しゃ良いじゃん。
0420デフォルトの名無しさん垢版2017/07/12(水) 13:06:12.99ID:ahqaJGrL
状態によってメソッドが異なるというのがオブジェクト指向と合わない気がするね
メソッドを呼ぶ側がオブジェクトの状態を気にするのは変だし
0421垢版2017/07/12(水) 18:15:25.39ID:xgpaRPlM
>>420
うん。もしくは、モデル化に失敗してる。
正確には、メソッドは呼んでもいいし、そこで例外を出しても良いけど、だいたいそういうのはトランザクションチェックとかになると思う。
掴んでるOrderが最新でなければどの行為も全てできない事、とか。
履歴が必要な類のシステムはそんな感じかと。

「注文」だと、Decideはほとんど客がやるが、Cancelは客も店もやる。
「注文書」の「「発行」「取下」「受領」「可決」「否決」「発送番号交付」」くらいに分けとけば
「発行」「取下」は「客」が出来て、
「取下」「受領」「可決」「否決」は「事務方」が出来て、
「発送番号交付」は「現場方」ができる
みたいにモデル化しやすい。
全部Operatorがやるべき事で、できるできないは注文書の状態や自分の職位の組み合わせで決まる事かと。
受領済みでなければ取下できるが、受領済みであれば取下できないとか、
取下済みであれば受領できないとか、そんなの例外で捌くもんじゃなくて、ロジックで捌くもんじゃん。
0422デフォルトの名無しさん垢版2017/07/12(水) 18:33:52.64ID:zMmPnBY/
>>412
> 状態によって実行できるメソッドが異なる

面白いので、もうちょっと要件を確認させてください

ここで「実行できる」というのはコンパイルが通る、という意味?
それとも型チェックはせずにただ実行時にそういう振る舞いをするオブジェクトがありさえすればよいの?

もし後者の場合、呼んではいけない処理を「呼べない」というのは具体的にはどういう仕組みを想定している?
「not supported exceptionを投げるようになるだけで本質的な解決策にならない」というからには
実行時に例外をあげるのでは不十分ということなんだよね?
0424デフォルトの名無しさん垢版2017/07/12(水) 20:09:14.14ID:P9HuPwNV
とりあえず認可の話ではない
サービスレイヤーで認可を済ませた後
オブジェクトの内部状態によって呼べる呼べないを判断する
orderedのorderをdecideすることはできないしpendingのorderをcancelできないという事実に権限は関係ない
orderedのorderをcancelできるのは誰だといった問題は別のところで行う
orderは短い例であって実際の業務ではorderではないし状態数はもっと多い(5〜10程度)
それぞれの状態で実行できないメソッドが1つ以上ある
0425デフォルトの名無しさん垢版2017/07/12(水) 20:13:58.35ID:P9HuPwNV
すると、状態を確認して例外を投げる、という定型的なコードをあちこちに書くことになって精神衛生上良くない
Stateパターンを使えばクラス内部の定型文は排除できる
しかしその場合でもクラスの利用者が、状態を確認してメソッドを呼ぶ、という定型文を書くことを避けられない

このやり方は殆ど能力照会と同じという点で気に入らない
せっかく静的な言語を使っているのだから動的言語のようなことはできるだけ避けたい
0426デフォルトの名無しさん垢版2017/07/12(水) 20:25:05.43ID:uz/DDJsp
お伺いを立ててからご用立てする社会みたいでめんどくさいな
よろしく!って軽い気持ちでブン投げたいわ
0427垢版2017/07/12(水) 21:55:26.66ID:LW66+r5t
>>424
だから、それぞれの状態で呼べる呼べないを判断するのは権限によるチェックと同じレベルの、ロジックであって、例外ではないじゃんって。
認可の話じゃないなら、Not Supportedはもっと違う。サポートされて無いんじゃなくて、その処理は許されてないから、サポートされてないんでしょ?

>>425
確認した結果ならば、例外ではなく、正常系。
デザパタ云々ではない、それ以前の問題。
静的な言語ならではの方法で解決したい、ってのは無駄。
何故なら、例外を投げる時点でランタイム任せだから。
0428デフォルトの名無しさん垢版2017/07/12(水) 22:07:18.53ID:iO19g1+a
ワインゴの神設計コードをミロや


CanceledOrder implements IOrder
DecidedOrder implements IOrder

CanceledOrder cancel(DecidedOrder o) {}
0429デフォルトの名無しさん垢版2017/07/12(水) 22:10:26.36ID:iO19g1+a
まちがえたンゴ
こうンゴよ
どうンゴ?


CanceledOrder implements IOrder{
@Override public showOrder(){}
}
DecidedOrder implements IOrder {
@Override public showOrder(){}
public cancel(){}
}

interface IOrder {
public showOrder(){}
}
0430垢版2017/07/12(水) 22:14:21.93ID:LW66+r5t
>>429
Decidedで、かつ、何らかの理由でCancelに失敗した時、cancelがCancelledOrder帰してると詰む。
0431デフォルトの名無しさん垢版2017/07/12(水) 22:42:58.55ID:iO19g1+a
>>430
それはどう考えてもthrows イレーガル何とかやろ
全部のOrderにisCancelSucseeded()やisValid()生やすおつもりか?
0432垢版2017/07/13(木) 08:47:14.27ID:gzfFo6hj
>>431
Orderは、State持ってるだけで良いじゃん。
StateがDecidedか、Decided+Cancelledか、Decided+Recieved+Acceptedか、がまずOrderが持つべき状態。
ハンコリレーする時の、下のハンコ欄みたいな感じ。これはOrderが持つ他無い。
Order.IsStateIn(状態)みたいなメソッド持ってたらわかりやすいし、
Order.AddState(次の状態)くらいで良いのでは?
Order.Lock()
If(Order.IsStateIn(Accepted)){
 なんやかんや
 Order.Commit()
}
Order.Release() //finallyに
では?
Commit()メソッドでDBにセーブした時にDBの最新値と不一致があれば、それはExceptionかと。
どう考えても、のケースはクラスのユーザが判断するべきものじゃないんだから。
0433デフォルトの名無しさん垢版2017/07/13(木) 10:11:19.96ID:ZjMlxgk7
>>424
> とりあえず認可の話ではない

>>421
> 「発行」「取下」は「客」が出来て、
> 「取下」「受領」「可決」「否決」は「事務方」が出来て、
> 「発送番号交付」は「現場方」ができる
これ、認可の話だよね
0434デフォルトの名無しさん垢版2017/07/13(木) 11:36:43.52ID:wYgqTfnm
>>424
> オブジェクトの内部状態によって呼べる呼べないを判断する

ここで「判断」するのは誰(いつ)?

コンパイラ(コンパイル時)? ランタイムシステム(実行時)? オブジェクト自身(コール後)?
0435垢版2017/07/13(木) 12:43:36.57ID:gzfFo6hj
>>433
認可の話だよ。認可と「呼べる呼べない」は、本質的には同じだと言うとる。
「呼ばせられる、呼ばせられない」なんだから。
だから、データになるオブジェクト側が制御するのは悪手。相手方を意識しないと判断できないものを、相手方を持たないものが持つべきではない。

あくまで自分の状態が自分の範囲で正しいか正しくないかを判断する事しか出来ん。
そうしとかないと、密結合すぎて改修不能になるぞ。

なんせ呼ぶ側の改修全てに対応する羽目になるし、改修したらそいつを呼ぶ側全ての動作確認と、場合によっては更なる改修が必要で、そうなったらまた呼ばれる方の改修をして、と
そこそこ悲惨な事になる。下請けを札束で殴るような改修になるぞ。
0437垢版2017/07/13(木) 18:08:28.33ID:gzfFo6hj
>>436
要は、データはデータらしくしてろ、と。
伝票がペンを跳ね返すような真似すんな、書けていい。
単に正しい人間が正しく書いてない伝票が無効になるだけだ。書く書かない、書ける書けないは人間の問題だ。
って言ってる。
0439デフォルトの名無しさん垢版2017/07/13(木) 18:22:51.92ID:ZjMlxgk7
>>437
「注文が発送済みになったらもうキャンセルできない」は誰が判断すべきだということですか?
・注文自身
・キャンセルしようとした人
・その他
0441デフォルトの名無しさん垢版2017/07/13(木) 21:50:56.01ID:x/yyf+sv
「保留中だとキャンセル出来ない」を認可の話と認識してしまうのはちょっとおかしい
「99レベルだとレベルアップ出来ない」を認可の話と認識してしまうのと同じようなものだよ
認可ってのは「申請者本人とスーパーユーザーは申請済みの注文書をキャンセルできる」とか「自分のアカウントのキャラクターを削除できるが他人のアカウントのキャラクターは削除できない」とかそういうこと
0443垢版2017/07/13(木) 23:49:06.62ID:gzfFo6hj
>>439
その他。
注文に対する処理を行うロジック。

>>441
レベル99だとレベルアップ出来ない、は話が散らかってる。
レベル100になるために必要な経験値が定義されていない、が正解。

そうじゃなくて、「自分のアカウントのキャラクターを削除できるが他人のアカウントのキャラクターは削除できない」と同じく「自分の権限が及ばない物は変更ができない」でしかない。
0444デフォルトの名無しさん垢版2017/07/13(木) 23:56:23.58ID:x/yyf+sv
>>443
もうめちゃくちゃだな
そのうち100円と20グラムを足し算できないのも権限の問題とか言い出しそうだ
0445垢版2017/07/14(金) 08:44:22.04ID:vN8eqjVV
>>444
それは逆に聞くが、各ステータスのOrderは100円と20グラムくらい違う単位系のアイテムなの?
足せないなら、それはデータ同士の問題でオペレーターの問題じゃない。

>>421で言ってるようにトランザクションの問題として扱ってもいいし、
円が入るフィールドにグラムが入ってるかグラムが入るフィールドに円が入ってるかわからんが、とにかく腐ったな伝票としてそれ以上動かんようにロックするしかないだろ。
一回腐ったものを、腐ったもの側からリカバリするのは無謀そのもの。
0447デフォルトの名無しさん垢版2017/07/14(金) 10:27:40.32ID:RXZ2Hg3X
まぁ、オブジェクト指向としては>>424が正解だと思うんだが、なんで話が紛糾するのかわけわからんわ
0448垢版2017/07/14(金) 11:07:29.52ID:vN8eqjVV
>>446
人間の問題、の「人間」はそれぞれの操作をするオブジェクトのメタファだと理解してる?
だから、注文書(Order)に対する操作をするオブジェクトであって、注文書自体の状態を変えるのは、注文書の操作をするロジックだよ。
各「操作するオブジェクト」全部に同じ処理書く訳であるまいし。

>>447
間違い。
オブジェクト自身が「操作できる」「出来ない」を決められるのはオブジェクト自身が一人で判断できる事に落とし込むべき。
古典的なMVCでも、Mにあたるクラスがロジック含めるべきじゃないでしょ。
0451デフォルトの名無しさん垢版2017/07/14(金) 16:10:22.56ID:RXZ2Hg3X
>>448
> だから、注文書(Order)に対する操作をするオブジェクトであって、注文書自体の状態を変えるのは、注文書の操作をするロジックだよ。
「注文書自体の状態を変える」主体が誰/何かを聞いているのではなくて、できるかできないかの判断は誰/何がすべきですかという質問です

で、OrderMode, OrderController, OrderViewがあったとしたら、OrderControllerであるというのがあなたの答えであるということですか?

> >>447
> 間違い。
> オブジェクト自身が「操作できる」「出来ない」を決められるのはオブジェクト自身が一人で判断できる事に落とし込むべき。
「発送されたらもうキャンセルできない」は、オブジェクト自身が判断できますね(ビジネスロジック)
「発送されたらもうキャンセルできない」と、mode.cancel()を呼べるかどうかは別問題ですよ
0452垢版2017/07/14(金) 19:32:40.05ID:vN8eqjVV
>>449
確かに。smalltalkとイベントと言われたらモデルが持つべきか。
しかし、決定とキャンセルをモデルが勝手に自分で判断するのはちょっと素直に納得できんな。

>>451
OrderModelとOrderControllerはあるだろうが、
それ自体は見せずに、
OrderOperationControllerかなんか作ると思う。
正常にOrderを失敗したりし辛いじゃん。
注文という行為は正常に行われたけど、在庫が無くて注文の確定は行われなかった、とか、invalid Operationでもinvalid Stateでも無いと思うが。
0453デフォルトの名無しさん垢版2017/07/14(金) 20:52:39.28ID:TBQIVSbV
拗らせちゃった感あるな

例を変えてタスククラスで考えよう
タスククラスの状態は

TODO 作業予定
DOING 作業中
DONE 終了

可能な状態遷移はこれだけ
TODO -> DOING -> DONE

DONEから手戻りでDOINGに戻るかもしれない
とかそういうツッコミはなし
このドメインではとにかく上記の遷移しか許されない
そしてこのシステムはシングルユーザーを想定していて権限の問題は考慮しない

TODOの時のみBeginTaskを実行可能
DOINGの時のみEndTaskを実行可能

どう設計する?
0454デフォルトの名無しさん垢版2017/07/14(金) 23:21:15.43ID:MTLV3Z4y
TodoTask型
DoingTask型
DoneTask型
を定義しろ
func(task : TodoTask)
にDoneTaskを渡そうとしたらコンパイルエラーで弾ける
これがオブジェクト指向だ
0455デフォルトの名無しさん垢版2017/07/14(金) 23:43:22.26ID:iN4cnX21
>>453
TODO以外の時にBeginTaskを実行するコードはコンパイルエラー?
コンパイルは通るけどコールする前に実行時エラー?
コンパイルもコールもできるけどオブジェクトが実行時エラー?(あるいは黙殺?)
0456垢版2017/07/15(土) 15:14:08.21ID:l4jBJff8
無駄過ぎるだろ。
結局そのタスク同士を変換(処理)する奴は、別のアクターでしょ
0457デフォルトの名無しさん垢版2017/07/15(土) 15:50:44.23ID:MQgunk1n
public class TaskService : ITaskService {
private IRepository<Task> _tasks;
public TaskService(IRepository<Task> tasks) { _tasks = tasks; }

// インターフェース分離の場合
public void BeginTask(TaskId id) {
IToDoTask todo = _tasks.FindToDo(id);
IDoingTask doing = todo.BeginTask(); // ToDoじゃなければnullpo
_tasks.Store(doing);
}

// インターフェース共通の場合
public void BeginTask(TaskId id) {
ITask task = _tasks.Find(id);
task.BeginTask(); // ToDoじゃなければInvalidState
_tasks.Store(task);
}

この程度だと使う側から見てもどっちも大差ないな
シンプルさと失敗の原因がわかりやすいだけ下の方がいいか

夜間バッチのようにもっと長くて複雑な手続きならIToDoTask、IDoingTask、IDoneTaskに分離した方が型安全で書きやすいかもしれん
0464デフォルトの名無しさん垢版2017/07/16(日) 11:01:10.05ID:Unh0LZY1
言いたいことはわからんでもないが、

>>452
> 注文という行為は正常に行われたけど、在庫が無くて注文の確定は行われなかった
とか書かれると、こいつ何言ってんだ感が増す
0471デフォルトの名無しさん垢版2017/07/16(日) 12:00:26.72ID:nvinih80
ウィン鯖にチンパンジーのアイアイエスでM$にライセンス料払うのウレピィィイしてろ奴隷
0474垢版2017/07/16(日) 12:50:28.30ID:v455lTXc
>>464
変な言い方になったのは認めるわ…。
注文のトランザクションと、注文行為のトランザクションは別では、と言う感じ。
そこを疎にしておくと負荷上がってきたときに分割しやすいし、データの不整合起こしにくいし、不整合起きちゃった時に原因探しやすい。
注文行為自体はいくらでも上げれるけど、確定していくのはジョブが全部対応するとか。

物のオーダーじゃないけどオーダリングシステムでそういうの作ったときは、すべてのオペレーションはすべてジョブコントローラーへのキューイングで、結果はジョブコントローラーに全部に作らせてた。
0475デフォルトの名無しさん垢版2017/07/16(日) 13:01:42.61ID:nvinih80
>>472
なになに
シーシャーパーのポジトーーーーーク始まっちゃう?
何が間違ってるか具体的に言ってみろよ




言えるもんならなw
0479デフォルトの名無しさん垢版2017/07/16(日) 14:29:18.90ID:u/+2FOpe
発注はしたけど受注は出来なかったって言いたいのだろうが
コーダーって一般常識がないからこういう些細なとこで詰んじゃうよね
0480デフォルトの名無しさん垢版2017/07/16(日) 14:32:34.32ID:ksC8m8Yx
サンプルに粘着して延々と揚げ足取りする人って根本的な要件を理解する能力が著しく欠如してるんだろうね
判断力が必要な仕事を任せられないタイプ
0481垢版2017/07/16(日) 14:41:15.86ID:v455lTXc
>>479
違うよ。
0482デフォルトの名無しさん垢版2017/07/16(日) 14:49:02.54ID:TnyT7/ON
オブジェクトの状態管理に限界を感じた僕は状態を廃止してイベントを定義するのであった
0483垢版2017/07/16(日) 14:53:20.80ID:v455lTXc
注文って言葉が動詞にも名詞にもなるから話が散らかるんだが、
受注に対するのは発注でしょ。
発注も受注もキューイングする処理として作って、その可否はジョブが判断する。

名詞の方の注文は、独立して存在してて、それはジョブが淡々とキューされた処理に従って処理してったり、トランザクションエラーならそうマークしていく。
どの状態の場合は、誰が何が出来る、をバラバラに作ると収拾がつかなくなる、って事が言いたい。
0484デフォルトの名無しさん垢版2017/07/16(日) 15:31:34.69ID:J7GQwUvr
>>483
君がコマンドのキューイングが好きなのは伝わったけどそれ今は全く関係ないよ

そしてそもそもお題は認可の話じゃない
ドメインモデルに定義された不変条件の話をしているんだよ

不変条件を担保するのはドメインモデルの仕事であって認可システムじゃない
誰が何をできるかを管理するのが認可システムの仕事だ

君が大好きなジョブ(トランザクションスクリプト)の場合に当てはめても根本的なところは同じね
データの不変条件を担保するのはジョブの仕事
この場合でも誰が何をできるかは認可システムの領分だ

君の間違いは不変条件と認可という全く異なる次元の話をごちゃ混ぜにして一箇所で管理しようとしたことだよ
0485デフォルトの名無しさん垢版2017/07/16(日) 15:46:04.82ID:J7GQwUvr
認可システムを取り除いた状態のシステムを考えて欲しい
ゲストユーザーも一般ユーザーも特権ユーザーも存在しない
誰であっても全てのサービスを実行することができる

ならばこのシステムは全てのデータを自由に書き換えられるのか?
そうではないだろう
認可処理が全くないからと言ってなんの統制もなくデータを書き換えればすぐにデータは矛盾して壊れてしまうはずだ

認可とは別次元で「こういう場合にはこういう処理はできない」といった条件が存在しなければシステムが崩壊してしまう
この条件のことを我々の業界では不変条件などと呼んでいる

不変条件と認可は全く関係なく分離して扱える2つの世界だ
これを一緒くたにジョブなどと曖昧な名前をつけて管理してはいけない
不変条件は不変条件、認可は認可
これらは分けて管理しないとすぐに混乱してしまう
0486垢版2017/07/16(日) 16:28:44.18ID:bf3wtQLD
>>484
うーん、認可って言葉に随分気持ちが持ってかれてるように見えるけど、
その不変条件自体が、システムの整合性を保つために設計者によって行われた「認可」そのものではないの?
ACLではない、と言いたいんだろうけど、俺の言ってるのもACLそのものじゃない。

>>485
認可条件が全くないなら、システムは崩壊する、
システムが崩壊しないならば、認可条件は全くなくは無い、
と対偶取っても大丈夫なように、
不変条件自体が、システムから与えられた認可なんよ。
しかも、不変条件は変更できない、という不変条件でいとも簡単に実装できる。

ジョブとかタスクがあるようなシステムでシステム作った事無いのかな?
0487垢版2017/07/16(日) 16:54:43.58ID:bf3wtQLD
ジョブと名前を付けてジョブで管理してるってどういう事かまだイマイチわからん。

ジョブはジョブで、巨大で膨大なキューが積まれるようなシステムでもない限り2つも3つも立てない、むしろ立てたらロック周り辛くなるからやりたくない、いわゆるジョブなんだけど。

ジョブは、一つのキューに対して、一つのアトミックな操作をする。その入力がオーダーとオペレーションの組み合わせで、そのオーダーとオペレーションによって、処理を行う、行わない、エラーにする、と処理をして、新しい状態のオーダーを記録する。
ただそれだけ。

シングルユーザでも同じ設計でやっとったがなぁ。

ってか書きながら思ったけど、今JSの世界で流行ってるReactのデータ周りそっくりだな。
0488デフォルトの名無しさん垢版2017/07/16(日) 17:04:33.91ID:J7GQwUvr
>>486
認可ではない
もしかして言葉が悪いのかな
「できる/できない」と表現すべきではなかったか
認可は「して良い/してはいけない」だな
して良い/していけないとは全く別の次元で、そもそもその処理そのものが成立するかしないかという判定があるだろう
それがモデルの不変条件だ
100円に20グラムを足すような処理は権限に関わらず成立しない
発注していない注文をキャンセルする処理は権限に関わらず成立しない

認可がなくてもシステムは成立する
全員が全ての機能を使用できるだけ
実際そういうシステムはいくらでもあるし作れるよ

認可がないとシステムが崩壊すると君が認識する理由はね
君の作るシステムは認可と不変条件がごちゃ混ぜになっているからだよ
0489垢版2017/07/16(日) 17:15:57.42ID:bf3wtQLD
>>488
処理が成立しない事を、行っても良い、のであれば「認可ではない」と認めざるを得ないが、
「処理が成立しないからその処理を行うことは無い」のであれば、
処理を行うことがない理由は、「処理が成立しないから行ってはいけない」だけの話じゃん。
事実としては、100円に20グラムをどうしても足したいなら、そのロジック作るしかないんだから、もはやその置き場所が無いモデル化は余計に間違ってるとしか言い様が無いわ。
2ダース足して1個引くとか、単位系読み替え程度ならいくらでもホントにあるしな。
コード××100mgにコード○○を1アンプル足したものとかザラ。

俺のシステムは崩壊しないよw
そっちが「崩壊する」と言うから、対偶を取って見せただけなんだけど。

ごちゃまぜどころか、不変条件なのに変えなければいけない事すらあるんだから。運用では。
だから、不変条件は変更できない、なんて自己言及して定義してあるんだよ。

勝ちたいだけならもうやめとけよ。哀れだから。
0490デフォルトの名無しさん垢版2017/07/16(日) 17:23:09.26ID:J7GQwUvr
>>487
わかってるよ
リクエストを受け取るとデータと処理のペアをキューイングする
ジョブがキューをポーリングして実際の処理を行う
っていう古臭いシステムの話でしょ

ぜんっぜん関係ないよね
キュー使おうがイベント使おうがAwait使おうが直列に処理しようが並列に処理しようが今の話題にとってはどうでもいいでしょ
0491デフォルトの名無しさん垢版2017/07/16(日) 17:28:10.27ID:Unh0LZY1
>>483
> どの状態の場合は、誰が何が出来る、をバラバラに作ると収拾がつかなくなる、って事が言いたい。
「どの状態のときに何ができる/できない」と、「誰が何をできる/できない」をごっちゃにするなって
みんな言ってるのに、まだわからないかな
0492デフォルトの名無しさん垢版2017/07/16(日) 17:39:04.15ID:J7GQwUvr
>>489
成立しないから行なっては「いけない」のではなくて
成立しないから行うことが「不可能」な

100円に20グラムを足すことは不可能なので実行しようがないので権限の問題ではない

ダースと個数は可換なので足し算引き算を定義することが「可能」で誰であっても実行「可能」だ
しかしそういう機能をユーザーによって実行して良いかどうかを切り替えたいならそれは認可の問題だ
しかし君のシステムでは定義することが可能かどうかを認可の問題にすり替えている

コードxx100mgにコードyyを1アンプル足すは「足す」の意味から違うじゃん
化学計算的な意味での足すじゃなく薬液を混ぜるの意味での「足す」
あるいは注文カートにxxとyyを足すといったようなパッケージング処理の「足す」
などそういった意味で「足す」だろう
そう意味での「足す」は実装可能で誰でも実行「可能」だ
そういう機能をユーザーによって実行して良いかどうかを切り替えたいならそれは認可の問題だ
しかし君のシステムでは定義することが可能かどうかを認可の問題にすり替えている

君のシステムは崩壊目前なので一度誰かにレビューしてもらった方がいい
0493デフォルトの名無しさん垢版2017/07/16(日) 17:40:22.64ID:7YnVXBSW
> 「どの状態のときに何ができる/できない」と、「誰が何をできる/できない」をごっちゃにするなって

どの状態=ログインしているアカウントの状態
と考えれば、同じこと
0494デフォルトの名無しさん垢版2017/07/16(日) 17:50:14.74ID:7YnVXBSW
>>486
> その不変条件自体が、システムの整合性を保つために設計者によって行われた「認可」そのものではないの?

違う。例えば構文が正しい場合のみコンパイラはコードをコンパイルするが
これは「コードが正しいと認可した」などとは言わない。
日本語の問題。日本語が間違っている。
0495デフォルトの名無しさん垢版2017/07/16(日) 17:52:11.91ID:J7GQwUvr
>>493
それはアカウントと他のものをごちゃ混ぜにした考え方
まずはそれを分離して考えてくれ
アカウントのできるできないと他のもののできるできないは別に考えよう
その上で今はアカウントの話をしてないのでそっちについては忘れよう
ただそれだけなんだけどなんでわからないかなぁ
0496デフォルトの名無しさん垢版2017/07/16(日) 17:53:47.54ID:7YnVXBSW
呼んではいけないメソッド
存在しないメソッド
使用が許可されてないメソッド
バグが有るメソッド

どのメソッドであっても(コンパイルエラーにならない場合は)
実行エラーになるが、その全てが認可エラーではない。

実行した結果、認可エラーになるものはあるが、
それは実行時エラーの特殊な場合

実行時エラーを継承して認可エラーを作るのであって
認可エラーを継承して、その他の実行時エラーを作るわけではない
0497デフォルトの名無しさん垢版2017/07/16(日) 17:54:20.87ID:J7GQwUvr
そのうちE = mc^2はアインシュタインが認可した法則だ
などと言いだしそうだなこいつ
0498デフォルトの名無しさん垢版2017/07/16(日) 17:58:03.77ID:7YnVXBSW
>>495
「どの状態のときに何ができる/できない」と、「誰が何をできる/できない」
この2つを分離するのは間違ってる。

どの状態?という、大きな枠組みとして状態のチェックが有り、
 その状態チェックの中の一つとして
  ・数字チェック
  ・範囲チェック
  ・整合性チェック
  ・権限チェック

などがある。

誰が何をできる/できないというのも、
状態のチェックにすぎない。
0499デフォルトの名無しさん垢版2017/07/16(日) 18:06:19.68ID:7YnVXBSW
もちろん、100円に20グラムを足すことは不可能とかいうのは
状態のチェックじゃないぞ。


まあ無理やり考えれば、あるオブジェクトがあって、
そのオブジェクトが数値だけではなく単位まで状態として持っているのであれば、
オブジェクトとオブジェクトの加算で状態(単位が同じであること)と
みなすことも可能だがねw
0500デフォルトの名無しさん垢版2017/07/16(日) 18:08:20.22ID:J7GQwUvr
>>498
つまり内容はともかく全部チェック処理だからチェック処理というグループを作ってそこにまとめてぶちこめ
権限のチェックもオーダーの状態のチェックも単位系のチェックも全てチェック処理だからチェック処理のグループでまとめて考えろ
そういうことを言いたいのか?
0501デフォルトの名無しさん垢版2017/07/16(日) 18:11:01.44ID:7YnVXBSW
>>497
そういうこと。

カッコつけて「認可」なんて単語を使ってるのが悪い。
単に「状態チェック」と言えば良いんだよ。


状態チェックの中の一項目として認可が存在する。

なのに状態チェックを認可なんて
カッコつけて呼ぶから、みんなから突っ込まれてる。


ドヤ太郎「引数が数字であることを認可する!」
0502デフォルトの名無しさん垢版2017/07/16(日) 18:13:20.36ID:J7GQwUvr
>>499
芝を付けるようなおかしな話か?
単位系を付けるパターンは珍しいことではない
特に金を扱うシステムで国際化する場合には量と単位を持ったお金クラスの使用は必須と言ってよい
プリミティブクラスをクラスでラップしろというプラクティスはあまりにも有名だが
それはこういった単位と量の取り扱いをより厳密に実践せよということだぞ
0503デフォルトの名無しさん垢版2017/07/16(日) 18:14:14.91ID:7YnVXBSW
>>500
> チェック処理のグループ
チェック処理のグループってなんだよw


何かの処理(メソッド)を実行した時、
それが実行可能かどうかチェックするってだけだろ
その内容なんてどうでもいいわw


俺が言ってるのは実行可能かチェックすることを
「認可」って名前で呼ぶなって言ってるだけ
0504デフォルトの名無しさん垢版2017/07/16(日) 18:16:13.57ID:7YnVXBSW
>>502
お前が言ってるのはドルや円といった変換可能な単位の話だろ
俺が言ってるのは、円やグラムといった変換可能ではない単位の話だ
0506デフォルトの名無しさん垢版2017/07/16(日) 18:21:05.03ID:J7GQwUvr
>>503
認証・認可はセキュリティに関わる事項
特別扱いするには十分な理由で常識だ
君の発言はシステム開発に関わる人間の発言とは思えない
0508デフォルトの名無しさん垢版2017/07/16(日) 18:25:50.70ID:7YnVXBSW
特別扱いするというのなら、
セキュリティに関する部分は
単純な比較命令や条件分岐命令を使うのではなく
専用の機能を使うべきでしょう?


でも、コードからすれば何ら特別扱いは
されていませんよね?
0509デフォルトの名無しさん垢版2017/07/16(日) 18:40:06.18ID:J7GQwUvr
>>507
セキュリティ事故を起こすと金もかかるし信用も失う
君も新人研修で習っただろ?
そんなバカバカしい疑問が出るってことは学生さんか?
0510デフォルトの名無しさん垢版2017/07/16(日) 18:42:18.52ID:J7GQwUvr
>>508
君のコードからは特別扱いされてないだけ
認証・認可はそのためのモジュールで取り扱うのが一般的です
0511デフォルトの名無しさん垢版2017/07/16(日) 18:43:47.33ID:7YnVXBSW
>>509
だからなんなんだよw

お前が言ってるのは重要なチェック処理と
重要でないチェック処理があるってだけの話だろ?

俺はどちらもやってることはチェック処理に
すぎないって言ってるだけ
0512デフォルトの名無しさん垢版2017/07/16(日) 18:43:48.37ID:J7GQwUvr
>>504
可換不可でも発想は同じ
100円オブジェクトと20グラムオブジェクトを足そうとしたら実行時エラーないしその前にコンパイルエラーだ
0513デフォルトの名無しさん垢版2017/07/16(日) 18:44:50.67ID:7YnVXBSW
>>510
> 認証・認可はそのためのモジュールで取り扱うのが一般的です

そのモジュールを使えば、メソッド一つでチェックできるようになるんだろう?
0515デフォルトの名無しさん垢版2017/07/16(日) 18:47:23.57ID:J7GQwUvr
>>511
文字列のパターンマッチ検証と
認証サーバーへの問い合わせ
が君の目には同じ処理に見えるってことか?
世界観が違いすぎて会話が成立しないんだけど
0516デフォルトの名無しさん垢版2017/07/16(日) 18:50:37.56ID:7YnVXBSW
> セキュリティ事故を起こすと金もかかるし信用も失う

東証の誤発注事件、セキュリティとは関係なかったよなw

セキュリティでなければ、お金や信用は失わないと?
0518デフォルトの名無しさん垢版2017/07/16(日) 18:52:34.86ID:7YnVXBSW
>>515
> 文字列のパターンマッチ検証と

文字列のパターンマッチ検証のバグで
大損害を起こすことも考えられるからな。

重要かどうかは、やってる処理内容ではない。
やっている場所だ。


どちらもチェック処理であることは明白
重要な箇所のチェック処理であるかどうかの違いがあるだけ
0519デフォルトの名無しさん垢版2017/07/16(日) 18:53:52.09ID:7YnVXBSW
>>517
> その処理にビジネス上のメリットがあるとは思えないが好きにすればいいよ
それはお前が思いつかないってだけだろう?

例えば中古買取システムだと、衣類はグラム単位で買い取り価格が決まるとか
あるわけだが。
0520デフォルトの名無しさん垢版2017/07/16(日) 18:58:12.52ID:J7GQwUvr
>>516
学生さんじゃないな
小学生か

どんな処理でも事故を起こせばペナルティの可能性はある
とはいえ事故の種類によって確率も被害額も異なる
セキュリティ事故は注意していなければ事故を起こしやすく被害額も大きい
つまり対策に投資する価値が大きな分野ってこと
0523デフォルトの名無しさん垢版2017/07/16(日) 19:01:38.94ID:J7GQwUvr
>>519
そういうドメインがあったとしても円とグラムの足し算を定義するメリットはない
混乱するだけだからエラーになるようにしろ

古着の重量から取引価格を問い合わせるサービスを書け
問い合わで得た価格を足し算しろ
その方がずっとわかりやすい
0524デフォルトの名無しさん垢版2017/07/16(日) 19:06:15.16ID:J7GQwUvr
>>522
ビジネス上の価値が違うって言ってるの
処理の目的も実装も違う
チェック処理ってまとめ方は大雑把すぎる

飯を食ってくるから戻る前にレス溜めといてくれ
あとでまとめて返す
0526デフォルトの名無しさん垢版2017/07/16(日) 19:54:32.08ID:zK8m4Miw
白黒つけるなら、前提条件が分からんと何がベターか分からん。

要件定義書持ってこい。
0527デフォルトの名無しさん垢版2017/07/16(日) 20:04:35.46ID:yM+ti3sc
「不可能」でも「状態チェック」でも「認可」でも何でもいいんで
それはコンパイラがコンパイル時に行うのか
それともコール自体を実行時に許さないのか
はたまたコールは許すけど結局弾くだけなのか

どれを想定するかで設計が変わるんで
出題者はそろそろ答えてくれまいか
0528垢版2017/07/16(日) 21:52:05.18ID:bPx1MEIf
やっぱ「認可」って言葉に振り回されてんのな。
「これが俺の言う「認可」。お前が言ってるのはこれだろ?」に、そう呼びたいなら呼べばいいやと思ってその言葉使ってるだけで、
単純に言えば>>416でチェックって言うとる。

>>490
古臭かろうが生きているのは、変な話絶滅すべき理由が無いというそこそこ大切な理由がある。

>>491
ごっちゃにすべき話だよ。「この状態の時に何ができるか」は「誰が」をつけないと意味がない。
もちろん、「誰が」にも「この状態」にもワイルドカードが入ることもあるが。

>>492
その状態では誰でも出来ないよ。薬剤に薬剤部の承認が降りてて、実施者は医師ないし医師から指示を受けた看護師か薬剤師しかできん。

崩壊目前と言われても、もう俺が知ってるだけで12年は動いてるけどな。
サーバ側のモジュールは1989年の見たことあるわ。

>>527
コンパイル時に解決って発想がすごいな。
リリース時には、依存関係を一式リリースしないといかんのでは?と思ってしまう。
0529デフォルトの名無しさん垢版2017/07/16(日) 22:48:41.11ID:X07S5niy
絵に描いたようなレガシーおじいちゃん
0530垢版2017/07/16(日) 23:09:18.60ID:bPx1MEIf
>>529
全然30代だけど、おじーちゃん扱いか…。
0531デフォルトの名無しさん垢版2017/07/16(日) 23:15:04.45ID:2wo8gPgW
認可処理が本質的に複雑なシステムでうまく体系化できていないんだろうね
認可処理が体系化されてないシステムってアドホックな認可検証処理があちこちにばら撒かれて他の処理に紛れてしまうものなんだ
それで紛れちゃったから区別がつかなくなってしまったんだろう(少なくともメンテナの彼は区別が付いてない)
昔から世界中で問題視されて来た典型的なアンチパターンってわけ
多くの失敗例を反省して改善してきた答えが認可システムと他のロジックの分離なんだけど
これはその成果を取り入れる前の実験台になった世代のシステムだったということだね
0532垢版2017/07/16(日) 23:19:58.25ID:bPx1MEIf
>>531
まぁ、なんとでも言えば良いと思うけど、
アドホックな認証認可の検証を一切しないためのキューだよ。
取り入れるも何も、最初からしとる。

お前、全く理解できてないだろ。
0533垢版2017/07/16(日) 23:22:16.71ID:bPx1MEIf
要は、負けたくないんです、って言ってるんだよな?

オブジェクトとして、ステートフルで、操作の例外を自身がすべて処理するクラスは存在しても良い、と。

まーそれでいいよ。もう伝わんないだろうし。
無駄だわ。
0534デフォルトの名無しさん垢版2017/07/16(日) 23:25:25.46ID:X07S5niy
>>530
レスからは年齢を感じる
30台ならまだもうちょいいけるから元気だして
0535デフォルトの名無しさん垢版2017/07/16(日) 23:29:13.66ID:2wo8gPgW
>>532
他の検証処理と一緒くたにしてるんだろ
そういうのをアドホックっていうんだよ
そしてこのキューは関係ない
君の使ってるキューはジョブスケジューリングのためのものだろ
むしろこれに検証やロジックが結合しているならそれこそおかしな設計だよ
0537デフォルトの名無しさん垢版2017/07/17(月) 00:17:18.40ID:Fkkap2CA
何の話してるか3行でまとめろ
状態をコンパイルで安全に実装する話じゃなかったのか?
0538垢版2017/07/17(月) 01:02:43.35ID:JcUUgs2I
>>535
ad hocの意味調べてこい
0539垢版2017/07/17(月) 01:04:43.49ID:JcUUgs2I
>>534
大学生の時からフリーで仕事しとったから、職歴としては長いからな。
0541デフォルトの名無しさん垢版2017/07/17(月) 08:13:45.47ID:1hPCwKm/
よし議論を仕切り直すぞ

まず「認可」議論が何にこだわってるのか意味不明

100円と20グラムを足せないようにしたいなら
貨幣クラスと重量クラスを作って型チェックすればいい

品物を発送したら注文のキャンセル不可にしたいなら
ステートパターンとかで発送状態にして
キャンセル判定すればいい

ふつうは前者を実行したらエラーや例外にするし
後者はいちいちアプリごと落ちたらうざいので
「発送後はキャンセルできません」とか画面に表示する

んで、それだと何がダメで
じゃあどうしたらいいのか
さっぱり話が見えてこない
0542デフォルトの名無しさん垢版2017/07/17(月) 08:31:31.91ID:1hPCwKm/
おそらく認可君が言いたいことを察すると
不変条件は不変だから
認証系と混同するなよってことかな
それ自体はそうだよ

100円と20グラムを足すような処理は
100パーセントないと断言できるから
コンパイルエラーで100パー弾いても構わない

それに対してキャンセルの話は
発送後も不良品であれば返品できるみたいに
実務では複雑な条件になるし変更もありうる

だからその判定が複雑なら
キャンセルクラスを作って判定するかな

それよりもっと高度な何かを求めてるなら
説明してもらわないと分からない
0543デフォルトの名無しさん垢版2017/07/17(月) 08:49:02.13ID:vyn2jib/
>>541
その認識であってるよ
そこに「認証認可系とごちゃ混ぜにして処理しろ。分けて考えるな。キューイング!キューイング!」ってちょっと変な奴が絡んできたから「分けて考えるのが正解だし、そもそもそれ今関係ないだろ」って応酬を延々と続けていただけ
連休の2ちゃんではそういうことがままある
0544垢版2017/07/17(月) 11:33:50.06ID:6lVfk8iG
だってなぁ。
ママゴト聞いてるみたいだもん。
0546デフォルトの名無しさん垢版2017/07/17(月) 13:06:08.92ID:orwW66DF
>>542
> だからその判定が複雑なら
> キャンセルクラスを作って判定するかな
複雑じゃない場合はどこに実装するんだ?
0547デフォルトの名無しさん垢版2017/07/17(月) 13:08:53.23ID:H+ZLTTJY
> それに対してキャンセルの話は
> 発送後も不良品であれば返品できるみたいに
> 実務では複雑な条件になるし変更もありうる

それ返品の話ですよね?
キャンセルじゃないですよね?
0548デフォルトの名無しさん垢版2017/07/17(月) 13:39:57.19ID:ZHrINvVG
お互いに見下しあう口喧嘩に解のない無駄でしかないってのに
暇そうで羨ましいよ
0549デフォルトの名無しさん垢版2017/07/17(月) 14:34:06.46ID:orwW66DF
結局、"あ"氏にとってのオブジェクトの定義は、単なるデータスキーマでしかないということ

>>416
> 値を持ったデータの塊に生やしたメソッドでやるから話がややこしくなるのでは?
> 値は値なんだし。
> 値に何かさせたら、値自体が変わるってすごいめんどくさいと思う。
> しかも、何かさせられない状態すら持ってる。これヤバい。

で、対する一派は、オブジェクトは振る舞いを持っているしルールも持っているという認識

話は噛み合わないよ
0550垢版2017/07/17(月) 14:45:52.49ID:ql0cyt0N
俺も暇なのは確かだけど。
こんなに盛り上がるとはな。
まー、いにしえのナントカ、みたいなのは良くも悪くも「ちゃんと動く」から、いにしえのナントカとして未だに生きてるんだから、
無碍に否定してもきりがない。
ジョブシステムの致命的な欠点の「ジョブサーバが死んだら何も動かない」を突かれたら
「死なんように単機能なんだ。だから、どんな処理も「処理完了,処理結果:不正」という正常系でさばく必要がある」
としか言えないところだったのに、そこはスルーなのがわからん。
0551垢版2017/07/17(月) 14:48:06.21ID:ql0cyt0N
>>549
オブジェクトの定義は、「単なるデータスキーマ」であるか「単なるタスクの実装」であって、それ混ぜると収拾つかなくなるよ、なので、
単にオブジェクト指向を否定してるわけではない事だけ伝わってほしい。
0552垢版2017/07/17(月) 14:51:10.45ID:ql0cyt0N
継承と移譲も、インターフェイスと実装も、そのデータたちや、アクターのクラスたちの中でやる分には効果的だけど、
その線を踏み越えたらすべきじゃないと思うから、否定してるのかな。どうなんだろう。
0553デフォルトの名無しさん垢版2017/07/17(月) 14:59:23.48ID:ka/V7JjN
あんまデータ自体に状態持たせないで、
状態に対応したテーブル用意して、キューで逐次処理する方がよくね。

そうすると、RDBとツリー階層で互換性もたせられて、色々対応づけるのに楽な場面があると思うんだよね。

発送前フォルダ、発送後フォルダとか。

キャンセルは発送前までの処理でしか受付ないし、返品は発送後2週間まで受け付けます。とか。

なんか商品に不具合あって返品したいなら、まずメールでやり取りすると思うし、その後の判断はメーカー側で行って、返品操作はメーカー側でやるでしょ。

で、返品の判断なんて難しいからシステムに組み込まないで、返品対応マニュアルをエンドユーザさんで用意してもらえば終わりでしょ。
0554デフォルトの名無しさん垢版2017/07/17(月) 15:03:51.66ID:orwW66DF
>>551
> オブジェクトの定義は、「単なるデータスキーマ」であるか「単なるタスクの実装」であって、それ混ぜると収拾つかなくなるよ、なので、
> 単にオブジェクト指向を否定してるわけではない事だけ伝わってほしい。
(少なくとも俺は)そのオブジェクトには「ルール」が欠けていると思う
「発注されたらもうキャンセルできない」もルールの一つ
そのルールを、注文というオブジェクトの外側で担保するというのなら、俺に言わせれば、
それなんのためのオブジェクトなのってことになる
C時代の構造体+手続き型コードと何ら変わりないでしょ

まぁ、俺が言いたいのはそれ以上でも以下でもないのだが
0555デフォルトの名無しさん垢版2017/07/17(月) 15:11:58.17ID:H+ZLTTJY
> ジョブシステムの致命的な欠点の「ジョブサーバが死んだら何も動かない」を突かれたら

ジョブスが死んだらAppleは何も動かないって
話かと思った
0556垢版2017/07/17(月) 15:56:37.16ID:ql0cyt0N
>>554
オブジェクト指向は方法であって、目的じゃないよ。
Cの構造体でも、構造体にそんな関数ポインタ持たせたいと思わないし、
ルールってどっちが持ってるものなの?ってのはCで書いたときも同じように、構造体を弄る側に持たせる派と、構造体を使う側が気をつけて使うかでそれなりにモメる所かと。

構造体へのアクセスをすべてラッパで包む→一部の奴らがメンバが読めないじゃないかと言い出すが最終的におちつく
までは多分同じなんだけど、細かいプロジェクトだと

構造体へのアクセスをすべてラッパで包むし、そのラッパ関数があまりにも逸脱した操作はエラーにする
 →喧嘩の後「『あまりにも逸脱した操作』を明文化せよ、そして常にメンテナンスせよ、そして業務フローやシステム改修時には無限に対応せよ」
  のおふれが出て、言いだしたやつが泣き、保証はすべてそいつがする。

構造体へのアクセスをすべてラッパで包むが、ラッパは薄皮に留める
 →喧嘩の後「各サブシステム屋はステートと分岐に対して100%の網羅度で試験せよ。さもなくば本系接続禁止」
  のおふれが出て、全体が少しずつ泣くが、保証は各サブシステム屋が担保する

と、だいたいの流れがある。
後者の方は、保証する範囲や、データの整合性に関して、自然と疎になるので、いい意味でも悪い意味でも足切りしやすい。
0557垢版2017/07/17(月) 16:10:16.78ID:ql0cyt0N
>>554
もうちょっと具体的に言うと、
「注文」への「ある操作」が「無効」ならば例外とする、ってのは、注文が持つべきルールで良いと思う。
ただ、「注文へのある操作」を「無効」にするのは、注文の役目ではない。だから、「発注されたらキャンセルできない」はルールみたいだが、厳密にはルールじゃない。

『「発注」すると、「キャンセルすると言う操作」を無効にする』ってロジックが居て初めて、注文はキャンセルを無効と自分で判断できる、では無いか?

「キャンセルできなくする」は「発注」ロジックの役目で、注文が自発的にやるべき事じゃ無いと思う。
0558垢版2017/07/17(月) 16:13:19.86ID:ql0cyt0N
そうすると、発注ロジック作るやつも、キャンセルロジック作るやつも、相手の事一切考えなくて済むのでは、と思うが。
単に、「できる状態ならば、する」だけになる。
やるべき処理が小さくなればなるほど、作りやすいし試験しやすいし、変なデータできた時に追いかけやすいじゃん。
0559垢版2017/07/17(月) 16:18:33.43ID:ql0cyt0N
あと、
できない状態ではない=できる、では無くて、
「できない状態を定義した時点で、できなかった状態」ではない=できる
に過ぎないから、
「発注されている場合はキャンセルできない」と否定文で動作の可否を定義すると、仕様を拡張する時にどっかで漏れるよ。
0562垢版2017/07/18(火) 01:37:33.05ID:r9TddzbB
>>560
自分の思ってるオブジェクト指向でなければ、よく知らないけど手続き型に違いない、は惨めだからやめといたら?
0563垢版2017/07/18(火) 01:39:10.12ID:r9TddzbB
見に行ったら、あっちでも言われてんじゃんw
0565デフォルトの名無しさん垢版2017/07/18(火) 05:47:26.05ID:yansF8kz
あさんあなたの方法論は誰が見ても手続き型ですよ
惨めな自演はやめた方がいいです
0566デフォルトの名無しさん垢版2017/07/18(火) 05:51:49.29ID:j0qpHmEl
>>549
このまとめはその通りだよ

オブジェクト指向なら
データと処理は一体化させるのが基本


>>554
>それなんのためのオブジェクトなの
おおむね同感

細かく言うとルールが複雑になったら
判定はルールオブジェクトにして
注文オブジェクトから委譲するけど
カプセル化されてるから構造化とは違う
0567デフォルトの名無しさん垢版2017/07/18(火) 05:59:46.35ID:OEZUwdxD
おまえらは日本語が下手すぎてコードが想像つかん
パブリックリポジトリにコードうpして議論しろ
0568デフォルトの名無しさん垢版2017/07/18(火) 07:00:15.06ID:H1BKDDhK
>>565
同意者数は意見の根拠として弱いよ

仮に数を根拠とするならその誰がみてもって根拠は?
お前が保証できる視点はお前の視点だけだよ
0571垢版2017/07/18(火) 08:21:46.73ID:zGBDd9F+
>>565
自演てw
そんなことせんでも俺はずーっと同じこと言ってるぞ。
誰かに名乗れと言われたから仕方なく「あ」とつけてるくらい。

オブジェクト指向であれば、手続き型ではない、
これ変だよね。
オブジェクト指向か、コンポーネント指向か、アスペクト指向か、etc,etcのモデル化のパラダイムと、
手続き型、関数型、純関数型、etc,etcの、スタイルや値の扱い方のパラダイムは、どう組み合わせたらどうなんて問題じゃないと思うが。
オブジェクト指向で関数型、もあるし、
オブジェクト指向ではない関数型もあるし、
オブジェクト指向で手続き型もあるし、
オブジェクト指向でメッセージドリブンな関数型も
オブジェクト指向でメッセージドリブンな手続き型もある中で、
なにを突っ込まれてるかわからん。

自分の定義が狭すぎるのでは?
0572デフォルトの名無しさん垢版2017/07/18(火) 09:07:26.16ID:tId1dkJr
色んな言葉知ってるんだ!
えらいねー。

これでいい?
誰かに褒めてもらいたいようにしか見えない。

ママのおっぱい離れして、小学校卒業するぐらいの文書能力がついたらまたきなよ。
0573垢版2017/07/18(火) 13:01:06.91ID:zGBDd9F+
なんだろう、この虚しさ。
褒めてもいらんし、むしろ間違ってたら指摘してほしいくらい(なので、>>566には割と納得感がある。最初からルールオブジェクト作ってるのと同じじゃん?と言う気持ちもあるが、そこは考え方と言うか俺が構え過ぎなのか、考えあぐねてる)
少なくとも、理解できないなら理解できない事を挙げてほしいが。

「小学校卒業するぐらいの文書能力」自体、無茶苦茶な日本語だと思うが。
文書は能力でないだろ。文書作成能力、もしくは文章力で、
能力に対して「ぐらい」って言うなら、前半は見込みや可能性、確度であるべきなんだから、「小学校卒業できるぐらい」にならなきゃいかんのでは?尤も小学校は日数で卒業できるが。
「ここに張り紙をするな」って張り紙みたいなみっともないのはやめてほしい。
0574デフォルトの名無しさん垢版2017/07/18(火) 13:57:59.68ID:tId1dkJr
そういうところじゃね。
揚げ足取りとか。

問題を解決したい訳でなく、議論ごっこをしたいだけに見えます。

だから、終わりがないし不毛です。
0575デフォルトの名無しさん垢版2017/07/18(火) 14:07:15.35ID:fE/UB1Gl
そいつは重度の知ったか自己弁護野郎だから放置が一番
他のスレでも結局放置されてた
0576デフォルトの名無しさん垢版2017/07/18(火) 16:08:09.93ID:ECiix6T1
>>557
> 『「発注」すると、「キャンセルすると言う操作」を無効にする』ってロジックが居て初めて、注文はキャンセルを無効と自分で判断できる、では無いか?
ごめん、書き間違えたよ
正しくは、「発送されたらもうキャンセルできない」

あと、無効にする処理をどこに実装するかの話はしていないよ
ルールの実装をどこにするかの話

class Order {
  public bool isCancelable() {}
  public void cancel() {}
}

client:
order = new Order();
if (order.isCancelable()) {
  order.cancel();
}
というコードの場合、以下の点がよろしくない
・cancelの正しい手続きを呼び出し側が知っておく必要がある
・その手続きに変更があった場合、Order::cancel()を呼び出している箇所全部を修正しなければならない
・誤った呼び出しをしてしまうと、データに不整合が発生する

class Order {
  private bool isCancelable() {}
  public void cancel() {
}
}
0577デフォルトの名無しさん垢版2017/07/18(火) 16:11:30.47ID:ECiix6T1
途中で書き込んでしまった

それに対して、オブジェクト自身がルールを持っていれば
class Order {
  private bool isCancelable() {}
  public void cancel() {
    if (!isCancelable()) {
      // エラー処理(例えば例外をthrow)
    }
    // 実際のキャンセル処理
  }
}

client:
order = new Order();
try {
  order.cancel();
} catch () {
}

クライアントは、
・cancelの正しい手続きを知る必要はなく、単に呼び出すだけ
・その手続きに変更があっても、呼び出し側は変更する必要がない
・誤った呼び出しもない
というメリットがある
0578デフォルトの名無しさん垢版2017/07/18(火) 16:14:53.99ID:ECiix6T1
一方、権限としての呼び出し可/不可の話はこれとは別
なぜなら、cancelの呼び出し権限があるかどうかは、Orderオブジェクト自身は知りようがないから
0579デフォルトの名無しさん垢版2017/07/18(火) 16:18:09.27ID:ECiix6T1
もちろん、「自分の注文のみキャンセルできる」という単純な権限チェックなら、Orderモデルの範囲内で
チェックが可能なので、そう実装してもいい

class Order {
  private bool isCancelable() {}
private string orderUserID() {}
  public void cancel(string cancelUserID) {
    if (!isCancelable()) {
      // エラー処理(例えば例外をthrow)
    }
    if (orderUserID() != cancelUserID) {
      // エラー処理(例えば例外をthrow)
    }
    // 実際のキャンセル処理
  }
}

まあ大抵はロールによる権限管理とかのケースが多いだろうから、その場合はOrder自身は権限チェックできない
0580デフォルトの名無しさん垢版2017/07/18(火) 16:22:38.33ID:j0qpHmEl
>>571
>オブジェクト指向であれば、手続き型ではない
変じゃないよ

たしかに構造化に近いレベルでも
オブジェクト指向とされているのが現実だけど
手続きを隠蔽するのが本来のオブジェクト指向
0581デフォルトの名無しさん垢版2017/07/18(火) 16:32:17.28ID:j0qpHmEl
>>576-579
考え方としては筋が良いけど
もっと突き詰めていくと
キャンセル可能かどうかの判断は
キャンセルオブジェクト自身の責務にしたい

つまり
>if (!isCancelable()) {
はキャンセルオブジェクトの内部にあって
Orderクラスからは知らなくていいようにする

Orderクラスからcancelメソッドを呼ぶと
キャンセルクラスの内部で判定するように
0583デフォルトの名無しさん垢版2017/07/18(火) 17:17:22.85ID:j0qpHmEl
>>582

class Order {
 Canceler canceler;
  void cancel() {
   canceler.cancel();
  }
}

class Canceler {
 boolean isCancelable() {
 }
 void cancel() {
  if (!isCancelable()) {
  }
 }
}
0587デフォルトの名無しさん垢版2017/07/18(火) 17:57:51.15ID:j0qpHmEl
>>584
デメリットってどんな?
ないとは言わないが
メリットの方が上回ってるはず


>>585
データと処理が一体なのがオブジェクト指向
だけどあえて言えばデータが基本

注文されたかどうか
発送されたかどうか
振込されたかどうか
などの状態を持っていて
メソッドでその状態を変えられる
ただしそれらは委譲している場合もある
0588デフォルトの名無しさん垢版2017/07/18(火) 18:12:21.69ID:bC2KM4MS
>>587
データと処理が一体化がオブジェクト思考?
馬鹿いうな。

オブジェクト思考は役割を小さくし、
疎結合を保つ試み。

データはデータの構造に着目しろ。
処理は処理クラスに任せろ。

注文データを作ったら、それを確定、キャンセルするのは処理クラスの役割だ馬鹿。
0589デフォルトの名無しさん垢版2017/07/18(火) 18:28:13.42ID:ECiix6T1
>>587
> デメリットってどんな?
「発送されたらもうキャンセルできない」という話の流れで出したコードだけど、それに沿って説明すれば
実際には>>583

class Order {
  Canceler canceler;  // この結合も良くない
  void cancel() {
    calceler.cancel(this);
  }
  void processCancel() {
    // 実際のキャンセル処理はOrderモデルしか知らない
  }
}

class Canceler {
  boolean isCancelable(Order order) {
    // order.getState()でも呼ぶ?
  }
  void cancel(Order order) {
    if (!isCancelable(order) {
      order.processCancel();
    }
  }
}

みたいなヒドイことになるのだが

逆に、メリットってなんだろうか?
0591デフォルトの名無しさん垢版2017/07/18(火) 18:33:41.00ID:ECiix6T1
if (!isCancelable(order) {
  order.processCancel();
}
じゃくて、
if (isCancelable(order) {
  order.processCancel();
}
だな
0592デフォルトの名無しさん垢版2017/07/18(火) 18:34:39.87ID:bC2KM4MS
canceler.cancel(order)
order.cancel()

dryの原則に反してるからcancelerクラスのキャンセル処理だけありゃいいだろ!

俺はどっちからキャンセル呼べばいいんだよ!
0593デフォルトの名無しさん垢版2017/07/18(火) 20:21:20.26ID:j0qpHmEl
>>589
>実際のキャンセル処理はOrderモデルしか知らない
違う、逆に実際のキャンセル処理はCancelerしか知らない
Cancelerのcancellなどのメソッドにキャンセル処理を書く

>メリットってなんだろうか?

>>576
>・cancelの正しい手続きを呼び出し側が知っておく必要がある
>・その手続きに変更があった場合、Order::cancel()を呼び出している箇所全部を修正しなければならない
>・誤った呼び出しをしてしまうと、データに不整合が発生する

>>577
>・cancelの正しい手続きを知る必要はなく、単に呼び出すだけ
>・その手続きに変更があっても、呼び出し側は変更する必要がない
>・誤った呼び出しもない

この関係がそのまま当てはまる
Cancelerを呼び出すOrder側を
クライアントと考えればいい

実務では処理が複雑になるが
Orderだけに権限が集中すると
肥大化していくから委譲する
0594デフォルトの名無しさん垢版2017/07/18(火) 20:26:20.19ID:JvbXhUfX
Orderだけで完結してるならcancel()で普通に判定
Orderだけで完結してるけど複雑ならcancel()からルールチェインを生成して移譲
Orderだけで完結してないならcancel()からdependencyにアクセス

クライアントはなにも考えずにorderをキャンセルしたいだけなのだからorder.cancel()以外のAPI(canceler)を知りたくない筈だ
同じ理由でクライアントがorderのデータにアクセスするなどもってのほか
0595デフォルトの名無しさん垢版2017/07/18(火) 20:35:03.86ID:j0qpHmEl
>>588
IT Pro
http://itpro.nikkeibp.co.jp/article/COLUMN/20060410/234873/
>「プログラム(処理)とデータをひとまとめにして」扱えばよい。

オージス総研
https://www.ogis-ri.co.jp/otc/hiroba/technical/concept.html
>カプセル化とは、データとそれらを操作する手続き群とを
>ひとまとめにしてパッケージとしたものです。


少しは調べてから物を言えよ……

データと処理の一体化(カプセル化)は
オブジェクト指向の基本だぞ
0596デフォルトの名無しさん垢版2017/07/18(火) 20:40:02.92ID:JvbXhUfX
>>593
Orderがクライアントになるというのはつまりこういうこと

class Order {
private Canceler canceler;
public Order(Canceler c) { canceler = c; }
public void cancel() { canceler.cancel(this); }

Orderのクライアントは常にorder.cancel()だけを知っていればおk
cancel()の中でなにをやってるかは問題ではない
0597デフォルトの名無しさん垢版2017/07/18(火) 20:41:36.58ID:j0qpHmEl
>>592
委譲を知らんのか
DRYの原則には反しない
Orderにキャンセルの実装は書いてないからな

>canceler.cancel(order)
こうはしない

>どっちからキャンセル呼べばいい
今回のケースでは
Orderから呼ぶことを想定してる
0598デフォルトの名無しさん垢版2017/07/18(火) 20:50:14.02ID:j0qpHmEl
>>594
>>596
>クライアントがorderのデータに
>アクセスするなどもってのほか

>Orderのクライアントは常に
>order.cancel()だけを知っていればおk

その通り

使用側は最小限のAPIだけ
知っていればいいのが
オブジェクト指向のメリット
0599デフォルトの名無しさん垢版2017/07/18(火) 21:00:30.74ID:bC2KM4MS
>>595
注文は人がウェイターにするの。
だから、注文それ自身は処理を持たない。
データなんだから。
わかる?
ウェイターが注文を受け取って、それを受理するの。

なんか色々勘違いしてるけど。
注文クラスの責務はなに?
答えてみて
0601デフォルトの名無しさん垢版2017/07/18(火) 21:10:01.19ID:j0qpHmEl
>>599
>それ自身は処理を持たない。
>データなんだから。
だからオブジェクト指向のオブジェクトは
たんなるデータじゃなくて処理もできるんだよ

>なんか色々勘違いしてるけど
じゃあそういう解説してるところを
>>595みたいにソースあげてみ?

あげられないでしょ?
オレオレの我流だから

>注文クラスの責務はなに?
注文(の情報と処理)
0602デフォルトの名無しさん垢版2017/07/18(火) 21:12:47.28ID:DKde2YwO
OrderはOrderに関する振る舞いを管理します
ウェイターは客からの問い合わせをシステムに移譲するディスパッチャーです
ここでいうシステムとは端末はもちろんマニュアルなども含みます
彼らは自らが複雑な判断をしているわけではありません
0603デフォルトの名無しさん垢版2017/07/18(火) 21:20:24.52ID:DKde2YwO
訂正します
ディスパッチャーというよりはユーザー・インターフェースですね
ウェイターは人型のユーザー・インターフェースです
いずれにせよ彼らは複雑な判断はしません
キャンセルを指示されたら笑顔でかしこまりましたとメッセージを返し、所持する端末にキャンセル指示を移譲します
それだけです
0604垢版2017/07/18(火) 21:20:27.05ID:zovgvuTt
>>580
それは、メソッドはステップとして分割不能なものでしか構成されていない、
手続きは一切入っていない、という理解で良いのか?
Cで言えば、文は一つだけ、と。
であれば、なるほど突き詰めるとそうなるか、となるな。
0605デフォルトの名無しさん垢版2017/07/18(火) 21:24:59.23ID:bC2KM4MS
料理はどこで処理するの?
注文がどのように展開されてどんな処理をするか注文クラスは知っているの?
そもそも注文クラスって何?
ある注文(例えば、野菜炒め)に特化したクラスなの?
それとも汎用的な注文伝票を扱うクラスなの?
キャンセル処理は誰が受け取るの?
料理さんがバカヤロー料理できちまったらキャンセルできねーよっつったら、誰が聞いて誰が返事するの?

注文で必要な処理は検証のみ。
注文を受け取ったらタスク(処理)クラスに移譲して、注文idで問い合わせる。
そうすれば、ウェイターは、非同期でタスクを監視し、できた順に成果物を返せるね。
0607垢版2017/07/18(火) 21:39:20.08ID:zovgvuTt
うーん、疑似コードで良いかな。
statusは足せる列挙体持ってる言語ならその方が良い。

uint APPLY=1
uint CANCEL=2
uint XXXXX=4
class Order
 uint status = 0x0
 なんかプロパティ
 bool isEnabledFor(proc)
  return (this.status & proc)
 bool isValid()
  //dbと突き合わせるなり

class QueueOrder
 Order order
 uint Operation

class OrderProcessor
 void exec(QueueOrder qo)
  if(qo.order.isValid() && qo.order.isEnabledFor(qo.Operation))
   //Operarionごとに処理とstatusの更新
   
   return order
  else
   ログに残すやらなんやら

みたいになるんじゃないの?
0608垢版2017/07/18(火) 21:40:00.94ID:zovgvuTt
>>607
OrderProcessorのrerurn 、値返してるの間違いだわ。ごめん。
0610垢版2017/07/18(火) 21:48:47.21ID:zovgvuTt
そりゃどうも。
0611デフォルトの名無しさん垢版2017/07/18(火) 21:49:52.30ID:j0qpHmEl
>>604
>手続きは一切入っていない
もちろん手続きは入ってるよ
たいてい関数型でも入ってる

ただ関数型が参照透過性を重視するように
オブジェクト指向ではカプセル化を重視する

高レイヤーではIF文やFOR文を
追い回さなくてもいいように抽象化する

今の文脈で言えばオブジェクトの使用側は
「Order.cancel()」だけ知っていれば使えるようなこと
0613デフォルトの名無しさん垢版2017/07/18(火) 21:57:39.38ID:j0qpHmEl
>>605
>注文クラスって何?
今の文脈だと汎用的というか
集約的なクラスかな

注文の情報や処理は
注文クラスでできるようにする
ただし具体的な実装は委譲する

Order.cancelでキャンセルできるけど
何日までキャンセル可能みたいな
具体的な条件や実装までは知らない
それはCancelerの責務

ウェイターは自分で料理作るわけじゃないけど
注文は取れるでしょ? それと同じ
0614デフォルトの名無しさん垢版2017/07/18(火) 22:00:18.31ID:j0qpHmEl
>>607
正直、構造化っぽいコードだと思う
べつに構造化で組んじゃいけないわけじゃないけど
少なくともオブジェクト指向らしいコードではない
0615デフォルトの名無しさん垢版2017/07/18(火) 22:02:25.13ID:oy6gK2Tn
真面目な話だけど、次スレからコード掲載必須をスレッドローカルルールにしないか?
時間の無駄は極力減らすべき
0616垢版2017/07/18(火) 22:02:42.60ID:zovgvuTt
>>611
なら、方法論が手続き型でも、そうでなくてもどっちでも良いんだから、
オブジェクト指向であれば、手続き型ではない、ってのはやっぱ変になるんじゃん。
>>571の通り、オブジェクト指向であるかないかと、中身が手続き型か関数型はまったく違う次元の話かと。
そういう意味で、
>>611で言う「たいてい関数型でも」に対しての「純関数型」まで挙げてんのに、なんで?

カプセル化と、抽象化は似てるけど違うでしょ。
a+bが、ベクトルでも複素型でもできるのはカプセル化ではないけど抽象化でしょ。
Order.cancelだけ知ってれば、って、Cancelが闇鍋になんじゃん。
0617垢版2017/07/18(火) 22:06:36.96ID:zovgvuTt
>>614
オブジェクト指向を広く捉えたとして、物をモデル化したものをインスタンスとして扱うものとするならば、
自分からひとりでに意味を持つ注文書なんか存在しないじゃん。

切手だって勝手に有価証券になるわけでも、使用済みになるわけでもないぞ。
郵政省が刷って有効になって、手紙に誰かが貼って使えて、郵便局が消印押して無効になるんだから。
0618デフォルトの名無しさん垢版2017/07/18(火) 22:14:29.90ID:oy6gK2Tn
オブジェクトって単語に引っ張られて物のモデル化と思い込んでしまうことはよくあるけどそれは初歩的な間違い

車の販売管理システムで車の物理的構造をモデル化するバカはいない
飲食店の注文管理システムでウェイターをモデル化するバカは…

あ、このスレには1人いたか
0619デフォルトの名無しさん垢版2017/07/18(火) 22:17:16.67ID:j0qpHmEl
>>616
どっちでもいいわけじゃなくて
メソッドの中身は手続き型でも
隠蔽されていることが重要なの
カプセル化されているかどうかの違い

「STATUS = 1」みたいなフラグを知らないと
関数やメソッドを利用できないのは構造化的な世界で
オブジェクト指向の世界ではそれは隠蔽する
外部からは最低限のAPIだけで利用できるのがメリット

>Order.cancelだけ知ってれば、って、
>Cancelが闇鍋になんじゃん。
隠蔽が闇鍋ってのはそういう面もあるけど

キャンセルの責務がCancelerに限定されてるから
キャンセルでバグがあるならCancelerだけいじればいい

対して構造化的なデータと処理で分けて
フラグのバケツリレーみたいなことだと
影響範囲がどこまであるのか分からなくなる
つまり闇鍋の中身がどこまでも拡散していっちゃう

だからある程度の規模になると相対的に
オブジェクト指向の方が保守しやすい
0620デフォルトの名無しさん垢版2017/07/18(火) 22:22:39.86ID:tId1dkJr
>>618
ウェイターも食券販売機も一緒だろ。
窓口のサービスを起点になって、
手続き的に内部で処理されるわけ。
ウェイターもなしで、いきなり注文して、
勝手に料理作られたら困るから窓口おいとくわけ。

設計したことあるかな?
標準化とか分かるかな?
運用とか考えたことあるかな?
ないんだろーなー。
0622デフォルトの名無しさん垢版2017/07/18(火) 22:26:42.66ID:j0qpHmEl
>>617
オブジェクト指向のオブジェクトは
物理的な物じゃなくて責務なんだよ

飲食店の客から見たら誰が料理してるとか
厨房がどうなってるかとかは知らなくていいが
料理がちゃんと出てこないといけない

通販なら製造や流通の過程は知らなくても
注文したら発送されたり
キャンセルできたりしないといけない

その注文とかキャンセルとかが
責務でありオブジェクトの単位になる
0625垢版2017/07/18(火) 22:44:30.71ID:zovgvuTt
>>619
うん、そのフラグ知ってるのは、OrderのCancelを呼ぶということを知ってるのに等しいんだけど?
だから、Cancelと言うメソッドは無いし、実質QueueOrderのOperationがそう。
最低限のAPIじゃん。exec。

キャンセルの責務はcancelに持ってるかもしれんが、その修正の影響範囲はcancelを呼ぶもの全部に波及するぞ。
バケツリレーの良いところは、明らかに守備範囲外、が明確で、かつ、その場合の処理方法が「バケツごと捨てる」の一択しかない所。
捨てられたなら、捨てた時点より以前がおかしい。単純明快。
デジャーナルして、もっかいジャーナルから流すのも簡単。
0626垢版2017/07/18(火) 22:47:30.09ID:zovgvuTt
>>622
責務は、それぞれの責任範囲で行うこと。
それ自体は否定してない。
>>421でも言ってる。

ビジネスロジックは、データの持ち物じゃない。
逆。ビジネスロジックがステートを持つなら百歩譲って理解できるが、データがロジック持つのは責務で言えば越権行為じゃないの?
0628垢版2017/07/18(火) 22:52:47.34ID:zovgvuTt
注文管理システムであれば、ウエイターをモデル化すると実は、ウエイターは2つの職責を果たしてる事に気づくと思う。
(両方できる奴も居るが)伝票に追記したり抹消線引いたりする奴と、料理の配膳や片付けする奴。
伝票があるから、注文を伝えた事が正しかったか証明できて、料理が正しいか、配膳されたか証明できて、そして会計できる。

伝票はひとりでに動いてない。ウエイターが書いてる。
食券の自販機なんかもっとわかりやすいな。金券かつカンバンそのもの。
0629垢版2017/07/18(火) 22:55:50.55ID:zovgvuTt
食券やら映画のチケットはもっと俺が言ってるのに近いか。
存在する=金払った証明として有効
もぎれる=使用することができる

料理が出てきて食券渡して、もぎられると、もうもぎれないので、食券としては無効。
ただ、半券として金払った証明としてはまだ有効。
0631デフォルトの名無しさん垢版2017/07/18(火) 23:01:37.95ID:oy6gK2Tn
>>624
レストランの物理的な構造に囚われてウェイターという物をモデル化しようとする人が居るってこと
注文クラスと聞いて紙の注文書を馬鹿正直にモデル化しようとする人も同じタイプだね
レストランシミュレーターウェイターモデルならそれでいいかもしれないが注文管理システムでは不適切だろ

ついでに言うとウェイターをモデル化したものが食券販売機という例は適切じゃない
ウェイターも食券販売機も同じインターフェースの実装でしかないよ
0632垢版2017/07/18(火) 23:05:36.86ID:zovgvuTt
>>630
もぎる奴が居るから、存在するし、
使うやつが居るから、存在する。
その数は一対一でもない。媒介物。

もぎりのバイトは、ひたすらチケットもぎるだけで良い。
職務は「もぎれるかどうか判断して、もぎれなければ追い返す」
滅茶苦茶シンプルじゃん。
後工程で、映画の半券持ってたら一軒だけ飲食店で割引なんてのが突然増えても、
飲食店は、半券持ってるか、ハンコ押してないか見て、押して無かったらハンコ押して割り引くだけ。
0633垢版2017/07/18(火) 23:10:05.32ID:zovgvuTt
>>631
飲食店の注文管理システムってのがえらく玉虫色してるな。
レストランシミュレーターウエイターシステム以外を指して言ったなら、かなり恣意的な運用な気がする。

あと、リアルウエイターは2つ以上のインターフェイスを実装することもあるとまで言ってるんだけど、割とスルーなのな。
0635垢版2017/07/18(火) 23:13:48.33ID:zovgvuTt
>>634
なんせ、コード掲載必須をルールにしようと言ってる人が、ご高説しかくれないもんだからねえ。
0636デフォルトの名無しさん垢版2017/07/18(火) 23:16:56.79ID:j0qpHmEl
なんか喩え話で論点がズレてきてるし
同じことの繰り返しになるから
最後にまとめると

オブジェクト指向では
データと処理を一体化(カプセル化)する

それはネットの解説サイトでも入門書でも
だいたいそう書いてある

一体化してカプセル化することで
外側の利用者は簡潔なAPIだけ
知っていればいいから使いやすくなる
責務が限定されてるから保守もしやすくなる

データと処理がバラバラになってるのは
自己流だから他人に押しつけられても困る
0637デフォルトの名無しさん垢版2017/07/18(火) 23:23:00.65ID:nMbDVkey
>>632
もぎれてるか否か、ハンコの有無、といった状態をもとに各加盟店が判断をすると必ず間違いが起こる
後々ハンコ二つまで割り引くと仕様が変更になったとする
仕様変更に気が付かずハンコが1つ押してあるから割引なしと判断する加盟店が必ず現れる
0640垢版2017/07/19(水) 01:04:48.44ID:Hpw0ftXx
>>637
ハンコ2つは筋が悪い。
一つだから押せば良いのであって、累積できるものはたとえ同じものでも、累積できるものであればもぎるごとく消費するか、予め2つ、ハンコ打つ欄を作るべき。
仕様変更に気が付かず、をなくすためのもぎりやハンコなんだから、先回りしろよ。
>>638
そういう問題じゃなくて、インターフェイスとするのはもっともだ、って話。
0644デフォルトの名無しさん垢版2017/07/19(水) 10:25:55.52ID:ZGccHuTU
>>593
> 違う、逆に実際のキャンセル処理はCancelerしか知らない
> Cancelerのcancellなどのメソッドにキャンセル処理を書く
実際の実装では、キャンセル処理には注文のデータそのものが必要なので、「注文の中身を知らない
Cenceler」だとキャンセル処理はできない
なので、CencelerにはOrder自身を渡す必要があり、その結果相互参照するという結合になる

> 肥大化していくから委譲する
肥大化してから考えればいいこと

それとも、最初から「注文実行クラス」「注文内容変更クラス」「注文キャンセル実行クラス」に分割しとくのか?
0645デフォルトの名無しさん垢版2017/07/19(水) 10:30:14.53ID:ZGccHuTU
>>596
そのコードだと、C(注文する)・R(注文を取得する)・U(注文を変更する)・D(注文をキャンセルする)の
D以外の目的でOrderクラスを使いたいときでも、常にクライアントはCancelerをインスタンス化する必要がある

さらに言うと、OrderがCencelerに依存しているということをクライアントが知っておく必要があり、
仮にCancelerのコンストラクタ引数に変更があると、Orderクラスのクライアントコード全部を修正する必要がある
0646デフォルトの名無しさん垢版2017/07/19(水) 10:56:06.72ID:ZGccHuTU
>>626
> ビジネスロジックは、データの持ち物じゃない。
> 逆。ビジネスロジックがステートを持つなら百歩譲って理解できるが、データがロジック持つのは責務で言えば越権行為じゃないの?
実は、DDD(ドメイン駆動設計)ではそういう考え方に近い
だからといって、一般の「データ+処理+ルール=オブジェクト」が間違いというわけではない
0647垢版2017/07/19(水) 11:13:09.73ID:lwS1UjSf
>>646
うん。そこは納得してる。
「処理」と「ルール」ってのはオブジェクトの責務上持ってて然るべきだけど、それはオブジェクトのインスタンス一つが自分でできる範囲って思ってる。
これ、実務以外では確かSOLIDとか言って定義した人の本で見た気がする。
ググった感じこんなのかな。
https://code.tutsplus.com/ja/tutorials/solid-part-1-the-single-responsibility-principle--net-36074
0649垢版2017/07/19(水) 13:05:49.85ID:lwS1UjSf
>>648
POJOとか、いやEntityであるべきだ、DTOだ、ってJavaだとホントいつやったかわからん議論だな、確かに。
0651デフォルトの名無しさん垢版2017/07/19(水) 21:20:38.96ID:8lSN/EDp
>>644
>相互参照するという結合になる
相互参照は不可避でもない

たとえば話を単純にして
注文日から何日以内という情報さえあれば
キャンセルできるとする

その場合、注文日オブジェクトを
OrderとCancelerが(コンポジションで)参照する
共通参照はするが相互参照じゃない

>肥大化してから考えればいいこと
SOLIDの話が出てるからついでに触れれば
注文とキャンセルは異なる責務だと
分かっているので最初から分離したい
0652デフォルトの名無しさん垢版2017/07/19(水) 21:24:59.31ID:747RlNYZ
結合がダメ言うならオマエ全部int型の足し算にすりゃええんちゃうか?
バカなの茶?茶茶茶おも茶ンの茶?
ドメインドライブ開発も知らん土方がイキっとんじゃないぞ!おう!
0653デフォルトの名無しさん垢版2017/07/19(水) 21:31:04.08ID:8lSN/EDp
>>645
>常にクライアントは〜する必要がある
インスタンス生成の処理は
ファクトリに隠蔽すれば
クライアントは依存関係や
コンストラクタについて知らなくてもいい


>>646
>DDD(ドメイン駆動設計)ではそういう考え方に近い
ええ……? 逆でしょ?

DDDではドメインオブジェクトが
ビジネスロジックを持つ

データと処理をカプセル化する
OOの基本はDDDでも変わらない

あとついでに言うとDDDやるなら
(ドメイン層では)POJOね
0656デフォルトの名無しさん垢版2017/07/19(水) 21:48:22.18ID:ytbmAMvR
>>649
ここは初心者が活発に意見交換して知識を共有するためのスレッドだよ
まともな人はこんなところに来ない
0657垢版2017/07/19(水) 22:54:49.71ID:PC/qPmp3
>>656
そうなの?
キャットドアとかいう欠陥問題を揉んでるスレかと。

なんともならないとなったら壊れる奴居るとこもどっかのスレと同じだなぁ。
0658垢版2017/07/19(水) 22:59:30.27ID:PC/qPmp3
>>651
注文日オブジェクトって何者なの?
正規化しすぎたRDBみたいな話じゃん。
そんな意味のあるようで無いデータ、共通参照したら死人が増えるだけでは?
「何日以内」って誰が持ってる設定値で、誰がそれ使って処理するの?注文日オブジェクト?
密すぎると思う。分離できてそうで、全くどれも単独で存在できないじゃん。
0659垢版2017/07/19(水) 23:03:03.88ID:PC/qPmp3
>>653
ドメインモデルなら、EntityとValueとServicesに分けたら、Orderはどこに行くの?
0661デフォルトの名無しさん垢版2017/07/19(水) 23:23:06.03ID:HXXCFkzn
話は変わるが、お前らこういうコード書いたらダメだからな

if (order.cancelable()) {
 order.cancel()
}

例外はなんにでもあるからそのことについてコメントはしないが、
この場合キャンセル可能と判明した直後にキャンセル不可能になる可能性がある。

if (order.cancelable()) {
 sleep 1日
 order.cancel()
}

とやれば理由がわかるだろう。

これが正しい書き方だからな

try {
 order.cancel()
} catch(e) {
 キャンセルできない場合の処理
}
0662デフォルトの名無しさん垢版2017/07/19(水) 23:33:07.83ID:8lSN/EDp
>>658
>「何日以内」って誰が持ってる設定値で、
>誰がそれ使って処理するの?
たとえば注文日オブジェクトが
期限日を判定するメソッドの形で持つ
キャンセルがそれを参照する

もっとていねいにやるなら
注文日オブジェクトの値から
期限日オブジェクトを生成して
キャンセルは期限日オブジェクトだけ参照するとか

どれくらいの粒度でやるかは
実際の処理がどれくらい複雑かによる


>密すぎると思う
それはたんにひとつのクラスで
何でもやることを密だと思ってない感想

>共通参照したら死人が増える
逆、逆

構造化だと修正に弱いから
仕様変更に対応できなくてデスマになる
0663デフォルトの名無しさん垢版2017/07/19(水) 23:36:30.58ID:8lSN/EDp
>>659
OrderはEntity
注文日とかはValue

>>661
もちろん実務では例外処理が重要になるが
サンプルコードとしては複雑になるので省略してる
0666垢版2017/07/20(木) 08:44:25.42ID:bw5c+A+a
>>662
期限を判定するメソッドには注文日オブジェクトが必要、
期限日は別にオブジェクトとして期限日オブジェクトが必要。
それCOBOLなんかでよくあるメタテーブルとかわらんくない?

一つのクラスでやらんよ。ジョブランナーはひとつだが、例で挙げたOperaionごとに、は別クラスというか、タスクとしてアクター最初から作る。
どのOperationだとどのアクターか、ってのはジョブランナーしか本来は知ることができないものでしょ。

毎年会計周りは変わるシステムだったけどデスマ起こったことほとんどないよ。
会計屋は、会計する以外のタスク持ってないんだから。

>>663
注文がEntityなのがわからん。何故?
注文日をValueにしたからでは?
0667デフォルトの名無しさん垢版2017/07/20(木) 10:39:07.21ID:3fjdXCU7
>>653
> ファクトリに隠蔽すれば
わざわざ結合度が高いクラス同士に分割して、簡単にインスタンス化できなくなり、
なのでファクトリメソッドを用意する?
>>577のように実装すればシンプルなのに、そうやることでなにかメリットがあるのか?

> データと処理をカプセル化する
> OOの基本はDDDでも変わらない
Entity, ValueObuect, Serviceの話だよ

>>662
> たとえば注文日オブジェクトが
> 期限日を判定するメソッドの形で持つ
> キャンセルがそれを参照する
まぁ俺なら文字列比較で一行で終わらせるだろうが、無駄に複雑にして何がうれしいんだか
0668垢版2017/07/20(木) 12:03:30.26ID:bw5c+A+a
>>667
>>577はシンプルそうに見えて闇が深くないか?
例外をThrowするなら、外のCatchは本来は型指定でCatchしてるはずじゃん?
例外の種類増えないって保証も無いし、事実上はCancelを変えると、一旦全体の動作が保証できない状態に陥るかと。
そこからテストするんだろうけど、まず全体のテスト定義書き換える事になるから、全体のテスト定義の定義にあたる要件定義からテスト起こし直しでは?
自動テストかけられる方向で修正したくない?
0669デフォルトの名無しさん垢版2017/07/20(木) 13:34:14.05ID:3fjdXCU7
>>668
> 例外の種類増えないって保証も無いし
例外クラスは基底クラスでcatchできるということは理解してるか?

> 事実上はCancelを変えると、一旦全体の動作が保証できない状態に陥るかと。
Order自身は、正しくキャンセルできたかできなかったかのどちらかでしかないから、
全体の動作は変わらないと思うが

> そこからテストするんだろうけど、まず全体のテスト定義書き換える事になるから、全体のテスト定義の定義にあたる要件定義からテスト起こし直しでは?
> 自動テストかけられる方向で修正したくない?
ちょっと意味がわからない
0670垢版2017/07/20(木) 18:21:23.58ID:bw5c+A+a
>>669
基底クラスでキャッチとか常識的に考えて、まともなシステムではありえないだろ。
>>559でいったような、否定文での条件定義と同じく、そのときに定義されていたもの、でしかない。

Orderが正しくキャンセルされたか、って、キャンセルすることができるか以上に正しくが未定義すぎる。

自動テストのくだり。
今までのロジックに一切手を加えていなくて、かつ、お互いが疎であれば、今回分の増分のテスト作って実施しつつ、過去のテストをそのまま実行すりゃ良いじゃん。
呼び出す、みたいな形だと、呼び出してる側のテストまで作り直しじゃん。

全段落含めて言うけど、実務でやらんの?
0671デフォルトの名無しさん垢版2017/07/20(木) 18:30:59.84ID:3fjdXCU7
>>670
> 基底クラスでキャッチとか常識的に考えて、まともなシステムではありえないだろ。
いやちょっと根本認識が違いすぎて、何をいいたいのかよくわからん
君のソースには、catch () {}が10個くらい並んでるのか?

> Orderが正しくキャンセルされたか、って、キャンセルすることができるか以上に正しくが未定義すぎる。
キャンセルが完了するかしないかの二択でしょ(それ以外に致命的な以上による例外を含めれば三択だが)
キャンセルできないパターンが多少増えても、全体で見れば変わってないでしょ

> 自動テストのくだり。
> 今までのロジックに一切手を加えていなくて、かつ、お互いが疎であれば、今回分の増分のテスト作って実施しつつ、過去のテストをそのまま実行すりゃ良いじゃん。
> 呼び出す、みたいな形だと、呼び出してる側のテストまで作り直しじゃん。
まじで何を言っているのかわからんのですが
コードで説明して
0672デフォルトの名無しさん垢版2017/07/20(木) 18:45:26.11ID:3fjdXCU7
つか、依存しているオブジェクトの変更が、依存する側に影響しないようにするのが基本で、
例えばSOLIDの原則とかがあるんだろ

なんでCancelを変更したら、全体に影響するんだよ
そりゃ設計が悪いとしか言えんわ
0673デフォルトの名無しさん垢版2017/07/20(木) 18:52:06.11ID:3fjdXCU7
例外もそう

勝手に既存の例外クラスツリー/群と全く関係ない例外クラスなんか作るなよ
Validatiorライブラリ作ってるんなら、
class ValidatorException extends RuntimeException {}
を継承したOutOfBoundsValidatiorExceptionを追加しろ

で、Validatorライブラリのクライアントは、基本的にはValidatorExceptionかRuntimeExceptionをcatchしろ
0674垢版2017/07/20(木) 19:25:21.13ID:bw5c+A+a
>>671
え?どー言うこと?Exceptionなんかでトラップしたら静的解析にすら怒られるだろ。
FileNotFoundExceptionなのか、とかトラップして、定義外はアプリケーションレベルのハンドラまで飛んでプロセス殺すよ。

それでも既に3択じゃん。
キャンセルには、キャンセル後に承認が必要になった、なんてときには、キャンセル呼んでる所全部直してくの?
キャンセル出来た訳ではなくなるよ。キャンセル処理は完了したんだろうけど。

そもそも正常系を例外で処理すんな。


テストの事。
....cancel()が、メソッドで、かつ、例外を吐くならば、
呼び出し元のtry-catchやってる、例えばCartやらUserやら、そのクラスも必ず再試験でしょ。
CardやらUserを再試験するならば、システム全体の結合試験もやり直しだわな。
かつ、その試験仕様は、要件が変わったんだから、試験仕様やソース以外からつくる他ないだろ。
サブシステムやデータクラスの問題が、システムの問題になる。

例外吐くんだから。例外って端的に言えば大域ジャンプだぞ。

>>673
アホか。
0675デフォルトの名無しさん垢版2017/07/20(木) 19:37:01.08ID:XDbsbGlQ
例外は極力クラス内で殺したい
モノによったらゼロは難しいかもしれんけど外に迷惑かけたらやばい

プログラムの例外を逃がすだけでリアルの俺が殺される
0676デフォルトの名無しさん垢版2017/07/20(木) 20:48:26.88ID:buuqmr6G
>>667
同じことの繰り返しになるから
ひとつだけ言うと

>Entity, ValueObuect, Serviceの話だよ
Value Object はメソッドを持つよ
データと処理をカプセル化する

Services は処理専門だけど
Entity と Value Object だけで扱いづらいものだけ
Services を例外的に適用するのであって

Value Object をメソッドを持たない
たんなるデータの入れ物にして
Services から処理するのは
手続き的なアンチパターンで
DDDのやり方ではない
0677デフォルトの名無しさん垢版2017/07/20(木) 22:30:58.38ID:mEIqzc+z
インスタンス生成の処理は
ファクトリに隠蔽すれば
クライアントは依存関係や
コンストラクタについて知らなくてもいい

これ意味わからん
コード書いてみてよ
0678デフォルトの名無しさん垢版2017/07/20(木) 23:38:17.62ID:1m8bkM5u
よくわからんが、order.cancel(); が出来るってことは
orderオブジェクトはそのメンバにシステムへのリンクを持ってるってことか?
class order
{
  system s;
  void cancel()
  {
    s.cancel( this );
  }
};
↑これなんかすごく筋悪くね?
system.cancel(order);
で良くね?
cancelの処理がオーダーだけで完結するとは思えんし
俺の中でorderがレシーバーとなってcancel処理っていう発想がない

で、order.is_cancelable(); も何か変で、キャンセルできるかどうかは
orderクラスだけで決まることではないし、キャンセルできるかどうかのフラグを
orderに持たせていちいち更新するのも変な話だな
そもそも、orderが何でそんなこと知ってるんだ

ただ、キャンセル中かどうかなどのステート値はorderに持たせて良いと思うけど
他に置き場ないし
0679デフォルトの名無しさん垢版2017/07/20(木) 23:39:43.75ID:1m8bkM5u
主従関係が逆転した考え方は嫌いだな
プログラムは明確にトップダウンなほうが読みやすい
手続き型プログラムにはデータ構造と制御構造の二要素しかないんだから
それぞれ組み立てたうえで、それらをどのように割り振るかってことだけ
考えとけば変なことになりようがないと思うんだけど

あと「誰が処理するべきか」って発想がダサくて、そりゃ誰かと問われれば
処理するのは何時でもコンピュータだわな
そうじゃなくて、本来は 「どこへ書くべきか」 だろ?
発想の転換というか、本来のあるべき考え方を取り戻すというか
現実を正しくとらえないとな
0681デフォルトの名無しさん垢版2017/07/20(木) 23:47:19.71ID:1m8bkM5u
どこへ書いておけば後々楽かなぁ〜ってことだけ考えとけばよく
誰が処理するか、とかワケワカランことは考えなくてよし
これで大体迷子になっている人が多い印象、2chみてる限りはね
0683デフォルトの名無しさん垢版2017/07/20(木) 23:48:59.86ID:mEIqzc+z
>>681
そうやって君はコントローラーやセービスにたくさん手続き書くんだろう?
それじゃオブジェ志向にはなれないだよ
0684デフォルトの名無しさん垢版2017/07/20(木) 23:58:42.38ID:Y8mmcpEl
すべてを知ってるのにファクトリ隠蔽をご存じないのはおもしろいですね
カプセル化としても大切なポイントなのに
0685デフォルトの名無しさん垢版2017/07/20(木) 23:59:13.34ID:1m8bkM5u
別にそういうわけでもないけど

でもよ、書かなきゃならないコードの総量は決まっているわけよ
必要な機能を削るわけにはいかないからな
とにかく、それは、決まってるから、初めから

それを分割してどこへ書くかってだけの話で
無理に小さなオブジェクトへ不必要にコードを押し込んでも意味無いっつーか
自然な形で実装できればそれでよし
自然が一番
0686デフォルトの名無しさん垢版2017/07/21(金) 00:07:01.17ID:joLx1qFD
あぁ、「小さなオブジェクト」ってのは変な表現だな
「末端のオブジェクト」でおねがい
0688デフォルトの名無しさん垢版2017/07/21(金) 00:27:36.02ID:61IBLwjA
> でもよ、書かなきゃならないコードの総量は決まっているわけよ
> 必要な機能を削るわけにはいかないからな
> とにかく、それは、決まってるから、初めから

これ読んだだけで程度がしれるからすごい
0689デフォルトの名無しさん垢版2017/07/21(金) 00:32:01.04ID:joLx1qFD
あと、SSE用、AVX用、AVX2用、AVX512用、と
プログラムのメイン部を4つも用意するのはマジ勘弁なんで
その辺も含めてコンパイラのループのSIMD展開に頑張ってもらうしかないと思う
0690デフォルトの名無しさん垢版2017/07/21(金) 00:41:30.63ID:joLx1qFD
そういった煽りには何かこう、イラッとすら来ないんだよ
何言っても無駄なのは知ってるし
囚われてる的な何か
自分で気づくまではどうにもならない類

迷路を自分で作って自分で解くのには飽きた
ただそれだけ
0691デフォルトの名無しさん垢版2017/07/21(金) 06:50:23.04ID:61IBLwjA
糞設計糞コード糞重複

でもよ、書かなきゃならないコードの総量は決まっているわけよ
必要な機能を削るわけにはいかないからな
とにかく、それは、決まってるから、初めから

ガイジか?
0692デフォルトの名無しさん垢版2017/07/21(金) 08:41:20.87ID:aAG5dXP6
コード総量がどーのって方は固定値取得とかエラー処理、ログ出力のような汎用的な処理も毎回コピペしてるんだろうか
そして毎回同じテストをしているのだろうか
0694デフォルトの名無しさん垢版2017/07/21(金) 10:35:11.71ID:kcrlXzzc
俺も最後にするわ

>>676
> DDDのやり方ではない
ルールをどこに実装するかの話で、あ氏はデータがルールを持つのに納得できないというので、
DDDではServiceにルールを実装することもあり、DDDの話を持ち出したまで
0695デフォルトの名無しさん垢版2017/07/21(金) 10:43:54.11ID:kcrlXzzc
>>674
> そもそも正常系を例外で処理すんな。
ケースバイケースだしポリシーの話でもあるね
>>577でも「例えば例外をthrow」って書いてるだろ?

俺がそれに関して今君と話したいのはここね
>>670
> 基底クラスでキャッチとか常識的に考えて、まともなシステムではありえないだろ。

> テストの事。
> ....cancel()が、メソッドで、かつ、例外を吐くならば、
> 呼び出し元のtry-catchやってる、例えばCartやらUserやら、そのクラスも必ず再試験でしょ。
まぁ別に再試験してもいいが、しなくてもいい
なぜなら、
class Exception;
class ServiceException extends Exception;
class OrderServiceException extends ServiceException;
class OrderCancelNotAllowedException extends OrderServiceException;
という例外クラス群だったとき、CartやUserは、ServiceExceptionやOrderServiceExceptionなんかで
catchすべきだから

> CardやらUserを再試験するならば、システム全体の結合試験もやり直しだわな。
OrderCancelNotAllowedExceptionを作成する前後で、全体として何かがかわったわけではない
まぁ、やり直してもいいけど

> >>673
> アホか。
何がアホなのか全くわからない
君と会話する意義がゼロに近づいてるぞ
0697垢版2017/07/21(金) 13:09:10.34ID:4ZsLxlrH
>>695
例外をスローってのは、もうどうしようもない場合だろ。

ServiceExceptionに新しい小クラス作ったなら、それは元のServiceExceptionではないんだから、テスト範囲膨大になんじゃん?って話。

前提として変わってるよ。....NotAllowed....で拾ってたなら、具体的にはNotAllowedのうちのあれとこれとそれを拾ってた訳なんだから。
大きくCatchして、その中で各サブクラスごとの処理してた時に、新しいサブクラスのハンドリングはすべきか否か、ってのが、仕様として考え直しだろって話。

APIとしてシンプルが売りって、それ呼ぶときだけで、ハンドリングは全然シンプルじゃないじゃん。
0698垢版2017/07/21(金) 13:14:58.39ID:4ZsLxlrH
見た目上疎なのと、実際に疎なのは全然違うし、
大雑把にしか取らなくて良いのと、大雑把にしか取れないのは全然違う。
未来の定義を含んでるから大きく取る他無い、って設計として柔軟なんじゃなくて、設計としてあやふやなんじゃん。

ある意味、そいつが責務として無責任な返事をしてて、その後始末を使う側に押し付けてるように見える。
0699デフォルトの名無しさん垢版2017/07/21(金) 14:11:25.03ID:joLx1qFD
そもそもの質問の題意からかなり外れてしまっているように思えるんだが
こういう風にかくも脱線するのがOOPなのかしらね

平たく言えば、もともとは
メソッドが正しくないタイミングで呼ばれたら、どう対処すべき?
って質問だったろう
で、明確な答えなんかないだろう
例えば、a=10; b+=a; って書くべきところを順番を間違えて b+=a; a=10; って書いたら
正しくないタイミングで処理したといえるわけだけど、コンパイルエラーも実行エラーも出ないし
それが我々の日常で、ただのバグであって、手続き型言語というのは何時でも順番が大事で
正しいタイミングで処理が走るように気を付けて書くものだったろう
一方で、順番を間違えたためにバグってヌルポやdiv0が発生することもある
ただしこれはどうしても続行が不可能だから例外を飛ばしているわけであって・・・
あとほか、初期化前の変数を参照しようとして怒られるとか、もあるが

基本的には手続き型言語は処理の順番の権化なので
処理する順番を間違えたとか、変なタイミングでメソッドを呼んだとか
それはプログラマのポカ、バグ、なんだから、テストで炙り出すしかないだろう
こんなことを全部が全部丁寧に例外なんかで対応していたら
手続き型言語はすべての個所で順番が重要なわけだから、全てでチェックが必要になる
順番やタイミングを誤って良い場所など、無いと思ったほうが良い
0700デフォルトの名無しさん垢版2017/07/21(金) 14:17:09.63ID:joLx1qFD
しかし、丁寧に作るなら
明らかにおかしなタイミングやおかしな順番で呼ばれたら例外を投げるのは有り
ただしそれはプログラマがミスをしたことを早期に伝えるためであって
そこで条件分岐などして通常フローに組み込んだらまたおかしなことになる
まぁほどほどに

っていう程度の話なのに、それが何故
何処でキャンセル出来るかどうか判断するか、とか
キャンセル処理は何処でするか、とか
認可がどうのこうの、ジョブがどうのこうの
とかって話に派生するのが謎だわ

ある意味では面白い問いかけでは有ったと思うよ
手続き型言語で「手続き」を間違えた場合、どう対処するか?っていう
そのままバグるのか、例外投げるのか、エラーコード返すのか、何もしないのか
好きなのを選べ
0701デフォルトの名無しさん垢版2017/07/21(金) 14:35:53.73ID:joLx1qFD
俺が思うに
「呼び出し元のプログラムがバグってて誤ったタイミングや順番でメソッドが呼ばれた場合
 どう対処すべきか」
っていう問題と
「仕様上、今現在キャンセルできる状態なのかどうなのか、また、どこで判定するのか」
という別問題を混同して一度に扱おうとするから
話がややこしくこんがらがっているのではないか
0702デフォルトの名無しさん垢版2017/07/21(金) 15:22:03.43ID:kcrlXzzc
>>697
> 例外をスローってのは、もうどうしようもない場合だろ。
トランザクションをコミットできないような事象は全て例外でハンドリングするというポリシーもありえる

> ServiceExceptionに新しい小クラス作ったなら、それは元のServiceExceptionではないんだから、テスト範囲膨大になんじゃん?って話。
だから基底クラスでcatchしろって話なんだが
0703デフォルトの名無しさん垢版2017/07/21(金) 15:35:40.87ID:kcrlXzzc
>>701
> 「呼び出し元のプログラムがバグってて誤ったタイミングや順番でメソッドが呼ばれた場合
>  どう対処すべきか」
そんなこと話してた奴いたか?
0704デフォルトの名無しさん垢版2017/07/21(金) 15:38:37.36ID:kcrlXzzc
>>697
> 前提として変わってるよ。....NotAllowed....で拾ってたなら、具体的にはNotAllowedのうちのあれとこれとそれを拾ってた訳なんだから。
> 大きくCatchして、その中で各サブクラスごとの処理してた時に、新しいサブクラスのハンドリングはすべきか否か、ってのが、仕様として考え直しだろって話。
全く意味がわからん
コードで説明して
0705デフォルトの名無しさん垢版2017/07/21(金) 15:52:10.73ID:kcrlXzzc
>>697
> 大きくCatchして、その中で各サブクラスごとの処理してた時に、
ちょっと待てよ、そんなこと誰もしないぞ

つか、君、SOLIDのことはわかってるんだろうな?
まさかとは思うが、ポリモフィズムすら知らないなんてことはないよな?
0708デフォルトの名無しさん垢版2017/07/21(金) 16:41:22.90ID:joLx1qFD
>>703
>>412を100回読めばわかるが
もともとは
「実行できない状況でメソッドが呼ばれたら、どう対処すべき?」
って話だろ
で、実行できない、処理を続行できないので、例外投げてますよ、というだけの

実際彼は
> ただその関数型方式でも結局、状態によって呼んではいけない処理を容易に呼べてしまう所は同じままだと思う
> ビジネスルールが複雑化して状態数が増えるとソースコードがinvalid argument exceptionだらけになってしまう
とも言っているわけで、呼ばれてはいけないタイミングで呼ばれたら、どう対処すべき?って話なんだよ
呼んではいけない状況で呼ぶな、バグるから呼ぶな、は手続き型の基本であるが
まぁ安全のために例外でも飛ばしておこうと

それを>>416
> 値を持ったデータの塊に生やしたメソッドでやるから話がややこしくなるのでは?
と余計なことを言うから話がややこしくなって脱線したわけだが
実際には cancel() がどこに実装されていても関係ないわけよ
本質は、キャンセル出来ない状況で cancel() 呼ばれたらどうすんの?例外飛ばすの?
例外であふれかえるんだけど?
って質問なんだから、どこに実装されていても関係ない
そしてこんなことは手続き型プログラミングではありふれている一般的な話題であって
(手続き型なんだから手続きを守ってもらわないと困る)
ジョブとか認可とか、以降の話は、まるで脱線
0709デフォルトの名無しさん垢版2017/07/21(金) 16:45:33.11ID:joLx1qFD
いうなれば
「初期化メソッドが呼び忘れられている状態でオブジェクトの他のメソッドが呼ばれたら
 どう対処すべき?例外飛ばしとくべき?例外であふれかえるんだけど?」
っていう質問と同義なんだよ
0710デフォルトの名無しさん垢版2017/07/21(金) 16:54:46.20ID:kcrlXzzc
>>708
> もともとは
> 「実行できない状況でメソッドが呼ばれたら、どう対処すべき?」
> って話だろ
そうだが、バグってそうなったらという話じゃないと思ったが

> って質問なんだから、どこに実装されていても関係ない
そんなことないって延々話が続いてたわけだが
0711垢版2017/07/21(金) 16:57:09.68ID:4ZsLxlrH
脱線も何も一番大事だと思うけど。

まー、理解できないなら仕方ないわ。
DTOオブジェクトにメソッド持たせたりとか、過去やった事として悪手だと言ってるんだが、
多分使いたくて仕方ないんだろ。
0712デフォルトの名無しさん垢版2017/07/21(金) 16:58:59.38ID:kcrlXzzc
>>709
> っていう質問と同義なんだよ
俺は全然違うと思うけど、OOに詳しくないと同じに見えるのかもね
0713デフォルトの名無しさん垢版2017/07/21(金) 17:02:18.04ID:joLx1qFD
大体からしてキャンセルできない状態であれば
画面上のキャンセルボタンは無効になっているか表示されてないか
ともかくキャンセルのオペレーションは実行できなくなってるはずなんだよ
もし無理やり飛んできても、どこかの段階で弾く
それなのに cancel() が呼ばれるってのは基本的にプログラムがバグってるんだよ
だからキャンセルできない状態なのにcancel()呼ぶな、バグるから呼ぶなって事になるが
それでもプログラマの不注意で呼んでしまうかもしれないので
安全のために例外でも飛ばしておきましょう
そうすれば早期に気づくでしょ、ってこと
だからassert()みたいなものだな
0714デフォルトの名無しさん垢版2017/07/21(金) 17:13:00.06ID:joLx1qFD
>>710
>そうだが、バグってそうなったらという話じゃないと思ったが

バグらずにそうなるってどういう状況だよ
実際にcancel()呼んでみて例外が飛んできてから
「あぁ今キャンセルできない状態みたいだからゴメンって画面に表示しとくか」
ってプログラムあり得るか?
キャンセルできる状態かどうかは事前にチェックしてて
それに合った画面表示になってるだろ
それでもcancel()で例外が飛ぶことはあるだろうが
それは本当の実行時エラーだ
少なくともキャンセルできない状況というのが事前に判明しているにもかかわらず
実際にcancel()呼んでみて例外が飛んでくるかどうかで判断とかあり得ないだろ
だからキャンセルできない状態でcancel()が呼ばれるってのは単純にバグってるんだよ
その辺をケアするかどうかの話だろ
0715デフォルトの名無しさん垢版2017/07/21(金) 17:15:35.17ID:kcrlXzzc
>>713
> 画面上のキャンセルボタンは無効になっているか表示されてないか
> ともかくキャンセルのオペレーションは実行できなくなってるはずなんだよ
そんなことないから、どこで/誰がキャンセル可能かどうかを判断すべきかって話になってるんだが

・ブラウザで注文一覧を見る
・見ている間に発送処理が完了する
・注文キャンセルを行う
・サーバが注文キャンセルリクエストを受け取る
みたいなときとか

厳密に言えば、
if (isCancelable()) {
  doCancel();
}
がアトミックでなければ、「発送」が途中に滑り込む可能性もある
0716デフォルトの名無しさん垢版2017/07/21(金) 17:46:44.99ID:FxlP3XPo
手続きの主張は「例外出させるプログラムを組む人が悪い」なので話は通じないよ

ここはできるだけヒューマンエラーを排除するための考え方を話す場所なのにね
0717デフォルトの名無しさん垢版2017/07/21(金) 20:12:55.82ID:joLx1qFD
>>715
それは本当に防ぎようのないことだから例外投げるなりなんなりすればよいが
もともと質問者はそんな質問はしていないだろ?
そんなことをどうにかしてくれって言ってるわけじゃないだろ?

>>412のコードを見てもそうだし
>>417でも
> ただその関数型方式でも結局、状態によって呼んではいけない処理を容易に呼べてしまう所は同じままだと思う
> ビジネスルールが複雑化して状態数が増えるとソースコードがinvalid argument exceptionだらけになってしまう
って言ってるだろ
「呼んではいけない処理を容易に呼べてしまう」
って書いてあるだろ?
これは要するに、「呼んではいけない状態の時に呼んではいけないメソッドを呼べなくする方法はないものかね?」
って質問しているわけだよ
それが出来ればプログラマが呼び出しミスすることを原理上なくすことが出来て
ここが大事だが、「その類のエラー処理を書かないで済むので」
> ビジネスルールが複雑化して状態数が増えるとソースコードがinvalid argument exceptionだらけになってしまう
のを防げるんだけども?っていう質問をしているんだよ
呼んじゃならない状態ってわかりきってる時でも、呼んじゃならないメソッドが呼び出せちゃうから
それに対するエラー処理書かなきゃなんねーメンドクセーなんか良い方法ない?って質問なんだよ
だがそれは手続き型言語に対する挑戦でもあるから程々にって俺は思うが、そのことはまぁどうでもよい

それで>>453なんかは質問者の意図を理解してスレの流れを元に戻そうとしているし
>>706なんかも質問者の意図を理解しつつ、探っているだろ

とろこが若干約二名は全然質問の意図と関係ないことを延々と長時間ものすごいレス数で
いったい何やってんだ?
こんなのがプロジェクトに交じってたら会議がいつまでたっても終わらないし
これがもし顧客の質問だったのなら、もうあいつは連れてくるなってなるだろ
全然違うこと言いだして知識をひけらかしあって何がしたいんだ?
0718デフォルトの名無しさん垢版2017/07/21(金) 20:15:16.81ID:AAWIl0Xa
> 何がしたいんだ?

そんなもん自覚できてるわけねえだろw
もししててもさすがに発表できないだろw
0720デフォルトの名無しさん垢版2017/07/22(土) 10:39:32.69ID:e/4f5Q/N
>>717
> 全然違うこと言いだして知識をひけらかしあって何がしたいんだ?
知識ひけらかしあってって、すげー低レベルな話しかされてないんだけど。
嫌なら飛ばせよ。
0721デフォルトの名無しさん垢版2017/07/22(土) 10:43:27.60ID:e/4f5Q/N
>>717
> それに対するエラー処理書かなきゃなんねーメンドクセーなんか良い方法ない?って質問なんだよ
結論としては、オブジェクトのメソッド内部でチェックをして、例外で(エラーコードでいいけど)
返せってことでしょ。

手続き型だって、正常時が戻り値0、異常時がマイナスの値だったら、
if (hoge() < 0) {
some_error_process();
return;
}
some_process();
と書いて、hoge()のエラーの種類が増えても大丈夫なコードにするだろ?
それと同じだよ。
0722垢版2017/07/22(土) 10:53:36.41ID:qYk/zBjZ
>>716
そんな事言ってないぞ。
正常にキャンセルに失敗したならば、そりゃ例外じゃなくて結果だって。
0723垢版2017/07/22(土) 10:56:40.54ID:qYk/zBjZ
>>719
引っこむ必要もわからん。
とりあえず、手続き型ではないオブジェクト指向であれば、ロジックは例外ありきで作るべきなのかってのは気になる。
例外ではなく、メッセージパッシングに使ってるなら、それは例外の濫用では?と。
0724垢版2017/07/22(土) 11:02:24.71ID:qYk/zBjZ
>>721
やらんだろそれは。
if(hoge()==0){
 some_process();
}else{
 some_error_process();
}
return;
じゃねえの?
正常値があってのエラーなんだから。正常時は0なら、今も未来も正常値は0であるんだから、そっちを判断基準にすべきじゃん、って話。
0726デフォルトの名無しさん垢版2017/07/22(土) 13:07:19.55ID:F07Em1eB
まだやるのかよ
もともとの>>412のコードよく見てみろよ
「assert」って書いてあるだろ
assertで投げた例外をトラップしてフローを切り替えるとか、あり得ないだろ
だから元々からして例外をトラップして処理を切り替えるって話じゃない
エラーコードが良いか、例外が良いか、も関係ないし
もしC言語だったならassertに引っかかったらabortして終わりの話
その後の後処理のことなんかまったく関係ないし、むしろ関係させてはいけない
assertに依存してその後の流れが変わるプログラムとかあり得ない、バグったことが分かればそれでよい
だから>>721>>724も関係ない (しかも言ってることがどうでもよい)

assertで投げてるからにはこれはデバッグ用のコード
プログラマがクラスの使い方を誤ったときにassertで引っ掛けて知らせるのが趣旨
これを書くのが面倒だから、そもそも、呼ばれても困るときに、呼べないように出来ないか、と言っている
俺じゃなくて本人が>>417で言ってる
> ただその関数型方式でも結局、状態によって呼んではいけない処理を容易に呼べてしまう所は同じままだと思う

呼べてしまうから対応が必要になるので、呼べないように出来ないか、という話
呼ぶべきじゃない状態の時は、呼べなくしてしまってもかまわない、ということは、実行時エラーの話ではない
トライしてエラー捕まえる、そんな話ではない、元から呼べなくしてしまって構わないと、本人が言っている
Null 許容型とかそっち系の話
君らがしているのはNullチェックの仕方の話であって、質問者が言ってるのは
Nullを許可しないにはどうしたらよいか?のような話

話がおかしな方向に行ったのは>>416
>値を持ったデータの塊に生やしたメソッドでやるから話がややこしくなるのでは?
からで、その考えに賛同しないわけじゃないし、むしろ好みであるが
だが今は関係が無い、ここでおかしくなった
そして無駄に300レスを消費したわけだが、話している内容はOOPでは何時もの事だが
「何をどこに書くか」であるが、このような宗教的話題は、ひとまず今は関係無かった、趣旨ではなかった
レイヤーが全然違った、もっとプリミティブな質問だったわけだ
0727デフォルトの名無しさん垢版2017/07/22(土) 13:15:48.47ID:F07Em1eB
>>721
↑がまずまだ間違っている
問題の趣旨を全く理解していない
元のプログラムはassertで投げている
これをキャッチして分岐する処理を制御フローに組み込んで出荷するのはあり得ない
if (hoge() < 0) {
some_error_process();
return;
}
some_process();
↑こんな話ではない
例外が飛んで来たら、ああ、バグ仕込んだな、コードを修正しなきゃ、って話であって
キャッチして対処する話ではない、エラーコードで分岐する話でもない
assertレベルの話だ

それに対して>>724がまた本当にどうでもよいことを言い出す
会話を長引かせることしか考えてないのか?
0728垢版2017/07/22(土) 13:50:17.99ID:qYk/zBjZ
>>725
要件に無い。無いことをむしろ書くな。

>>726
ああ、これは読み損ねてた。すまん。
assert出したら死ぬってことだな。そりゃそっちが正しい。

いや、呼べてしまうから、呼べないようにしたい、に対してをずっと言ってるんよ。
呼ぶんじゃなくて、呼びたいとキューなりなんなりしろ、と。
そしたら、呼びたいというのは自由になる。
そのタスクは、「呼ぶ人」一人がさばいて、呼べませんでしたよと端的に残す、と。それは呼ぶことのエラーじゃなくて、呼ぶ人の、呼びたいキューに対する結果だよ、と。

だから、データに生やしたメソッドでやるのは、そのデータ一人が対応できる処理に限ろうね、って話に行き着くから、データ自体でロジック書かないでおこうね、って話だよ。
0729デフォルトの名無しさん垢版2017/07/22(土) 13:50:41.22ID:XLPzVjfx
> 例外が飛んで来たら、ああ、バグ仕込んだな、コードを修正しなきゃ、って話であって

お前が使ってるライブラリは例外飛ばしてくるだろ?
それはバグなのか?

お前が使うライブラリは例外を飛ばすのに
なんでお前が作るライブラリは例外を飛ばさないんだ?

例外の使い方間違ってるだろ
0730垢版2017/07/22(土) 13:52:41.06ID:qYk/zBjZ
オブジェクトができる事なんか知れてんだから。
無理と言うかどっかで歪んでくる。
最初からそんなデータと処理を分割できなくなるような書き方するな。と。
結論「無謀」なの。

OrderRunnerとか、OrderQueueを作ることに何が問題なのかわからん。
0731垢版2017/07/22(土) 13:56:18.40ID:qYk/zBjZ
>>729
横からだが、ライブラリが例外を飛ばすなら、ロジックではそれはトラップしてるべきかと。
どーしよーもないやつはトラップすべきでないので、最初からトラップしない。リスローもしない。では?
DiskFullやらOOMやらハンドルしても無駄でしょ。今現時点のスナップショットが正しく落とせるかすら不安な状態で無理に生き残っても意味ない。
ランタイムまで飛ばしてランタイムごと落ちるべきだと思う。
まさか21世紀になってABENDを見るとは思わなかったが、割と業種によってはあると思う。
0732垢版2017/07/22(土) 13:58:25.52ID:qYk/zBjZ
そう言う意味では当たり前みたいな、このライブラリではかならず○○Exceptionのサブクラスをスローします、みたいなライブラリはゴミだと思う。
0733デフォルトの名無しさん垢版2017/07/22(土) 13:59:14.76ID:XLPzVjfx
>>731
お前がどれだけライブラリの例外を知っているのか知らんが、
例えばデータベースに接続できないとか
ファイルが無くてオープンできないとか、
そういうのも例外だからな
0734デフォルトの名無しさん垢版2017/07/22(土) 14:00:24.18ID:XLPzVjfx
>>731
> DiskFullやらOOMやらハンドルしても無駄でしょ。

え? DiskFullだったら「ファイルを消して再実行してください」
って表示するべきじゃないの?w
0736垢版2017/07/22(土) 14:01:38.79ID:qYk/zBjZ
>>733
だから、そんなのオープンするときにハンドリングしろよ。
オープンできなけりゃ死ぬなら、死ねばいいんだし、
リトライやらなんやらするならそいつがやれ。
gotoやらlngjmpの代わりに使うな。
0737デフォルトの名無しさん垢版2017/07/22(土) 14:05:18.68ID:XLPzVjfx
>>736
なにをそんなに熱くなってるのか知らんが、
殆どの例外はやろうと思えば復旧可能
例えバグによって発生したものであっても
そのバグの間接的な原因(変な値を入れない)をユーザーが
取り除いて再実行できる。
0738垢版2017/07/22(土) 14:05:47.85ID:qYk/zBjZ
>>734
あー、ごめん、それは例が広すぎたな。
ユーザがすぐにリアクションできる操作でそうなりゃ、問い合わせれば良いけど、ファイルを消して再実行が間に合わんままシステム動き続けて、メモリにも乗らなくなる可能性があるなら、最初からCatchすんなと。
そう言う意味では上の方でDiskFullExceptionを握ってるやつが居たら死ねと思う。

ってか、容量ぐらい先に確保できるか確認して、確保できなければエラー、確保できれば確保してから書いてケツを整えたら良いんでないの?
0739垢版2017/07/22(土) 14:07:42.06ID:qYk/zBjZ
>>737
それは、例外でやるべきじゃなくて、チェックロジックでやるものでしょ?って。
自分が壊れたもの自身が「自分はリカバリできました!」って言う事ほど信用ならん事はない。
0740デフォルトの名無しさん垢版2017/07/22(土) 14:08:45.73ID:XLPzVjfx
>>738
(自分の都合がいい場合)は例外じゃなくていいって言ってる?
都合がわるい場合は例外とかダブルスタンダートはよせよw


> ってか、容量ぐらい先に確保できるか確認して、
はい。ダメなパターンw
0741デフォルトの名無しさん垢版2017/07/22(土) 14:09:28.26ID:XLPzVjfx
>>739
> 自分が壊れたもの自身が「自分はリカバリできました!」って言う事ほど信用ならん事はない。

自分が壊れたものを、他人が直せるわけ無いだろ?
何を言ってるんだ。
0742垢版2017/07/22(土) 14:12:48.02ID:qYk/zBjZ
>>735
実行時例外だっけ。OutOfMemoryErrorでCatchはできるけど。
0743垢版2017/07/22(土) 14:16:20.98ID:qYk/zBjZ
>>740
お前何言ってんの?
都合が良いも悪いも、そんなもん、例外としてなげるんじゃなくて、ハンドリングしてからやれ、っていうライブラリ側の話と、
ユーザが、っていう業務ロジックの話を混同してるからじゃねえの?

>>741
当たり前だろ。
おもなしく死ねって言ってんだよ。
おとなしく死んだらまともな奴が代わりを立ち上げるし、
それでも死んだらデータが悪い。

まともな奴が判断しろ。
0746デフォルトの名無しさん垢版2017/07/22(土) 14:44:08.73ID:yC6nSTt1
ウイードーズでさ
デスクが満杯エクスペクションになったら
エラーメッセじゃなくて
ショットダウンしていいのか?
0747デフォルトの名無しさん垢版2017/07/22(土) 15:59:46.31ID:XLPzVjfx
>>745
PHPのベースとなってるのはC言語で、
そのC言語は0 = NULL だから
0は偽として扱う必要があるんだよね。
0748デフォルトの名無しさん垢版2017/07/22(土) 16:46:23.23ID:XPs8hc2M
こんな無駄な討論ばっかしててよく会社クビにならないな。

設計の粒度とか一貫性なくて、大規模で開発したら崩壊しそう。
0749デフォルトの名無しさん垢版2017/07/22(土) 16:47:14.50ID:e/4f5Q/N
>>728
> いや、呼べてしまうから、呼べないようにしたい、に対してをずっと言ってるんよ。
> 呼ぶんじゃなくて、呼びたいとキューなりなんなりしろ、と。
お前こんだけ話が続いてて一切進歩ないな。
呼べないようにするって話と、要求をQueueで管理するってのに全く関連性はないぞ。

> だから、データに生やしたメソッドでやるのは、そのデータ一人が対応できる処理に限ろうね、って話に行き着くから、データ自体でロジック書かないでおこうね、って話だよ。
だから、その範囲のビジネスルールはそのデータがもつmodelなんかに実装しましょうねってことだ。
0750デフォルトの名無しさん垢版2017/07/22(土) 16:49:30.28ID:e/4f5Q/N
あと、故意にか無意識にか理解できなくてかわからんが、「あることが実行できるかどうか」は
実行するそのタイミングまでわからない場合が多々あるってことを無視すんじゃねぇ。
だから、「実行できるときだけQueueに入れる」なんてことはできない。
0752垢版2017/07/22(土) 17:03:51.73ID:qYk/zBjZ
>>744
それは場合によりけりかと。
ちょっと特殊例だけど、担保できないなら止まってるほうがマシってやつ。

Javaじゃないけど意味わからん死に方してるの見たことあるよ。
最終的にわからんから立ち会ったら、近くですっごいモーター回った時にメモリ化けてた。

>>749
モデルに持ったら、業務ロジックの改修は全部モデルがやんの?

>>750
根本的に理解してない。
実行できるときにキューに入れるんじゃない。
実行したいとキューに入れる。
それができるかどうかは、本当にOrderを処理するロジックが考えるべき事。
0754デフォルトの名無しさん垢版2017/07/22(土) 17:05:52.30ID:e/4f5Q/N
>>752
> モデルに持ったら、業務ロジックの改修は全部モデルがやんの?
お前の表現でいえば「Orderを処理するロジック」がやんだよ。
0755デフォルトの名無しさん垢版2017/07/22(土) 17:23:46.28ID:e/4f5Q/N
ところで、>>412ってJavaなの?俺Javaよくしらないんだけど。
俺の感覚だとassertでエラーチェックするのはゴミコードなんだが、Javaだと普通なのか?
0756デフォルトの名無しさん垢版2017/07/22(土) 17:27:46.68ID:e/4f5Q/N
>>727
> 元のプログラムはassertで投げている
> これをキャッチして
こんな話初めて聞いたんだが、何の言語だとこんなことできんの?
0757デフォルトの名無しさん垢版2017/07/22(土) 17:38:08.35ID:e/4f5Q/N
もし>>412
class order {
public void decide() {
if (_state == order_state::pending) { throw invalid_state_exception; }
}
public void cancel() {
if (_state != order_state::ordered) { throw invalid_state_exception; }
_state = order_state::canceled;
}
}
という意味なら、>>577と同じコードだよね。
なんか、>>577ありえん的な流れになってる気がするが、それなら>>412もありえんってことだな。
0759垢版2017/07/22(土) 20:11:11.41ID:qYk/zBjZ
>>754
Orderを処理するロジック、が、Orderのメソッドに依存してたら、全部改修だね。
って話。
いい加減バカなの?
0760デフォルトの名無しさん垢版2017/07/22(土) 22:18:05.14ID:yC6nSTt1
そりゃ注文IDの桁が増えたり
注文の通貨がビットコに変わったり
伝票にユーザの証明写真電子透かしで入れる仕様になったり
したら、広範囲改修だろ

てゅか、改修の範囲も依存の仕方によるだろ
依存依存ってバカの一つ覚えのように言ってるが
おまえOrderクラスimportしたら依存だとでも思ってるのか
おまえのゆう「依存がない」って南南だよ
システムのためにナカ全部json stringでやり取りする気かバカなの茶?死ぬの茶?
0762デフォルトの名無しさん垢版2017/07/22(土) 23:46:08.33ID:F07Em1eB
>>728
>>726でも書いたが
元のコード>>412は「assert」で例外を飛ばしている
これが何を意味しているかすら理解できないのではどうしようもない

>お前が使ってるライブラリは例外飛ばしてくるだろ?
>それはバグなのか?

当たり前だが確認として、例外を飛ばしてきたライブラリがバグってるとか、そういう話ではない
ライブラリを使っていて、ライブラリ内でassertが発生したなら
ライブラリを使っている側のコードにバグがある、ということになる
当然ソースコードを修正する、ライブラリ内でassertが発生したら、呼び出し元のコードを修正する
当たり前のこと、そのためのassert、assertはデバッグ用
assertは通常、デバッグ時にのみ有効で、リリース時には消えてなくなる
assertでデバッグ時に飛んできてた例外は、リリース時には飛んでこなくなる
だからこれに依存した分岐など、してはならない
0763デフォルトの名無しさん垢版2017/07/22(土) 23:46:45.87ID:F07Em1eB
(つづき)
>>728
踏まえて、>>412のコードの例外は、プログラマがクラスの使い方を誤ったときに
assertを発生させて、ミスってるよ、直してね、って知らせるのが目的
これに依存してトラップして分岐とか、もともとそんな話ではない

呼び出せない状態の時は、初めからメソッドを呼び出せないように出来ないか、って話
初めから呼び出せない(例えばスコープ上見えなくなっている、など)のであれば
間違って呼び出されることもないし、そのことに関するエラー処理も要らなくなるから
>>412
> Stateパターン使うのかなとも考えたけど結局空のメソッドから
> not supported exceptionを投げるようになるだけで本質的な解決策にならない
>>417
> ただその関数型方式でも結局、状態によって呼んではいけない処理を容易に呼べてしまう所は同じままだと思う
という風なことを質問者は言っており

そんで>>425では
> せっかく静的な言語を使っているのだから動的言語のようなことはできるだけ避けたい
とも言っているので、静的型の型機能を使って、なんとかならないか?という質問なわけだ
コンパイラにチェックさせることは出来ないか?ということだ
Null許容型とかと同じようなことは出来ないか?と
0768デフォルトの名無しさん垢版2017/07/23(日) 01:20:29.13ID:8mi2T9pp
何故なら組み合わせ爆発が起こって訳の分からんクラスが山のように出来る可能性が高いからだ
普通に考えても、状態チェックして例外投げるなりエラー返すなりassertするなりするより、手間がかかるからだ

ある状態の時、あるメソッドを無効化することを考える
状態をチェックして無効であることをプログラマに教えるコードを仕込む・・・@
状態に対応するインターフェースを定義して実装する・・・A
この時、ただでさえ@よりAの方が手間がかかりそうなのに
これに加えて状態の組み合わせ爆発で訳の分からんクラスを大量生産する羽目になったら
何をしているのかもはやよくわからない

また、状態が変化してインターフェースAからインターフェースBへはどのように移行するのか
ここで、誰が移行させるのかは問わないが
今まさにインターフェースAからインターフェースBへ移行したとして
B b = nanika( a );
まだインターフェースAの変数aは生きているので
(しかも、どこでだれが、どれだけ握っているかは分からない)
状態にそぐわないメソッドを呼ぼうと思えば呼べるわけで
結局エラー処理は(するなら)必要だ、意味がない

もしくは、B b = nanika( a );を呼び出した瞬間から、aのオブジェクトを無効にしてしまう
aのコピーを作ってそれをBを満たす状態で返し、aは無効フラグを立てて、意味のないオブジェクトとする
以降aのメソッド呼び出しは全部無効
しかし、あちこちでaが握られていた場合、aが無効になってbになったことをどうやって各所に通達する?

このようなことを考えていくと、とても現実的じゃないんだわ
まぁうまくいく場合もあるかもだが、かなり限定的だ
そもそも手続き型言語は状態や順番やタイミングによって、呼んで良かったり、ダメだったり
正しく動いたり、動かなかったり、正常だったりバグったり、するものだから
根本的に解決したければ関数型言語でも使ってもらうしかないんだろう
手続き型言語で手続きそのものの誤りをコンパイラに検出させようってのは、かなり、なんというか
プログラムの並びが正しいかどうかコンパイラに調べさせる話だから、それ出来るならすごいよね〜
0771垢版2017/07/23(日) 10:24:24.21ID:QcEiibn9
>>768
なるほど。そりゃそうね。
B b= した時にはもうAは死んでる、を実現する(しても良い)ならば、Rustで書けば割と簡単。

ただ、俺はそういう扱いで色々書いてたから「お、賢いね。ありがとさん」と感心しながらRustかけたけど、
そう考えられない人にはRustはチェッカーがパラノイアじみてて使いづらいって印象を受けるとのこと。
なので、手続き型でも言語次第、書き方次第の問題ではあるよ。
あれには列挙型もあるから、カスみたいなマスク定数持たなくても良いしね。
misraに準拠してるかをよーわからんベンダのチェッカで確認しながらCで作るより余程使いやすいと思う。
0772デフォルトの名無しさん垢版2017/07/23(日) 11:10:31.68ID:Q2e2rMDm
>>762
> assertでデバッグ時に飛んできてた例外は、リリース時には飛んでこなくなる
> だからこれに依存した分岐など、してはならない

という意味で、>>412は最悪のコードですな。
0773デフォルトの名無しさん垢版2017/07/23(日) 11:15:15.03ID:Q2e2rMDm
>>768
> そもそも手続き型言語は状態や順番やタイミングによって、呼んで良かったり、ダメだったり
> 正しく動いたり、動かなかったり、正常だったりバグったり、するものだから

どういうプログラミングパラダイムだろうと、時間経過によって状態が変更しうるものの前には無力。
「事前にチェックして」「処理を実行する」が失敗するケースが発生しうる。

同時実効性や時間経過による変化、トランザクション分離レベルなどを考えないと、ベストな選択はできないだろう。
0774デフォルトの名無しさん垢版2017/07/23(日) 11:28:38.08ID:Q2e2rMDm
>>763
> 呼び出せない状態の時は、初めからメソッドを呼び出せないように出来ないか、って話
> 初めから呼び出せない(例えばスコープ上見えなくなっている、など)のであれば
> 間違って呼び出されることもないし、そのことに関するエラー処理も要らなくなるから

以上の理由で、上記のような実装を行えるのは、ごく限られたケースであることがわかったと思う。
今回はOrderを例にして話が始まったが、Orderは上記実装とは相容れないもの。
0775デフォルトの名無しさん垢版2017/07/23(日) 11:32:00.27ID:YFCxcaSM
もしかして君らおじさんたち
契約プログラムを知らない無知蒙昧なるゴミ屑なのかな?
0777デフォルトの名無しさん垢版2017/07/23(日) 11:41:56.66ID:Q2e2rMDm
契約プログラミングでも、「キャンセルしてはいけない注文をキャンセルしようとする」というタイミングは発生しうる。
0778デフォルトの名無しさん垢版2017/07/23(日) 12:02:34.67ID:YFCxcaSM
>>768
CanceledOrder
DecidedOrder
は例が悪かったかも知れない

こうならどうだ
/** 予約系(チケットとか実体のない)注文 */
TicketOrder
/** 配送系(モノであり実体がある)注文 */
DeliveryHealthOrder

両者で、持ってるデータが大きく異なる場合は、
型で分けないとその「組み合わせ爆発」で状態の判定ifがそれこそ爆発する
「組み合わせ爆発」が嫌で汎用性が高いクラスを作りたいというなら
全てHashMap<Object, Object>で作ればいい
になるぞ

程度問題だ
0779垢版2017/07/23(日) 12:28:22.68ID:QcEiibn9
>>773
「経過時間」の本質は「自分以外が触るデータ」であるか否かかと。
なので、データの分類は
自分だけが作れて、他人も見れるデータ(このデータは誰も編集禁止)
自分だけが作れて、自分だけが編集出来て、自分だけが削除できる、他人からは見る事が出来ないデータ
誰にでも作れるが、自分だけが見れて自分だけが削除できるデータ
の3つに切ると、やりやすい。

メールボックスみたいな仕組みがある言語なら要らん定義だけど。
Erlangは凄いわ。
0781垢版2017/07/23(日) 14:17:16.20ID:QcEiibn9
>>780
プロセスかアトム ! メッセージ
の形でメッセージ送るだけ。
もらった方は
recieve
 {pattern,match} ->
  処理
って感じで処理する。
返事が要るなら、
recieve
 {From,pattern,match} ->
  処理
  From ! 返事

みたいに返せる。
プロセス内の変数はもともと持ち出し不可。
自分が作れて云々は自分からのメッセージで、
誰にでも作れて云々は自分へのメッセージ。
0782デフォルトの名無しさん垢版2017/07/23(日) 21:38:14.62ID:8mi2T9pp
>>778
それは言ってることが全然おかしい
今言ってるのは状態依存で呼べる機能が変わるものに
それぞれ別々のIFを用意するかどうかだ
0783デフォルトの名無しさん垢版2017/07/23(日) 21:51:23.25ID:8mi2T9pp
例えばボタンクラスを定義するとして
EnableButtonClassとDisableButtonClassを用意しよう
で、ボタンが死ぬまで上記のどちらかで固定されるなら別に構わないが
実際にはボタンはEnableだったりDisableだったり動的に切り替わる
こうなってくるとディメリットがメリットを上回る
0785デフォルトの名無しさん垢版2017/07/23(日) 22:01:50.55ID:YFCxcaSM
例えが下手杉内
ボタンクラスをどこかの処理に渡したいことなんてあるか?
オーダーとは全然別物だろ

抽象化が下手なやつはゴミみたいなPG書くって相場が決まっているもんだが
こりゃお里が知れるね
0786デフォルトの名無しさん垢版2017/07/23(日) 23:07:58.39ID:8mi2T9pp
ん?ボタンクラス作るって言ってるんだから
GUIフレームワークも自分で作る前提だろ
ただ、そんなこと自分ですることあまりないから例がアレとは思うが

それでもボタンを例を挙げたのは、既存GUIプレームワークのボタンクラスは
そうはなってないでしょ?って例になるからだけど
じゃなきゃ、また「俺はこうする、俺はこうする」って話になって
無駄に300レス消費するのは嫌だなぁと
0789垢版2017/07/24(月) 08:40:24.40ID:MnNhZY7v
フォーム上の物に例えるならリッチテキストの中身のRTFDocumentとかかな?
リッチテキストとして成立しないものはリッチテキスト側で制御すべきだけど、
選択文字に打ち消し線を打つってのはリッチテキストのメソッドで、いつでも呼べる。

ただ、業務ロジックとして、この行には打ち消し線を打たせない、ってのをやりたいなら、フォームかラッパーにもたせるべきだけど、
そのラッパーを状態ごとに「無効:DisabledRText」とか「上長承認済の為スタンプのみ押せる:StampableRText」とか作るってんなら明らかに悪手。

最初から、コピー新規しかできなけりゃ何も問題は無いんだけど、編集って概念が出てくるととたんにSQLで言うSERIALIZABLEみたいなトランザクションにせざるを得なくなる。UIオブジェクトに。c#ならsynclockかなんかでできるんだっけ?
0790デフォルトの名無しさん垢版2017/07/24(月) 13:14:09.75ID:mRBn7cmM
>>779
> なので、データの分類は
> 自分だけが作れて、他人も見れるデータ(このデータは誰も編集禁止)
> 自分だけが作れて、自分だけが編集出来て、自分だけが削除できる、他人からは見る事が出来ないデータ
> 誰にでも作れるが、自分だけが見れて自分だけが削除できるデータ
> の3つに切ると、やりやすい。
ほんと筋が悪いわ
それこそが、上の方の認可とか権限とかの話だろ
0791垢版2017/07/25(火) 01:45:37.04ID:CxglBIYc
>>790
全然違う。カプセル化そのもの。
メモリ共有をせずにメッセージの受け渡しで処理を勧めていく。

あのさぁ。認可と同じとか、くだらんことほざく前に
Erlangでのメッセージの渡し方は見てきた?
技術力もなければ知識もなく、そして論理的思考力も無く、ソースの探究心すら無いならプログラマ辞めたらいいのに。
0793垢版2017/07/25(火) 08:25:35.37ID:Yx6+jkpX
>>792
あー、書いたねこれ。
0794デフォルトの名無しさん垢版2017/07/25(火) 10:09:39.54ID:AYapnpf4
>>791
> 技術力もなければ知識もなく、そして論理的思考力も無く、ソースの探究心すら無いならプログラマ辞めたらいいのに。
お前はそれに加えて文章力が壊滅的にない
0795垢版2017/07/25(火) 13:06:11.86ID:Yx6+jkpX
>>794
うん、まぁ、これでちゃんと仕事して金もらえてるんだから、必要充分でしょ。
あんまり身の回りで通じなかったこと無いよ。文章。
よく読めば最初に言ってたりするのに、急いで斜め読みしてるように見えるが。
0799デフォルトの名無しさん垢版2017/07/27(木) 01:44:55.23ID:Ddw23w1u
すげーなこのスレ。文章レベルが小学生だな。
プログラムレベルは、ただのコーダーよりはマシだけど、リーダーにするには経験も頭も足りない微妙な人ばっか。

仕事の憂さを晴らすために、議論ごっこしてるだけw
0802垢版2017/07/28(金) 07:42:36.79ID:ZQo/4U8U
小学生以上の文章レベルの議論はまだかね。
0803デフォルトの名無しさん垢版2017/07/28(金) 09:35:35.04ID:Gpi+7j1z
注文のキャンセルの話は終わった?
終わってないね。

で結局キャンセルできるかどうかを判定する
メソッドはどこに作ることになったの?

まずキャンセルできるかどうかっていうのは
状態によってだけじゃなくて、権限によっても決まってくる。
でも状態の権限の2箇所で判定するのは面倒。

例えば、キャンセルボタンがenabledなのかdisabledなのかっていうのは
キャンセルできるかどうかで変わるわけだけど、
ビューに if (キャンセルできる? && 権限がある?) などと書いてしまったら
こういうのがあちこちに散らばってしまう。ために権限の事忘れたりね。

だから if (キャンセルできる?) と条件一つにしないといけない。
このキャンセルできる?の中には権限のチェックなどすべてのチェックが入っている
0805垢版2017/07/28(金) 14:51:46.75ID:ZQo/4U8U
終わりで良いと思ってたが。

不許可だから不可能なのか、不可能だから不許可なのかは組み合わせだすとキリがないよ。

可能不可能と許可不許可だけで4つ、それに、結果的に不可能だった、とか過去形や未来形、次承認あれば許可みたいな新しい状態に対応するときに、累乗に比例していってしまう。
しかも結果はできる、できないの二択。

なら、最初からそのオペレーション自体を切り分けて、例えばキャンセルなら権限ごとのできるできないを、
前工程で作ってしまって、単純にそれを取得するだけにした方が責任範囲がはっきりする。
0806デフォルトの名無しさん垢版2017/07/28(金) 15:01:29.67ID:jw3NWySX
>>805
可能か不可能かは、注文のビジネスルールにより決定される。
許可か不許可は、権限管理のビジネスルールにより決定される。
(要件によっては、注文のビジネスルールとする場合もあるかもしれない)

最終結論は「{許可 or 不許可} & {可能 or 不可能}」だ。

なにをごちゃごちゃ言ってるのか理解不能。
0808デフォルトの名無しさん垢版2017/07/28(金) 23:19:41.57ID:Gpi+7j1z
>>804
例えばさ、ショップの管理者であれば、
すべての注文のキャンセルが可能でしょ?

一般の顧客は、通常は自分の注文しか
キャンセルできないよね?

これは権限?
0810デフォルトの名無しさん垢版2017/07/29(土) 10:46:36.37ID:8lDGGI0L
>809
権限だとしてその権限の条件は?

自分のIDと注文のIDが一致しているか?っていう
条件を何処かでやらないといけないよね?
0811デフォルトの名無しさん垢版2017/07/29(土) 10:47:10.63ID:8lDGGI0L
× 条件を何処かでやらないといけないよね?
○ 条件判定を何処かでやらないといけないよね?

その条件判定はどのメソッドにあるの?
0812デフォルトの名無しさん垢版2017/07/29(土) 10:47:36.61ID:8lDGGI0L
orz

× その条件判定はどのメソッドにあるの?
○ その条件判定はどのオブジェクトのメソッドでやるの?
0813垢版2017/07/29(土) 11:07:06.69ID:sarQXHNa
>>806
違うんじゃねえの?
権限管理のビジネスルールで可能で注文のビジネスルールで不可能、は、結局どのビジネスルールに縛られてるのか、もう少し種類増えたら優先順位が出てくるはずじゃん。
許可されてるから可能なのか、可能だから許可されてるのかって話。
今2つだから単純な話で済んでるけど。

○○の、と頭につけずに、ルールの積によって可能か不可能で判断するほうがいいんじゃないの?
0814デフォルトの名無しさん垢版2017/07/29(土) 11:45:07.76ID:Suk8TZUZ
>>813
言い方を変えよう。
注文のビジネスルールによる可/不可を「可能/不可能」と呼び
権限管理のビジネスルールによる可/不可を「許可/不許可」と呼ぶとしたとき、
「可能/不可能」と「許可/不許可」をごっちゃにしてはいけない。

> ルールの積によって可能か不可能で判断する
そのように説明したつもり。

> 今2つだから単純な話で済んでるけど。
増えたとしても、「それまでの判定結果」×「新しいルールによる結果」でしかないので、
組み合わせ爆発のような問題は起こらない。
0816デフォルトの名無しさん垢版2017/07/29(土) 11:54:40.25ID:8lDGGI0L
>>815
> 権限管理オブジェクト

権限管理オブジェクトが、注文の情報に依存するってこと?
具体的に言えば、権限管理オブジェクトが注文オブジェクトの
チェックメソッドを読んでいるってこと?
0817デフォルトの名無しさん垢版2017/07/29(土) 11:56:51.52ID:8lDGGI0L
>>813
> 今2つだから単純な話で済んでるけど。

そうなんだよね。

今は権限、特定のユーザーの情報だけで決まる話ばかりしてるけど、
他人の注文は取り消せないが、自分の注文だけは取り消せるみたいな
権限+ビジネススールの組み合わせで判定することもあるわけだ
0818デフォルトの名無しさん垢版2017/07/29(土) 12:08:18.12ID:Suk8TZUZ
>>817
> 今は権限、特定のユーザーの情報だけで決まる話ばかりしてるけど、
> 他人の注文は取り消せないが、自分の注文だけは取り消せるみたいな
> 権限+ビジネススールの組み合わせで判定することもあるわけだ
だからこそ、「可能/不可能」と「許可/不許可」はごっちゃに考えてはいけないと何度言ったら。
「可能/不可能」の実装は注文オブジェクトに、「許可/不許可」の実装は権限管理オブジェクトに、だ。
0819デフォルトの名無しさん垢版2017/07/29(土) 12:16:47.13ID:8lDGGI0L
>>818
いや、カプセル化の考え方からすると、
権限管理オブジェクトの中で何やってるかは隠蔽されてるものなので
権限管理オブジェクトの中でビジネスロジックを呼んでいたとしても、
使う側からすれば、同じようにみえるわけですよ。

そもそも権限管理オブジェクトっていうのは名前が間違いで
一つの「権限+ビジネスロジック」管理オブジェクトとするべきなのですよ。

そしてその中で権限管理オブジェクトやビジネスロジックオブジェクトによる
チェックをするべきでしょうね。場合によってはここでどちらとも関係ない
チェックが入るかもしれません。例えばメンテ中で閲覧しかできないみたいな。

話が見えてきましたね。
あなたは全てを「権限管理オブジェクト」にごっちゃにしてはいけないと言ってる。

私は「権限管理オブジェクト」にごっちゃにはしてない。
ただし「権限管理オブジェクト」やビジネスロジックやその他を扱うオブジェクトを
統括する別のオブジェクトを作って、そこでごっちゃにしろと言ってる。
0820デフォルトの名無しさん垢版2017/07/29(土) 12:20:56.80ID:8lDGGI0L
ちなみに、ごっちゃにするメリットは
何かの処理ができない時、その理由がなにであるかを
意識する必要が無いということです。

理由は関係なく、単純な できる?できない?で表せるので
条件を書くところが少なくなって、コードがシンプルになります。
0821デフォルトの名無しさん垢版2017/07/29(土) 12:25:24.83ID:JFgIXVoU
class Rule {
public Rule (Order o, Kengen, k) {/*いつもの*/}
public cancel(){}
}

これでドヤ?
ワイが一番頭良いと思った
0822垢版2017/07/29(土) 12:42:22.90ID:sarQXHNa
>>814
違う、ごっちゃにしたくてしてる訳ではない。
考えるのがめんどくさいからでも、混同してる訳でもない。
逆に、同じものに対する力の強さを、言葉を変えて別定義するのがおかしい。本質的には同じ物なんだから。
列挙するとまるで別のように見えるし、実際そういうシステム見たことあるが、闇が深すぎて設定だけで何人日かかるんだよこれってシステム。

力の強さにするか、ビットマスクにするか、列挙としてたくさんの積や和が可能な型とするかはおいといて、
それらは全部同じ結論の「可能/不可能」を表していて当然だと思う。

増えたとして、って、おかしいよ。今までの判定結果が、今回の判定結果と優先順位が違えば、増えた分全部再テストだよ。

システム整合性 
在庫
オペレーター

みたいな3層のチェック条件に、負在庫を許すマネージャーなんて層を足したら、それは今までのシステム整合性→在庫→オペレーターの3層のチェックのどこにどう挟む気なの?
0823垢版2017/07/29(土) 12:43:43.48ID:sarQXHNa
>>819
正しい。
0825垢版2017/07/29(土) 13:45:51.87ID:sarQXHNa
>>824
うまく揶揄して笑えるコード書いてたらレスするが、そのネタ何回目やねん
天丼にわろたるほど暇ちゃうぞ。
0827垢版2017/07/29(土) 13:52:27.31ID:sarQXHNa
>>819の折れない心は凄いが、ホントその通りで
>>421で最初に言って、>>647で重ねたように、俺もそいつがそいつだけで行えるチェックに関しては混ぜろとは言ってないんよね。
0828垢版2017/07/29(土) 13:52:38.01ID:sarQXHNa
>>826
やかましわ
0829デフォルトの名無しさん垢版2017/07/29(土) 14:18:53.75ID:Suk8TZUZ
>>819
> 権限管理オブジェクトの中で何やってるかは隠蔽されてるものなので
同じように、注文オブジェクトの内部のビジネスルールは隠蔽すべきではないですか?

> あなたは全てを「権限管理オブジェクト」にごっちゃにしてはいけないと言ってる。
違います。
注文そのものに対するビジネスルールと、それ以外(たとえば権限によるルール)をごっちゃに
してはいけないと言っています。

> ただし「権限管理オブジェクト」やビジネスロジックやその他を扱うオブジェクトを
> 統括する別のオブジェクトを作って、そこでごっちゃにしろと言ってる。
注文オブジェクトには、一切のビジネスルールの実装をしないということですか?
それには同意できませんね。

>>822
> 本質的には同じ物なんだから。
いえ、違います。オブジェクトの責務の話です。
0831デフォルトの名無しさん垢版2017/07/29(土) 14:57:48.59ID:Suk8TZUZ
テストの話を少ししましょうか。
void foo() {
  if (!check1()) {
    return;
  }
  if (!check2()) {
    return;
  }
  if (!check3()) {
    return;
  }
  do_something();
}
というコードがあったとき、チェックが3つあるから2*2*2=8通りのテストをするのかという話です。

{check1, check2, check3, do_something}
{true, true, true, 実行される}
{true, true, false, -}
{true, false, -, -}
{false, -, -, -}
の4通りで済みます。

つまり、N個のcheckがあるとき、テストケースはN+1個でいいんです。
10個のチェックがあるとき、2~10=1024通りではなく11通りです。
組み合わせ爆発は起きません。
0832デフォルトの名無しさん垢版2017/07/29(土) 15:05:20.10ID:JFgIXVoU
人間が仕事をするのだから
プログラムもそのモデルを模倣すればよい
Ningenクラスを作ろう
Ningenクラスを継承して
EigyoやKeiriクラスを作ればよい

ドヤ?
0833デフォルトの名無しさん垢版2017/07/29(土) 16:38:06.09ID:8lDGGI0L
>>831
組合せ爆発はどうあっても起こります。

重要なのは、テストするコストと価値を比べて
コストをかけてまでテストする価値はないという
コードにしてしまうことです。

テストしなくていい(する価値がない)コードが増えれば
テスト数の組合せ爆発を減らすことができます。
テストをしないためにはどうするかという話です。
0834デフォルトの名無しさん垢版2017/07/29(土) 16:40:53.77ID:8lDGGI0L
>>831
> の4通りで済みます。

それはホワイトボックステストであることが前提となっています。
なぜなら、チェックしている順番が1,2,3の順であることを
知っているからです。

チェックしている順番が1,2,3であるならば、
4通りで済みますが、ブラックボックステストであれば
どの順番でチェックしているかわからないので、
そのテストの個数では足りません。
0835デフォルトの名無しさん垢版2017/07/29(土) 16:53:18.88ID:Suk8TZUZ
>>834
check1, check2, check3が直交してたらの話だよ
ここにさらに直交するcheckが増えても、組み合わせ爆発は起こらないことの説明
0837デフォルトの名無しさん垢版2017/07/29(土) 17:12:08.75ID:Suk8TZUZ
>>836
要件が直交しているかどうかだよ。
・自分の注文しかキャンセルできない
・発送済みならキャンセルできない
これは直交した条件。

だから、ホワイトボックス・ブラックボックス関係なく、チェックの順番も関係なしに
・自分の発送されていない注文をキャンセルする
・自分の発送済みの注文をキャンセルする
・他人の注文をキャンセルする
というテストをすればいい。「他人の発想済みの注文をキャンセルする」テストは不要。

これが組み合わせ爆発が起こらない理由。
0839デフォルトの名無しさん垢版2017/07/29(土) 17:23:04.30ID:Suk8TZUZ
>>838
10個の条件があるときに、11個のテストでカバーできないようなコードを書くチームは、
もう何をしても無駄だと思うよ。
0840デフォルトの名無しさん垢版2017/07/29(土) 19:01:54.59ID:8lDGGI0L
>>837
> というテストをすればいい。「他人の発想済みの注文をキャンセルする」テストは不要。

残念ながらそうとは限らないんだよね・・・

if (自分の注文か?) {
  if (発送済みか?) {
    return キャンセル可能
  } else {
    return キャンセル不可能
  }
} else {
 if (発送済みか?) {
    return キャンセル不可能
 } else {
    return キャンセル可能 // バグ 本来はキャンセル不可能
 }
}

これは「他人の発送済みの注文をキャンセルする」場合にバグが有るコード
0841デフォルトの名無しさん垢版2017/07/29(土) 19:20:58.86ID:mj0H/MXI
>>840
自分も同じツッコミをしようとしたんだけど、視点によっては>>837も正しいなと気づいた。
システムテスト視点だと>>837で良い。
単体テスト視点だと>>840だよね。
0842デフォルトの名無しさん垢版2017/07/29(土) 19:25:34.13ID:8lDGGI0L
単体テストとか言うよりも

「バグがないという前提において不要だと判断されたパターンはテストしなくて良い」
という考えは正しいかどうかって話だよな
0843デフォルトの名無しさん垢版2017/07/29(土) 19:35:29.98ID:mj0H/MXI
テストに前提を於いたらいけないのは、その通りだよね。

ただ、システムレベルだと、禁則にあたる項目が多いのも事実で、そもそもテスト出来なかったりするじゃん?
その事を指して、テスト数爆発は無い、って言ってるのなら、まあわからなくもないかなと。
0844デフォルトの名無しさん垢版2017/07/29(土) 19:44:14.29ID:8lDGGI0L
テスト数は爆発するんだよ。どうあっても。残念ながらね。
それは認識しないといけない。

爆発してしまうテストを現実時間でどう扱うかというと
テストしないという選択肢を選ぶしか無ない

重要なのはそのテストしないという理由で
「バグがないという前提において不要だと判断されたパターンだから」は
バグを見つけるのが目的のテストとしては、テストしない理由としては適切ではない。

俺の理由は「テストする価値がないぐらい単純なものだから」
テストしなくてもバグがないのは明らかなものを作る
だからそういうものはテストしない
0845垢版2017/07/29(土) 19:47:19.90ID:sarQXHNa
>>831
途中returnして何が積なんだよ。
そうじゃなくて、この権限ならばできる、をあとから足せる構造にせなばって言ってる。

ちなみに、普通はそれは2*2*2のテストをする。
何故ならば、どちらも、影響しないという担保を行うために。
たまにあるからね。ポインタや参照先が同じとこ向いてる不具合とか。

要はテストケースはその四通りでは足りない。
お前実務経験無いんじゃねえの?

こういう思考で間違ったオブジェクト指向を流行らせようとしてる奴こそが、本来のオブジェクト指向をディスってるような気がするわ。
0846デフォルトの名無しさん垢版2017/07/29(土) 19:50:59.46ID:mj0H/MXI
テスト項目だけで考えたら、テスト爆発するのは間違いないよね。
横から入った自分にも、その点に異論反論は無いよ。

その上で、禁則を増やしてテスト爆発を小さく抑えるってのは有効だと思うけど、その点にも同意できないの?
0847デフォルトの名無しさん垢版2017/07/29(土) 19:52:02.17ID:8lDGGI0L
禁則を増やしてってなんだよw
その禁則をコードにする時にバグがでるんだろうが
0848デフォルトの名無しさん垢版2017/07/29(土) 19:53:07.60ID:mj0H/MXI
違う違う。
禁則ってのは、テスト不可能な条件のこと。
0849デフォルトの名無しさん垢版2017/07/29(土) 19:56:58.62ID:8lDGGI0L
具体的にその条件とは?

もちろんテスト不可能な条件とやらがバグってる
可能性も忘れずに答えてくれ
0850垢版2017/07/29(土) 20:09:17.42ID:sarQXHNa
>>842
明らかに正しくないと思うよ。
思い込んで、そう動く事を意図して作ったものを、そう動くだろう、とテストする事は滅茶苦茶簡単だけど、
そう動く事を確認するなんて、そう動く事を意図して作ってるんだから当たり前の話。

意図せざる動きをしないかどうか、渡せるパラメータ全部渡して確認するのがテストだよ。
0851デフォルトの名無しさん垢版2017/07/29(土) 20:11:18.96ID:1wOX1qLb
>>849
じゃあ>>840の例でいいかな。

例えば、このシステムのUIが、web系のGUIだとしたら、システムレベルだとGUI部品分の要素しかテスト出来ないじゃん?
そうすると、他人の注文にアクセス出来るのか?ってなるよね?
要件としてアクセス可能ならもちろんテストしなければならないけど、アクセス不可能ならテストしようがないでしょ。
これが禁則。

この場合、アクセス出来ないことを真っ先にテストしておけば、他人に対するテストは全部端折れる。(というか、やりようがない)

って話なんだけど、おかしい?
0852垢版2017/07/29(土) 20:11:28.57ID:sarQXHNa
>>848
テスト出来ない状態、であるというテストは要るだろ。
そういう意味ではテストケースは減らん。
0853デフォルトの名無しさん垢版2017/07/29(土) 20:14:05.02ID:1wOX1qLb
>>852
もちろん。
でも、テスト項目を消化する作業を一気に減らせる、って意味。
0854垢版2017/07/29(土) 20:15:19.38ID:sarQXHNa
>>851
おかしい。
挙げたように、ポインタや参照が被ってるみたいな挙動を見つけられない。
ある事をするとあることが出来なくなる、という状態を持つのであれば、さらに、状態と入力条件を全てテストするしかない。

>>853
減らない。
波及範囲の推定はその方法では不可能。
0855デフォルトの名無しさん垢版2017/07/29(土) 20:15:39.71ID:1wOX1qLb
単体テストだと、禁則はほとんど無いので、爆発するよね。
0856デフォルトの名無しさん垢版2017/07/29(土) 20:16:14.28ID:1wOX1qLb
>>854
えっ?
だって、テスト出来ないんだよ?
0857垢版2017/07/29(土) 20:17:45.39ID:sarQXHNa
>>855
むしろ、単体レベルで爆発してるものを使うべきではない。
モジュール化できてない事の証左でしかない。
0858垢版2017/07/29(土) 20:18:09.27ID:sarQXHNa
>>856
なら、最初からクラス分けろ。
0859デフォルトの名無しさん垢版2017/07/29(土) 20:19:21.81ID:1wOX1qLb
>>858
いや、その話がすでに単体テストの話だよね?
話が噛み合ってない気がするんだけど。。。
0860垢版2017/07/29(土) 20:20:53.20ID:sarQXHNa
>>859
いや、総合試験の話。
禁則とか言葉で誤魔化さんと、素直に、単なるルールの優先順位と気づけよ。
それはゴッドクラスでしかない。
0861デフォルトの名無しさん垢版2017/07/29(土) 20:22:24.39ID:1wOX1qLb
>>860
だから、クラスとか関係ないんだってば。
最終的なシステムレベルでのテストの話なんだけど。。。
0862垢版2017/07/29(土) 20:27:25.89ID:sarQXHNa
>>861
うーん、噛み合ってないな。
総合試験を作るとき、網羅度はどうやって出すの?
それが本当にやらなくても、そのメソッド呼ばれようがない、という判定は誰がどうやるの?
そして、呼ばれなかった、という悪魔の証明をどう担保したいの?
0863デフォルトの名無しさん垢版2017/07/29(土) 20:40:03.01ID:1wOX1qLb
>>862
そうだよね。
ごめん、自分が間違ってたよ。
0864垢版2017/07/29(土) 21:35:46.74ID:sarQXHNa
こんなレベルで総合試験どころか結合試験して提出した奴は出禁にするレベルの酷さ。
0865デフォルトの名無しさん垢版2017/07/29(土) 22:32:12.89ID:8lDGGI0L
なるほど、不具合がないことを保証するための試験ではなくて、
想定された使い方をしている限り動く
変な使い方をしなければ動く
ことを保証するテストなんだな。

想定外の操作をして問題が起きたら
それは間違った使い方をしたユーザーの責任
0866デフォルトの名無しさん垢版2017/07/30(日) 01:31:32.32ID:KXbv0POf
当たり前だろ
バカで低脳で使われるだけのユーザごときが偉そうにするな
ゴマスリしか能の無い、ちょっとコミュ力がSEより高いだけでプログラム1行も書けない下級生物は
大人しくしてろゴミ
0867デフォルトの名無しさん垢版2017/07/30(日) 02:54:09.22ID:Vcbd8R0/
ひどいコミュ障の自演を見てるようだ
ID:sarQXHNa
ID:8lDGGI0L
はトラブルメーカー
言ってることは正しい
しかし、そんなことは当たり前すぎるので、更にその上の議論をしようとしている人間に対して、全く話を理解せず頭ごなしに罵倒
狭い世界でお山の大将気取ってるコーダータイプ
多分、自分は悪くない、頭の悪い周りが悪いと思いこんでいる
0871垢版2017/07/30(日) 13:00:21.91ID:yy9Kp6PA
>>867
その上の議論を成り立たせるためには、その下の暗示されている条件を明示する必要がある。
そして事実、勘違いしてる奴が居た。
何かそれ以上あるの?
0872垢版2017/07/30(日) 13:06:56.26ID:yy9Kp6PA
コミュ障と言うか、前提を明示して、その上で議論の土俵にさえ来れない奴に最低限しかコスト割いてないのは確かだが、
それに対して、俺のコミュニケーション能力の問題だと思うほうが問題だと思うが。
なぜ理解できないのか、とか思わないのかな。
0874デフォルトの名無しさん垢版2017/07/30(日) 13:21:02.86ID:MHvXlxdG
解説

867 名前:デフォルトの名無しさん[] 投稿日:2017/07/30(日) 02:54:09.22 ID:Vcbd8R0/
ひどいコミュ障の自演を見てるようだ



870 名前:デフォルトの名無しさん[sage] 投稿日:2017/07/30(日) 10:22:01.39 ID:KXbv0POf [2/2]
>>867こいつが一番コミュ障でFA



872 名前:あ[sage] 投稿日:2017/07/30(日) 13:06:56.26 ID:yy9Kp6PA [2/2]
それに対して、"俺の" コミュニケーション能力の問題だと思うほうが問題だと思うが。



さて問題です。"俺の" が指す俺とはどれのことでしょう?
0876垢版2017/07/30(日) 14:34:19.09ID:ZJvEhfsD
>>873
>>874
何を言うとるかわからんが、870の指示代名詞が単数であることから、
>>867で挙げている二人ではなく、>>867自身を>>870は挙げていると捉えたが。

だから2レスにわけてんのに。
0877垢版2017/07/30(日) 14:35:11.53ID:ZJvEhfsD
アホを支えるやつはアホなのかな。
0879垢版2017/07/30(日) 15:35:17.38ID:P5Qwr2jW
>>878
前からそれ疑問に思ってたんだけど、公式言語なんなの?
なんか、難癖に見せかけた、難癖つける為の前フリに見えるわ。
コードで殴り合えと言っても、多分理解及ばんだろ。コードのほうが。
0881垢版2017/07/30(日) 15:56:42.37ID:P5Qwr2jW
>>880
いい感じに振り回すと先端は音速超えるしな。
10年ちょい前に論文読んだけどクソ真面目にやってて面白かった。
0882デフォルトの名無しさん垢版2017/07/30(日) 15:59:09.22ID:yjzfrjlP
あー、なるほどコードを振り回した時に
ヒュンヒュンなってるのはコードの速度が
音速を超えたために発生したソニックブームだったんだな
0883デフォルトの名無しさん垢版2017/07/30(日) 16:03:05.39ID:gbfUAfb8
>>879
Javaだよ
JavaがOOPerの実質公用語
Javaすら読めんゴミはそもそもOOPなんて語る資格も価値も無いから
無視してよい
0884垢版2017/07/30(日) 16:03:53.31ID:P5Qwr2jW
>>882
そこまでは風切り音で、そっから手首を返したときに起こる破裂音だね。
牛追いムチを観測してソニックブームが起こってることを確認したって古い論文を出してきてものすごく真面目に検証、考察してた。
0885垢版2017/07/30(日) 16:08:05.66ID:P5Qwr2jW
>>883
全然オブジェクト指向っぽいが、必ずしもオブジェクト指向ではないでしょ。
Objectから綺麗に出てきてない型も居れば、演算子も定義できず、プロパティも持てないし。
べき論はおいといて、ダイヤモンド継承も出来ない、実装を持つインターフェイスも書けない、ただJVMってスタックマシンで動く物を作るための言語じゃん。
0886デフォルトの名無しさん垢版2017/07/30(日) 22:44:39.88ID:9nHjp9K2
実装を持つインターフェイスはずいぶん前から書けるし
ダイヤモンド継承はそれが出来るからって自慢するもんじゃないだろう
0895垢版2017/07/31(月) 12:12:33.00ID:/DHTAviI
>>886
べき論はおいとくって言ってんのに何言ってんだよ。
まぁ、出来ると便利よ。
0896デフォルトの名無しさん垢版2017/07/31(月) 13:04:11.69ID:L1o8DOnz
>>895
デフォルトメソッドで菱形継承はできるだろ
現状でJavaの最大の問題のひとつは高階ジェネリックが無い(型クラス相当が実現できない)ことだよ
0897デフォルトの名無しさん垢版2017/07/31(月) 17:52:08.83ID:k2YlNqjB
>>885
> 全然オブジェクト指向っぽいが、必ずしもオブジェクト指向ではないでしょ。

こういうのがわけわからんって言われてるんだ
0898デフォルトの名無しさん垢版2017/07/31(月) 17:53:32.27ID:k2YlNqjB
>>885
> Objectから綺麗に出てきてない型も居れば、演算子も定義できず、プロパティも持てないし。
> べき論はおいといて、ダイヤモンド継承も出来ない、実装を持つインターフェイスも書けない、ただJVMってスタックマシンで動く物を作るための言語じゃん。

このスレで語られるレベルのことは、Javaで表現できるだろ
0899垢版2017/07/31(月) 18:16:30.26ID:/DHTAviI
>>896
デフォルトメソッド同時喧嘩するじゃん?再定義してやらないとならん。
呼ぶ方が決めたいとか思う。

形クラスが無いのと、あと、インライン展開無いのは痛いと思う。
今はあんのかな?
0900垢版2017/07/31(月) 18:18:08.72ID:/DHTAviI
>>897
>>898

だから何なんだ。
片手落ちで、このスレで語られてるレベルの事はと後付されても。
未来永劫このスレではjavaの限界超えないみたいじゃん。

訳わかってないのはお前の理解力足らんだけだろ。普通にレス返せてる奴が居てどの口が言ってんの?
0901デフォルトの名無しさん垢版2017/07/31(月) 19:11:17.23ID:9Hgupd7z
ああもう最悪な
これは・・・
全然関係ないことで300レス消費した理由がはっきりしたわ
0904垢版2017/07/31(月) 23:03:41.25ID:p1siwd2s
>>903
知っとるよ。しつこいな。

>>902
暇なときは暇よ。
0905デフォルトの名無しさん垢版2017/07/31(月) 23:22:37.88ID:khcSadY1
実装を持つインターフェイスも書けない
実装を持つインターフェイスも書けない
実装を持つインターフェイスも書けない
実装を持つインターフェイスも書けない
実装を持つインターフェイスも書けない
実装を持つインターフェイスも書けない
実装を持つインターフェイスも書けない
実装を持つインターフェイスも書けない
実装を持つインターフェイスも書けない 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0910デフォルトの名無しさん垢版2017/08/01(火) 00:24:18.66ID:up/JWAZ5
>>909
すまん
それはどんな動きをするんだい?と聞いたつもりだった

俺の知識不足で申し訳ないんだがその書き方は見たこと無い
0914デフォルトの名無しさん垢版2017/08/01(火) 01:04:02.59ID:zRlG3ihR
まぁでも、これがそもそもの起点となってる部分もあるから
これはシングルディスパッチのOOPが悪いとかそういうことではなくね
OO以前はもっぱら関数を中心軸にして考えていたのを
第一引数を中心軸にして考えるとどうなるかっていう
そのときの適切な設計とその手法はどうなのか
ってことだから

ただしあまり深入りしたくないのは、第一引数を中心に考えるってのが
割と経験則みたいなところがあって、必ずしもいつも適切かどうかは分からん
だからOOP万能ってことにはならないし、やはり銀の弾などないってありきたりな結論なわけだが

その意味で「本物のオブジェクト指向」ってのはかなり笑える表現だと思う
「本物のオブジェクト指向」とやらがあったとして、それが使いやすいかどうかは別問題っていう
まぁそういうことが言いたいのではないかね>>887
それか全く何も考えてないか
OO原理主義みたいな人が書いたプログラムは読みにくいって相場は決まってるしな
ちなみに俺は>>887ではないよ
0915デフォルトの名無しさん垢版2017/08/01(火) 01:12:14.49ID:zRlG3ihR
逆にマルチメソッド主義で行くんなら
複数ある関数の引数はどれも同じ重みで扱われることになるから
むしろOO以前の考え方に先祖返りすることになる
第一引数だけを特別扱いしてそれを軸足にして考える
ってのがOOの独特の世界観なわけで、全部の引数を等しく扱うなら・・・

第一引数だけを特別扱いしたときに経験的に上手くいくことが多いけど
そのやり方がどの範囲まで通用するかの実験みたいなもんだと思っとけば良いんじゃね?
無理やりにでもそうするやつと、初めから割り切ってるやつと、2パターン居るよね
0917デフォルトの名無しさん垢版2017/08/01(火) 07:23:01.97ID:q7SQowVl
Smalltalk発のメッセージングのオブジェクト指向が「本物」とか言ってる時点でオブジェクト指向の理解にかなり問題がある

アラン・ケイのメッセージングのオブジェクト指向は、設計・実装・実行・運用・保守とあらゆる局面における
「遅延結合」(…という表現だと実行時のみにひっぱられる人がいるので「決定の遅延」の方がベターか)を
メッセージングというお題目を通じて実践・徹底・サポートするアイデア
http://d.hatena.ne.jp/katzchang/20080807/p2
http://metatoys.org/oxymoron/oxymoron.html

いろいろやり残した事はあるけど、ケイも興味を失っているし、このアイデアを試す実験自体、彼がSqueakを離れた時点で終了している

一方でC++発の抽象データ型のオブジェクト指向は、例えば型推論や型クラスといった関数型のコミュニティ発の優れたアイデアを
取り入れた賢い型システムを構築してどんどん進化していて、「本物」を語るならむしろこっちをちゃんと勉強して突き詰めた方がいい


長くなったけど伝えたいことは一つだけ。

“「本物」のオブジェクト指向を知りたいなら、「メッセージ」のことはもう忘れろ”
0919垢版2017/08/01(火) 20:37:27.59ID:ps+Dq31M
>>905
あ、うん、それは書いたな。ごめん。

>>917
本物じゃなくて良いとは思うけど、何より型って話をしだすと長い割に、最終的には扱う側の問題だなって思うよ。
いわゆる「Javaで言うオブジェクト指向」とかその辺に行き過ぎるのも微妙かと。
定義したあと変化する変数なんか要らなかったんだ、すべての源は原始再帰関数だみたいな話とか、Forthみたいな、手続きとスタックがあればそれで良かったんだみたいな話も、今更見直されてるし。

>>918
自覚としては薄い。
0921デフォルトの名無しさん垢版2017/08/01(火) 21:48:10.35ID:q7SQowVl
> 手続きとスタックがあればそれで良かったんだみたいな

さながらチューリングの泥沼にはまって身動きとれなくなったロートルだな
0922垢版2017/08/02(水) 08:35:23.02ID:xl010nKq
>>920
同じこと何回も繰り返すやつ程度には。

>>921
機械がチューリングマシンで動いてる限り仕方ないよ。
今更オペアンプみたいなアナログコンピュータやら、メカニカルな物理計算機使うわけにもいかん。
乱数コプロとかDSPを数珠つなぎにするならそれも良いと思うし、全部マイクロカーネルに乗せてそいつらには目をつぶってシステムはそのイベントシステムで組むのなら、関数型とかアクターモデルを真に名乗っていいと思うけど。
0923デフォルトの名無しさん垢版2017/08/02(水) 10:06:16.17ID:QboL4ysj
> 機械がチューリングマシンで動いてる限り仕方ない

そんな機械がこの世のいったいどこにあるんかね
もしかしてチューリングマシン自体がオブジェクト指向とおなじ程度に抽象化産物ってことわかっとらん人?
さもなくば定式化されてないアイデアはこの世に存在しないも同然とか考えてる数理科学系気取ったバカ?
0925デフォルトの名無しさん垢版2017/08/02(水) 19:10:48.23ID:JD5jVN3c
過去ログを追ってて思ったんですが、もしかしてこのスレってオブジェクト指向設計の話題はNGですか?
0927垢版2017/08/02(水) 23:39:01.39ID:xl010nKq
>>923
うーん。オペアンプでのアナログ計算機も見てるし、ハーバードアーキテクチャのMPUも見るし、それらの機械はチューリング完全とは言えない場合が多いから、
逆説的にチューリングマシンであるとみなせるものに対しては、既に抽象化されていると思う。
その上で、何指向で書くかは実装者次第だって話。

何指向で書いても言語の限界はあるんだし、最終的にcould not be writtenなんてメッセージ出す時点でメモリを意識しないことは不可能なんだから、やるなら少なくともMFC一切使わない、libc一切使わない言語で語るべきなのかなと。
0929デフォルトの名無しさん垢版2017/08/03(木) 00:29:12.23ID:COO81Iix
>>928
望む答えが返ってこないからって相手をけなしてるようじゃ進まない
通じないと思うなら理解しようと歩み寄らなきゃ

双方通じる程度に近付いたところで足を止めて激しく殴り合えばいい
0931デフォルトの名無しさん垢版2017/08/03(木) 07:05:21.61ID:G0dnROB5
あ は、自慢の古くさくて今は殆ど役に立たない知識をひけらかし
他者の不勉強を罵倒して悦にいるのが目的でここにいるので
議論はおろかコミュニケーションをとる試みすら時間の無駄

Javaのインターフェースに対する認識不足とそれに対する指摘のやりとりを追えば明らかなように
たとえ知識の古さやそれに伴う主張の欠陥を指摘されたとしても
しらばっくれたり話題を関係ない方向に持っていって誤魔化す事を常としているみたいだから
議論を正常に進めるための歩み寄りやすり合わせなんて現実からはほど遠いよ
0932垢版2017/08/03(木) 07:51:10.88ID:UdIQRlcD
>>931
ひけらかし、とか好きだなぁお前ら。

どう考えても筋が悪いことを筋が悪いと言うと「あいつはわかってねえ」「時間の無駄」とか言って話自体を聞こえない話だから聞くだけ無駄、とかポリに注意されて10mぐらい離れるDQNと精神性全く同じじゃん。
0933デフォルトの名無しさん垢版2017/08/03(木) 08:00:01.37ID:R3tlb02s
筋が悪いのはあなんだけど
言っても無駄でしょ対話する気ゼロだもの
はっきりいってスレ汚すだけだし消えて欲しいんだけど
0935デフォルトの名無しさん垢版2017/08/03(木) 08:31:29.75ID:R3tlb02s
ちゃんとっていうのは認めるべきところは認めるってことね
あ はそれがズレてようが明後日の方向向いてようが、何でもいいからとにかく反論して自分の主張を押し通したい
そういう幼稚な欲求だけしかない
それは対話とは言わない
0937デフォルトの名無しさん垢版2017/08/03(木) 08:41:12.04ID:ZJRtT63j
マウンティングでも的を得た意見ならいいんだけどトンチンカンなことばかりだと相手するのも気が滅入るよね
0938デフォルトの名無しさん垢版2017/08/03(木) 08:49:42.09ID:kElMnQ/6
>>935
だからってこちらまで幼稚に返してたらどうしようもない
このスレは言語関係なくアルゴリズムや設計がメイン

言語に対する知識は古いなら古い中で培ってきた経験を弾かず新しい知識を持ったヤツが糧にすればいいと思う
0942デフォルトの名無しさん垢版2017/08/03(木) 11:02:26.58ID:Wy5AX0em
文章も何かおかしいでしょ
「イチゴ味であるところのヨーグルトにおいては
 どう考えても美味いのであるからして美味しいと言う」
みたいな感じで名詞中心、物中心、の文章になってて流れが悪い
もっと流れるように滑らかな制御構造の文章じゃないと
「あ、オタクだな」って一瞬でバレる
0943デフォルトの名無しさん垢版2017/08/03(木) 11:14:25.31ID:Wy5AX0em
オタク特有の言葉遣いってやっぱあるじゃん
なんとなくそれとなく
物物物物物物名詞名詞名詞名詞名詞の物量で会話しようとするから
何言ってるか分かんね、誰か翻訳して、って言われるやつ
ただ、何故か、オタ同士だと通じるんだよな、思考回路が似ているのかね

俺はライターでも何でもないからよく知らないが
ひらくってテクニックがあるらしいよ
漢字ばかりだと物感が強まって、物物物物な文章になるから
適当にひらがなにするらしい
特に関係や動作や様子の部分をひらがなにするらしいよ
0944垢版2017/08/03(木) 20:54:31.54ID:egpTcNQC
>>935
認めることは認めとるぞ。
ただ、一部の人間が、自分の理解できる範囲を超えてるから、それが認めてるか理解でないだけでしょ。

>>942,943
モノ中心だよ。当たり前じゃん。
定義されてない物を会話しようとする方がおかしいから、定義してってるだけじゃない?

それに、開いてる単語と開いてない単語は使い分けてるけどね。
0945垢版2017/08/03(木) 20:59:01.14ID:egpTcNQC
>>943
開くのはルールがある。だいたい業界ルールだろうけど。
補助動詞は開く、とか。
品証の時にマニュアル書いたこともあるけど。
むしろ、「もって」、は「以って」、「もっとも」は「尤も」と閉じにかかってたよ。実務では。

2つ以上に読めそうなものは漢字使うのは大原則では?
0946垢版2017/08/03(木) 21:00:02.76ID:egpTcNQC
読めそう、ニュアンスが変になったな。
2つ以上の意味に読めそう、でないとおかしいか。
0947デフォルトの名無しさん垢版2017/08/03(木) 21:21:45.56ID:Wy5AX0em
>モノ中心だよ。当たり前じゃん。
>定義されてない物を会話しようとする方がおかしいから、定義してってるだけじゃない?

あ〜それで一人浮いてりゃ世話ないな
納得
0949デフォルトの名無しさん垢版2017/08/04(金) 00:09:55.31ID:O3MamTZa
オブジェクト.オブジェクト.オブジェクト.プロパティ.プロパティ.プロパティ.プロパティ.メソッド.メソッド.メソッド

すまんのか?
0950垢版2017/08/04(金) 07:39:17.23ID:aYk1nNqm
>>947
うん。
オブジェクト指向、なんだから、アクターでもメソッドでもデータのエンティティでも、オブジェクト指向として、オブジェクトが中心になるのは当たり前だとおもうんだけど。

その大前提を無視して、モデルかとはそうじゃない、これは全部こいつがやるべきだ、みたいなゴッドOrderクラスはおかしいじゃん?ってのが書き込みの発端。
0951デフォルトの名無しさん垢版2017/08/04(金) 15:24:15.39ID:Mgeezcro
オブジェクト指向の生みの親と言われているアランケイは
オブジェクト指向はオブジェクトが中心なんじゃなく
メッセージイングが中心であって核心、本質、って言ってるよ
俺はアランケイは電波だと思うけどもこの部分は賛同する
0952デフォルトの名無しさん垢版2017/08/04(金) 17:23:04.95ID:0vZeL7Au
>>951
アラン・ケイの言うメッセージングはお題目にして方便なので(そのような実装を妨げる物ではないけど)
本質は「決定や結合の遅延」の実践・徹底(と、それをシステムによりサポートすること)だよ
詳しくは>>917のリンク先をを読んでみて
0953デフォルトの名無しさん垢版2017/08/04(金) 17:56:58.55ID:0vZeL7Au
…と書いたものの
少なくともオブジェクト指向“プログラミング”の主流は、ケイのメッセージングのそれよりは
長らくストラウストラップらの抽象データ型のオブジェクト指向の独擅場であり、さらに言えば
今世紀に入ってから作られた言語の型システムも急速に整備されてきている

ケイがSmalltalkでの実験を通じて目指した究極の動的性を必要とするならともかく
そこいらの普通の動的型言語が持っているダックタイピング程度の柔軟性でいいなら
最近の静的言語なら大抵対応できるので、いずれにせよメッセージングのことは忘れていいと思うよ
0957デフォルトの名無しさん垢版2017/08/05(土) 02:34:30.91ID:r+UIi6ic
何十年前の爺が言った妄言を未だに信奉して
「メッセージがアレなんだぜ知らんけど」
とかもうね馬鹿かとアホかと
おまえ今までずっとマンマのおっぱいでも吸ってたんかボケ?
0958デフォルトの名無しさん垢版2017/08/05(土) 13:59:51.94ID:3ZFQUHpv
>>950
> その大前提を無視して、モデルかとはそうじゃない、これは全部こいつがやるべきだ、みたいなゴッドOrderクラスはおかしいじゃん?ってのが書き込みの発端。
全部そいつがやれなんてことは誰も言ってなかったと思うが
最初から、オーダーに関するビジネスロジックと権限などによる制限はわけろって論調だったわけで
0959デフォルトの名無しさん垢版2017/08/05(土) 15:26:03.09ID:U24Mrp9j
制限は分けるけど、同一的に扱えるようにしろって
流れが追加されてるのを忘れないように
0966デフォルトの名無しさん垢版2017/08/06(日) 11:02:24.39ID:osB5uNH8
見えない敵と戦ってた奴も参戦してて、何百スレも話が混乱したままだったのかもな
0981デフォルトの名無しさん垢版2017/08/07(月) 19:45:10.29ID:90fIiSpa
Modelって言っても色々あるからな
ViewModel InputModel DocumentModel DomainModel ServiceModel DataModel...
ロジックの集合体みたいなものから振る舞いを持たないDTOまでなんでもあり
オブジェクト指向を知ってるプログラマだと
、ビジネスロジックと言えば主にDomainModelなのでModelはビジネスロジックを持つ、となる
手続き型から脱却できていない人にとっては、ModelとはなんらかのDTOつまりただのデータ集合のことだからModelはビジネスロジックを持たない、ロジックはトランザクションスクリプトに書くものだ、となる
このスレの人間はオブジェクト指向信者が多いが、あの人を代表に敬虔な手続き型信者も紛れ込んでいる
0985デフォルトの名無しさん垢版2017/08/08(火) 01:18:07.30ID:jXIjDDES
>>984
オブジェクト指向っていうのは構造なんで
処理は別にあるんだよ。

処理は手続き型 or 関数型の二種類が多く使われてる

オブジェクト指向 + (手続き型 or 関数型)で
プログラミングするのが今の主流
0987垢版2017/08/08(火) 10:33:15.83ID:y4ztJzgK
>>986
その中の、「メソッド」まで見てみた?
あるクラスまたはオブジェクトに存在するサブルーチン、とあって、手続き的な指向までは排斥されてないよ。
0989デフォルトの名無しさん垢版2017/08/08(火) 12:30:47.84ID:m8GLf68F
つまり、このスレで手続き爺手続き爺って言ってたやつは
自分はアホですって自己紹介していたようなものって事だな

だってこういう場合、普通は手続きって言葉は使わない
パラダイムの世代を表したいなら「構造化言語」って言葉を使うのが普通だ
手続きって言った場合は、関数型に対する手続き型の意味合いがあるからな
0990デフォルトの名無しさん垢版2017/08/08(火) 12:39:32.38ID:m8GLf68F
それと、巷のオブジェクト指向言語(Java C# C++ etc)が手続き型って認識が無いから
アホみたいな発言を繰り返してしまうってのもあるだろうな
メソッドを呼びあって相互作用する「手続き」を「プログラム」する
ってのが分かってない
OOPだろうが結局バグを生まないために一番大事なのが「処理の順番を守ること」である以上
手続き型としか言いようがない
0991デフォルトの名無しさん垢版2017/08/08(火) 12:44:18.16ID:m8GLf68F
まぁOOPはカプセル化とか、ある程度は保護してくれるけど
メソッド呼び出しの順番やタイミングを誤ったことをコンパイル時に知らせてくれる
な〜んて事は無いので
結局手続き型の、手続きを守らなければならないという
一番の弱点が残っている以上はOOPも手続き型に違いないわけだ
0992デフォルトの名無しさん垢版2017/08/08(火) 13:14:56.95ID:m8GLf68F
で、この話は>>412
呼び出してはいけないタイミングでメソッドが呼び出されたらどうする?
って話につながる、というか、戻る

副作用があって処理の順番にプログラムの結果が依存する
手続き型一般にありがちな問題といえる

これを言語仕様で克服できてないということは
JavaもC#もC++も手続き型ということ
手続き型の欠点をそのまま受け継いでいるから
欠点を受け継いでいる以上は無視できない
0993デフォルトの名無しさん垢版2017/08/08(火) 13:15:17.67ID:qcoC0xc5
>>991
順番やタイミングといった動的なものを
コンパイルという静的な視点でエラーにするパラダイムがあるの?
コンストラクタとかあるタイミングで何かを保証するルールならわかるけど
0994デフォルトの名無しさん垢版2017/08/08(火) 13:19:47.32ID:m8GLf68F
>>993
無いから「手続き型」だと言ってる
欠点をそのまま受け継いでいるから

ただ、順番やタイミングから逃れられる方式もあって、それが関数型なわけだけど
逆にそれが出来る関数型が存在しているからこそ
順番やタイミングに依存する方式は、より一層、手続き型臭いといえるわけだ
0996デフォルトの名無しさん垢版2017/08/08(火) 13:26:58.10ID:m8GLf68F
関数型はそれが出来るというより
意図的に排除する仕組みが言語仕様で用意されているといったほうがいいな
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 395日 14時間 15分 19秒
10021002垢版Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

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

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