オブジェクト指向システムの設計 172 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1uy ◆e6.oHu1j.o
垢版 |
2016/07/09(土) 00:35:13.95ID:Mn3UGZ+O
前スレ
オブジェクト指向システムの設計 171 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1465636703/
2017/05/24(水) 17:58:34.22ID:IXUmJ/sE
>>386
その中途半端なスキルの奴は、もう次の段階に行ってるよ。
そうやって設計手法に振り回されながらも実践し、失敗を繰り返すことで成長していくんだから。
で、お前はそいつの成長過程で産み落とされたゴミをメンテする役ね。成長はないけどまぁ食っていけてるならいいんじゃない。
2017/05/24(水) 21:18:50.72ID:VdpFCLoQ
レッテル張りして、プンスカ怒ってるみたいだけど、そうとう図星だったか。
設計ミスるのも程々にしとき。
2017/05/24(水) 22:12:57.77ID:krzOkTvb
>>388
お前は設計ミスなんてしないもんな
なぜなら設計したことがないからw
2017/05/25(木) 00:25:16.97ID:hLFywp3s
なんか、もういいや。建設的じゃねーし。
2017/06/10(土) 08:24:17.90ID:F6bXk1dm
オブジェクト指向言語って、構造体を拡張して作ったクラスに一事実一箇所の概念を持たせたものって認識で良いの?
2017/06/10(土) 08:30:29.38ID:F6bXk1dm
オブジェクトという概念を実現するために、構造体に操作を持たせただけなのに、古い人が構造化プログラムから転向できないのは何でだろう

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

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

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

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

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

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

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

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

ところでlinusってOOPさせないのか?知らんかった。
2017/06/13(火) 00:18:29.15ID:8xDXZ/6F
せいぜい数十行のコードを書いて、あのメジャー言語よりみじけー!とか言って喜んでるのが関数型にわかだよ
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か?あれは何がいいんだ?
知ってたら教えてくれ。
2017/06/15(木) 07:29:14.40ID:wue7VEQW
>>403
オブジェクト指向は構造化プログラムを別に否定してないよね
2017/06/15(木) 10:19:37.71ID:wH8Q5BS8
俺は本人じゃないが、そもそも元の文章は
オブジェクト指向は構造化プログラムを否定している
とは言ってなくね?
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を投げるようになるだけで本質的な解決策にならない
413デフォルトの名無しさん
垢版 |
2017/07/11(火) 20:01:43.99ID:8ipoG7uk
状態によって実行できるメソッドが異なるクラスって実装しない
2017/07/11(火) 20:04:44.30ID:ir0k8ftd
Stateパターンつうのはこの場合
キャンセル、保留中、決定済み
これらそのものをオブジェクト化して置き換えて運用するんじゃないんけ
2017/07/11(火) 20:29:26.64ID:ipR8z5Od
>>414
その場合もorderからorder_stateに移譲するだけだから結局、例外出すだけのメソッドにならない?
416
垢版 |
2017/07/11(火) 20:52:36.85ID:atBExrFz
>>412
値を持ったデータの塊に生やしたメソッドでやるから話がややこしくなるのでは?
値は値なんだし。
値に何かさせたら、値自体が変わるってすごいめんどくさいと思う。
しかも、何かさせられない状態すら持ってる。これヤバい。
何かさせられない、の定義が変わったとき過去データの扱いとかどうなるのか、すごい慎重にクラス作らないといけなかったり色々辛いと思う。

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

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

CanceledOrder cancel(DecidedOrder o) {}

これでどや
cancelメソに変なo渡そうとしても、コンパエラーで弾けるンゴ
419
垢版 |
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みたいなプロパティのフラグ持たしといて変な事したら倒しゃ良いじゃん。
2017/07/12(水) 13:06:12.99ID:ahqaJGrL
状態によってメソッドが異なるというのがオブジェクト指向と合わない気がするね
メソッドを呼ぶ側がオブジェクトの状態を気にするのは変だし
421
垢版 |
2017/07/12(水) 18:15:25.39ID:xgpaRPlM
>>420
うん。もしくは、モデル化に失敗してる。
正確には、メソッドは呼んでもいいし、そこで例外を出しても良いけど、だいたいそういうのはトランザクションチェックとかになると思う。
掴んでるOrderが最新でなければどの行為も全てできない事、とか。
履歴が必要な類のシステムはそんな感じかと。

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

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

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

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

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

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


CanceledOrder implements IOrder
DecidedOrder implements IOrder

CanceledOrder cancel(DecidedOrder o) {}
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(){}
}
430
垢版 |
2017/07/12(水) 22:14:21.93ID:LW66+r5t
>>429
Decidedで、かつ、何らかの理由でCancelに失敗した時、cancelがCancelledOrder帰してると詰む。
2017/07/12(水) 22:42:58.55ID:iO19g1+a
>>430
それはどう考えてもthrows イレーガル何とかやろ
全部のOrderにisCancelSucseeded()やisValid()生やすおつもりか?
432
垢版 |
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かと。
どう考えても、のケースはクラスのユーザが判断するべきものじゃないんだから。
2017/07/13(木) 10:11:19.96ID:ZjMlxgk7
>>424
> とりあえず認可の話ではない

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

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

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

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

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

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

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

>>421で言ってるようにトランザクションの問題として扱ってもいいし、
円が入るフィールドにグラムが入ってるかグラムが入るフィールドに円が入ってるかわからんが、とにかく腐ったな伝票としてそれ以上動かんようにロックするしかないだろ。
一回腐ったものを、腐ったもの側からリカバリするのは無謀そのもの。
2017/07/14(金) 10:07:17.82ID:RXZ2Hg3X
>>443
一貫性がないんじゃないの?

>>437
> 書く書かない、書ける書けないは人間の問題だ。

>>443
> 注文に対する処理を行うロジック。
2017/07/14(金) 10:27:40.32ID:RXZ2Hg3X
まぁ、オブジェクト指向としては>>424が正解だと思うんだが、なんで話が紛糾するのかわけわからんわ
448
垢版 |
2017/07/14(金) 11:07:29.52ID:vN8eqjVV
>>446
人間の問題、の「人間」はそれぞれの操作をするオブジェクトのメタファだと理解してる?
だから、注文書(Order)に対する操作をするオブジェクトであって、注文書自体の状態を変えるのは、注文書の操作をするロジックだよ。
各「操作するオブジェクト」全部に同じ処理書く訳であるまいし。

>>447
間違い。
オブジェクト自身が「操作できる」「出来ない」を決められるのはオブジェクト自身が一人で判断できる事に落とし込むべき。
古典的なMVCでも、Mにあたるクラスがロジック含めるべきじゃないでしょ。
2017/07/14(金) 13:29:02.90ID:Wh3H5+5v
>>448
> 古典的なMVCでも、Mにあたるクラスがロジック含めるべきじゃない

M にロジック入れずにどこに入れるのさ

http://aokilab.kyoto-su.ac.jp/documents/MVC/page3.html
2017/07/14(金) 14:07:38.38ID:OzYQCoXg
だな。ロジックにもいろいろあるが、
ビジネスロジックはMに入れるけど。
2017/07/14(金) 16:10:22.56ID:RXZ2Hg3X
>>448
> だから、注文書(Order)に対する操作をするオブジェクトであって、注文書自体の状態を変えるのは、注文書の操作をするロジックだよ。
「注文書自体の状態を変える」主体が誰/何かを聞いているのではなくて、できるかできないかの判断は誰/何がすべきですかという質問です

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

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

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

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

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

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

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

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

どう設計する?
2017/07/14(金) 23:21:15.43ID:MTLV3Z4y
TodoTask型
DoingTask型
DoneTask型
を定義しろ
func(task : TodoTask)
にDoneTaskを渡そうとしたらコンパイルエラーで弾ける
これがオブジェクト指向だ
2017/07/14(金) 23:43:22.26ID:iN4cnX21
>>453
TODO以外の時にBeginTaskを実行するコードはコンパイルエラー?
コンパイルは通るけどコールする前に実行時エラー?
コンパイルもコールもできるけどオブジェクトが実行時エラー?(あるいは黙殺?)
456
垢版 |
2017/07/15(土) 15:14:08.21ID:l4jBJff8
無駄過ぎるだろ。
結局そのタスク同士を変換(処理)する奴は、別のアクターでしょ
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に分離した方が型安全で書きやすいかもしれん
2017/07/15(土) 21:56:19.07ID:rZ7c1Y9a
>>457
気持ち悪いシンタックスだな
何言語?
てゆーかガイジ?
2017/07/16(日) 02:42:35.12ID:1fICcUqx
>>458
Javaしか知らない人には気持ち悪く見えるのかな??
2017/07/16(日) 03:08:15.64ID:qSnPeHti
>>458
ガイジキタ━━━━(゚∀゚)━━━━!!
2017/07/16(日) 10:47:57.09ID:ldCi3V7A
ScalaでもKotlinでもないよね
GaijiLangか?
2017/07/16(日) 10:51:14.26ID:RX5Mjx4x
c#
2017/07/16(日) 10:52:29.76ID:e3NckIIY
C#じゃね?
2017/07/16(日) 11:01:10.05ID:Unh0LZY1
言いたいことはわからんでもないが、

>>452
> 注文という行為は正常に行われたけど、在庫が無くて注文の確定は行われなかった
とか書かれると、こいつ何言ってんだ感が増す
2017/07/16(日) 11:34:00.12ID:nvinih80
今どきprivateを_ってどうなの
メソッド名頭大文字ってどうなの
それがC#流なの?
2017/07/16(日) 11:40:36.98ID:nwmbN5p0
>>465
巣に帰りましょうね
2017/07/16(日) 11:45:59.90ID:qSnPeHti
>>465
だから何?
2017/07/16(日) 11:48:22.11ID:nvinih80
M$のケツ穴舐めて忠誠を誓うような糞言語は使いたくないね
2017/07/16(日) 11:56:53.89ID:6w5BkJrH
特定の会社の言語を使うだけで忠誠って大袈裟だなぁww
2017/07/16(日) 11:59:04.69ID:nwmbN5p0
君はそれでいいよ
バイバイ
2017/07/16(日) 12:00:26.72ID:nvinih80
ウィン鯖にチンパンジーのアイアイエスでM$にライセンス料払うのウレピィィイしてろ奴隷
2017/07/16(日) 12:07:46.78ID:HsIBOF22
>>471
たまにでいいから知識をアップグレードしたほうがいいぞ
2017/07/16(日) 12:32:39.91ID:RX5Mjx4x
>>468
日本のケツ舐めて忠誠を誓ってるから日本語使ってるんだね!
すごいね!!
474
垢版 |
2017/07/16(日) 12:50:28.30ID:v455lTXc
>>464
変な言い方になったのは認めるわ…。
注文のトランザクションと、注文行為のトランザクションは別では、と言う感じ。
そこを疎にしておくと負荷上がってきたときに分割しやすいし、データの不整合起こしにくいし、不整合起きちゃった時に原因探しやすい。
注文行為自体はいくらでも上げれるけど、確定していくのはジョブが全部対応するとか。

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




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

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

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

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

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

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

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

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

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

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

ジョブとかタスクがあるようなシステムでシステム作った事無いのかな?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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