[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 11/04 03:18 / Filesize : 386 KB / Number-of Response : 1023
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

オブジェクト指向システムの設計 170



1 名前:デフォルトの名無しさん mailto:sage [2016/05/30(月) 23:08:42.31 ID:pIEuB3Z3.net]
オブジェクト指向に限らず、理由もなく小さく細分化させるのはアホ
オブジェクト指向は役割でオブジェクトに分割するものであって
処理で分割するものではない。

32 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 09:14:05.76 ID:QN5Mj7aA.net]
逆に抽象化してる奴は設計書にも書いてるの?

33 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 09:18:40.51 ID:QN5Mj7aA.net]
>>28
ユニットテストでいいわけねーじゃん
5種類処理が通るのに1つしかチェックしませんって言ってるんだろ?
食わせるパラメータが変わったら死ぬかもしんねーじゃん

34 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 09:21:30.75 ID:BenfpwXE.net]
>>30
この「時」はこの処理をします
この「サブクラス」はこの処理をします
普通に一対一の対応だけど

35 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 09:23:07.14 ID:BenfpwXE.net]
>>32
食わせるパラメータっていうのはつまりサブクラスが変わったらだよね
ユニットテストでカバーしてるよ

36 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 09:39:19.63 ID:aqblqKlU.net]
て…テストって…目視じゃあ…ないの?

37 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 09:57:36.10 ID:GPXTRY73.net]
何となくだけど>>32はオブジェクト指向の利点やプログラミングの仕方そのものを
理解してない気がする。

まずはオープンソースのライブラリを眺めてくれば良いんじゃないかな?
たとえばGUI関連とかだと駒=Widgetの対応で分かりやすいと思うよ。

38 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 09:58:36.80 ID:HPDljpqn.net]
>>15
そもそもオブジェクト指向の意義を分かってないだろ?
自分が理解していないだけなのに価値がないって言っちゃう奴

39 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 10:03:35.71 ID:HPDljpqn.net]
>>20
設計なんてしないでも構築できちゃうと言っちゃう奴っぽいな
前スレで3行の疑似コード書いて設計が完了したとのたまって失笑された君w

40 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 10:04:52.49 ID:HPDljpqn.net]
>>21
こいつもオブジェクト指向の意義が分かってない



41 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 10:11:20.80 ID:HPDljpqn.net]
>>32
それぞれのクラスについてテストするに決まってるだろ…
自分の技術力が低いだけなのに技術が悪いって言っちゃう奴の典型だな

42 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 10:16:39.60 ID:HPDljpqn.net]
全然分かってないやつがswitchについてあれこれ語ってるのがうざいから教えてやると
switchが一箇所しかないって思い込みが間違ってんだわ
それとオブジェクト指向の意義について勉強してから書き込めよ
デザインパターンの最初の何章か読めば分かるだろ
デザインパターンは初心者が読んでも理解できないから理解できてないだけかもしれんが

43 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 11:30:30.06 ID:QN5Mj7aA.net]
>>34
できてないよ
タイミングもA処理とB処理とで違うじゃん

記述の仕方によるテストの数は変わらないよね?
したら違いはswitchで明示的に処理の種類がわかるか否かじゃないの?

44 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 11:44:47.87 ID:BenfpwXE.net]
>>42
明示的に処理の種類がわからなくても済むというのが抽象化のいいところなんだよ

45 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 11:46:26.65 ID:QN5Mj7aA.net]
>>43
読み手にとってなんのメリットもないじゃん
知らん人がそこいじったときにわからないのはメリットなの?

46 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 11:55:41.59 ID:BenfpwXE.net]
>>44
メリットだよ
車を運転するときにアクセル踏めばスピードあがるってのに
エンジンやギアがどう動いてるかを理解する必要ないでしょ

47 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 11:57:05.52 ID:QN5Mj7aA.net]
>>45
いや、バグったのお前が組んだところみたいだけど

48 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 11:57:58.21 ID:BenfpwXE.net]
>>46
バグった条件教えてくれれば
ユニットテスト追加して検証するよ

49 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 11:58:25.34 ID:QN5Mj7aA.net]
お前にしかわかんないようにしてあるのね
なんのためか知らんけど
設計書には書いてあるの?

50 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 11:59:53.24 ID:BenfpwXE.net]
>>48
>>33



51 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 12:03:15.69 ID:BenfpwXE.net]
デザパタの典型だから
ちょっとでも勉強すれば理解できると思うよ

52 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 12:12:14.38 ID:QN5Mj7aA.net]
>>50
でも理解する必要ないんでしょ?
さっきそう言ったよね?

53 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 12:17:00.42 ID:BenfpwXE.net]
>>51
抽象化されたのはそうだね
抽象化のデザイン自体は理解しないといけないよ
switch文の使い方を学ぶようなもん

54 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 12:19:33.48 ID:NDGHRGCl.net]
駒のインスタンスを生成するときに一回だけファクトリクラス内でswitch通すだけ。駒種別による動きの違いは各クラスが持ってる。あとはインターフェイス越しに操作する

歩は歩の動きをするし桂馬は桂馬の動きをする。動きがおかしい駒が有るなら対応するクラスを直せばいいんだよ

別に隠れて無いと思うけどね

55 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 13:16:21.12 ID:QN5Mj7aA.net]
>>53
最悪だよ
結局そこの処理って何種類あるの?
ってクラス生成してる箇所全部探すんだよね?
ヘタしたらソース全域じゃん
だったらswitchでまさにそこに一覧を置いておいてもらったほうが絶対読みやすいよ

56 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 13:37:41.62 ID:BenfpwXE.net]
>>54
そんなことにならないためのモジュール化だよ
クラス間の依存を局所化するんだよ

57 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 13:46:17.91 ID:QN5Mj7aA.net]
>>55
だからswitchでいいじゃん(笑)
すべてにおいてベターな方法があるのに脳ミソ腐ってるの?

58 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 13:54:42.25 ID:BenfpwXE.net]
>>56
あなたの言い方だとクラスの生成=switch文はソース全域にあるんだよね?
caseが一つ増えることになったらどうするの?
全部のswitch文を探してcase一つづつ足してくの?そっちのが最悪じゃん
サブクラスにしとけば>>53のファクトリー内のswitch一つの修正でいいんだよ

59 名前:デフォルトの名無しさん [2016/05/31(火) 13:56:27.56 ID:HPDljpqn.net]
ID:QN5Mj7aAのやり方じゃあちこちにswitchがあるくそコードになるのが欠点
指摘されても理解できない奴って…

60 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:10:04.79 ID:QN5Mj7aA.net]
>>57
お前も理解が足りんな
処理やチェックが増えることも減ることも無いよね
ってさっき確認したよね?
君のは俺と同じことやっててテスト項目が減るの?



61 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:14:19.90 ID:HPDljpqn.net]
>>59
コードの話だろ
コードの変更箇所が減ればテストが必要な箇所も減る
よってテストも減る
こんな常識も知らんとは

62 名前:デフォルトの名無しさん [2016/05/31(火) 14:28:31.17 ID:wvPr5zWv.net]
駒を分岐をvtable使うなんてしないだろ

63 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:28:53.26 ID:QN5Mj7aA.net]
>>60
残念ながら減りません
影響範囲のテストをサボってるだけ

64 名前:デフォルトの名無しさん [2016/05/31(火) 14:31:45.60 ID:HPDljpqn.net]
>>62
え?何言ってんのw

オブジェクト指向について何も分かってないのに語るなよ…
間抜け過ぎてまともな会話にならない

65 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:33:15.42 ID:HPDljpqn.net]
>>61
AIが書き込みをする時代になったのか

66 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:40:25.73 ID:BenfpwXE.net]
>>62
サブクラスに局所化されるから影響範囲は小さくなるよ

67 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:40:48.35 ID:LdI3VN67.net]
>>62
開放/閉鎖原則 (Open-Closed Principle(OCP))って知ってる?
知らないなら調べて見ると良いよ。

https://ja.wikipedia.org/wiki/%E9%96%8B%E6%94%BE/%E9%96%89%E9%8E%96%E5%8E%9F%E5%89%87
> 開放/閉鎖原則に従ったソフトウェアは、既存のソースコードを変更することなく、振る舞いを
> 変更することができる。

> 開放/閉鎖原則に沿ったソフトウェアは、既存のソースコードを変更せずに機能修正や機能追加を
> 行うことができる。そのため、品質検査を再実行する必要がない。

つまり、既存のコードに一切影響を与えることなく、新規に機能追加ができる。既存コードには
影響がないので、再テストも不要。
(自動テストがあるなら、実行するのはおおいに結構)

一方、switch-caseで処理を振り分けていたりする場合、新規に追加した機能のcaseが増え、
原理的には、その変更されたswitch-caseを含むメソッド/クラスを再テストする必要がある。

68 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:47:50.86 ID:QN5Mj7aA.net]
>>63
は?
ていうか同じ仕様のもん作っててなんでテスト項目変わるの?
だから少なくなってるとしたらn種類のうちの1種類しかチェックしてない箇所が大量にあるだけ
呼ばれるタイミングや状況の変化を考慮できてない
単にコードがいっしょだからテストも同じと誤魔化してるだけ
実際は起動直後に死ぬ
1秒待つと上手く行く

69 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:47:52.46 ID:LdI3VN67.net]
OCPの例:
objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/dp-ocp-2.html

class Note, Quater, Half, Staffがあり、Staff::Play()で演奏するが、ここに8分音符や16分音符
クラスを追加しても、class Staffを含め既存クラスの変更・テストは不要。

70 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:50:42.43 ID:NDGHRGCl.net]
>>54
そこの処理ってどこのこと?



71 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 14:51:48.20 ID:HPDljpqn.net]
>>67
だからさ、基礎くらい勉強してから書き込もうね
お前の知識レベルが低過ぎて会話にならない
テストが減る理由については他の人の書き込み含めてよく読もう
それでも分からないならお手上げ

72 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 15:27:02.55 ID:QN5Mj7aA.net]
>>70
お前こそいっぺんでも設計書書いたことあるの?
記述の違いでテスト項目が減るわけないだろ
ちゃんとテストやれ

73 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 15:32:23.92 ID:Q6hYp8jt.net]
>>30
に同意できるやつは少数派

74 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 15:36:36.68 ID:QN5Mj7aA.net]
俺コーディングの仕方でテスト項目が変わる現場いたことないわ
仕様書や設計書から起こすだろ常考

75 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 15:41:46.58 ID:LdI3VN67.net]
>>73
その設計書がコードと1:1でないなら、プログラマは普通コードを元にテストを書く。

>>68の例で言えば、8分音符を追加するという変更の時、どのコードがテスト対象になるのかを
知っているのは、実装したプログラマだけ。
設計書がコードと1:1なら設計書からテストを起こせるが、そんな現場はないだろう。

76 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 15:52:32.77 ID:rtPt6hUE.net]
>>74
>プログラマは普通コードを元にテストを書く

そんなマー見た事いよ。先にテスト書いちゃうじゃん。
テストに合わせて実装が現場だと普通だよ。
分るでしょう?

77 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 15:53:45.05 ID:LdI3VN67.net]
>>75
> そんなマー見た事いよ。先にテスト書いちゃうじゃん。
> テストに合わせて実装が現場だと普通だよ。
sine

78 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 16:19:39.18 ID:HPDljpqn.net]
ID:QN5Mj7aAは自分が知らないものは間違っていると思う性質だから始末が悪い
お前がなっとくできるように説明してやるにはお前に理解させてやる必要があるという…

順番に理解させてやるからまずはオブジェクト指向の主要な目的を述べよ
まともな本なら書かれていることだからちゃんと読んで書くように

どうせ知らないから答えられなくてスルーするんだろ?
知識がない上に向上心がない情けない奴

79 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 17:10:12.18 ID:QN5Mj7aA.net]
コードからテスト起こしたら全部○だよな(笑)

80 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 17:19:55.49 ID:GPXTRY73.net]
>>77
面倒見良いなw



81 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 17:26:36.18 ID:NDGHRGCl.net]
>>78
粒度でかいテストしかしないの?
関数増やせば普通に単体テスト増えるよ

>コードからテスト
ホワイトボックステストとかカバレッジとか聞いたこと無い?

82 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 18:00:45.49 ID:z0ZguSAo.net]
オブジェクト指向言語を採用していながら
設計がオブジェクト指向を活かしてないプロジェクトは山ほどあるからなあ

83 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 18:27:58.89 ID:HPDljpqn.net]
>>79
確かにw

おまけにオブジェクト指向の主要な目的についてすら答えないという…
知識がないくせに自信満々で書き込みする連中って何なんだろうな

84 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 20:33:09.19 ID:+XfJxtAA.net]
オブジェクト指向しか眼中にないバカは洗脳されていていくら言っても無駄だから諦めろ
ソースコードを読んでもわからない仮想関数による潜在的な分岐が恐ろしいと感じるのは当たり前
それでもそうするだけのメリットがあった場合は仮想関数も使うというだけ
欠点も理解できていないようでは道具は使えないよね、まったく

85 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 20:50:11.93 ID:S7oA8kB+.net]
>>80
それっぽい言葉並べただけで
全然関係無いよね?(笑)

ソースからテスト起こしたとして各メソッドの入力に対する出力は何でチェックするつもりなの?
君、ソースコードからテスト起こしたんだよ
チェックできないよね?
っていうかまともに会社でテストしたことあるの?

86 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 20:55:39.47 ID:HPDljpqn.net]
>>83
そりゃお前の設計がおかしいだけだろ
メソッドの目的が明らかでないとは終わってる

87 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 21:13:59.06 ID:BenfpwXE.net]
>>84
テストって入力に対して出力をチェックするものじゃん
単体テストも然りだよ

88 名前:80 mailto:sage [2016/05/31(火) 21:30:14.57 ID:tiFC9Nv1.net]
>>84
議論の最中に知らない言葉が出てきたのにググらずレス出来ちゃう所は素直にスゴいと思うけどもうちょっと調べた方が良いと思うよ

関数内にIfなりswitchなりがあってどのルートを通っても想定通りの動きをしてるか確認したい場合どうやって試験するの?コード見てテストケース作るよね?

君の会社ではシステムテストしかしないみたいだけど普通はもうちょっと粒度の小さいテストもやるからね

89 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 21:50:02.34 ID:+XfJxtAA.net]
このように、オブジェクト指向から抜け出せなくなります
オブジェクト指向に凝るのは麻疹みたいなものっていうけど
万年麻疹では仕方がない

90 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 21:53:42.78 ID:HPDljpqn.net]
>>88
いやお前の設計がアホなだけだって
体験談がアホなんだもんw



91 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 21:58:58.52 ID:tiFC9Nv1.net]
>>88
内心オブジェクト指向と全然関係無い話で申し訳ないと思ってたけどお楽しみ頂けたようで何よりです

92 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 22:08:54.95 ID:BenfpwXE.net]
別にオブジェクト至上主義じゃないし、たった数十行くらいのプログラムでOOD()とか思うけど
複数のswitchにcaseが1000やら10000ぶら下がってても並んでたほうが一目瞭然とかいう>>27の物言いに
ついカッとなってしまった。今は反省している

93 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 22:40:38.43 ID:/+1mPN+r.net]
switchおじさん登場
「わしのcaseは1080まであるぞ」

94 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 23:07:32.14 ID:bQbJ8LGw.net]
>>87
ううん
コードからテストなんて絶対作らない
ってか作れない
正しい出力って何?
仕様書か設計書にしか俺には見当たらないけど?
ソースコードからどうやって正しい出力なんてわかるの?
そんなトンチンカンな仕事してて恥ずかしくないの?

95 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 23:16:01.35 ID:bQbJ8LGw.net]
そもそもユニットテストとか出してるけど
お前ユニットテストやったことあるのかよ
あれさメソッド毎に
入力値とそれに対する出力値を求められるわけじゃん
入力値に対する正しい出力値ってソースコードから生成してくれんの?
それともお前のやってるユニットテストってただ通して死ななきゃOKみたいな感じなの?

96 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 23:21:08.77 ID:HPDljpqn.net]
>>93
コードを書いてから、あるいはコードを見ながらテストを書く場合もあると言ってるだけだろ
言葉尻をとらえたら確かにおかしいけど、普通に考えてコードだけを見てテストを作る訳ないじゃん…

97 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 23:38:05.03 ID:4qIp1aFV.net]
まあコードからテストが自動生成できるならそれはそれでリファクタリングの際には
役立つけどな。
とくにレガシーコードをいじる場合。

98 名前:デフォルトの名無しさん [2016/05/31(火) 23:41:19.77 ID:KvOshn77.net]
>>93
テスターなの?

99 名前:デフォルトの名無しさん [2016/05/31(火) 23:42:12.84 ID:KvOshn77.net]
ソースコードみれば意図する出力はわかりそうなもんだけど
わからないところならコメントで補ってあるはずだよ

100 名前:デフォルトの名無しさん [2016/05/31(火) 23:42:46.24 ID:KvOshn77.net]
いまどき詳細設計書なんて書かないでしょ
コードとペアでテスト作ってるはずだよ



101 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 23:49:54.85 ID:4qIp1aFV.net]
>>91
そもそも 1000 や 10000 に分岐する時点で
仮想にするとか switch にするとか以前の問題があるだろうに。。
設計をしっかりするって別にオブジェクト指向がどうのこうの言う事じゃなく、
こういう分類をうまくやって、あほみたいな数の分岐をなくしたり整理することなんじゃないのかね。

102 名前:デフォルトの名無しさん mailto:sage [2016/05/31(火) 23:53:29.29 ID:HPDljpqn.net]
このスレってスレタイのオブジェクト指向設計について語る人は少ないよな
オブジェクト指向設計は初心者には無理だからだろうか
失敗する奴は理解できていないのが原因

103 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 00:08:57.03 ID:DVl/WGs1.net]
>>101
お前が言うか
人の批判に終始してるだけじゃねーかよ
知識豊富な君は何か語りたいことがあるのかよ?

以下の用語を使い100字以内でどうぞ。

オブジェクト趣向分析
オブジェクト嗜好設計
オブジェクト施工プログラミング

104 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 00:23:11.27 ID:iqAUu6wp.net]
>>102
あと30字程度しかないじゃないかwww

105 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 00:31:30.60 ID:m3KkndXk.net]
↑算数も出来ない
プログラミング以前だね

106 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 00:33:43.37 ID:iqAUu6wp.net]
>>104
たしかに……SJISバイト数で数えてしまった

107 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 00:35:54.30 ID:XVpspPb0.net]
>>26
> 一つのswitch文にcaseが10個あったら?20個だったら?100個だったら?

それだったら関数テーブルに置き換えるな。

var f = {
  case1: func1,
  case2: func2,
  case3: func3,
  case4: func4,
  :
  :
}

switch文なんて簡単になくせるよ。

108 名前:デフォルトの名無しさん [2016/06/01(水) 02:54:32.51 ID:RDQRhO1c.net]
>>103
わろたw

109 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 07:17:52.51 ID:3uAWtRHV.net]
>>94
それはブラックボックステストでしょ
俺がコード見てテストケース作るって言ってるのはホワイトボックステストだよ

110 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 07:49:26.90 ID:eXE7t88x.net]
>>95
なんだこいつただの馬鹿じゃん



111 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 09:09:11.45 ID:MqC7NAR1.net]
将棋の合法手については駒自体の動きと盤面の両方を考慮して決まる。
クラス構成はどうする?

112 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 09:49:07.08 ID:OaTzWyfO.net]
OOにすることって事前に決めるようなナンセンスな話題にしたいなら将棋の話でいいんだけど、違うでしょ?
自動車とか鳥をクラスでとかいう入門書でよくやる例が、実際にOOで設計する例と乖離しているんじゃないかって話でしょ?
どうしてOOで設計するのかをはっきりさせないと、何をどういうクラスにするかも不明瞭になるよ。

お遊びで将棋を例にするなら、自分なら駒をクラスにして階層構造を作ったりはしない。
駒はプレイヤーが動かすものであり、ルールで動かし方が決まっている、どこまでも受動的なものだから、
あたかも主体にするような勝手な解釈を作ることになる。
つまりルール上に無い階層構造を作ることになり、設計段階で指し方のアルゴリズムに制限がかかる。
駒クラスにメソッドを定義しても、現在の棋譜が必要になるから、盤面を常に引数で受け取るか状態として保持しないといけないので、旨味も少ない。
駒はsum type相当でコンパクトに表現して、ルールをクラス化する方がいい。

113 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 09:58:23.00 ID:5B+GU3AB.net]
なんかよく分からんけど
盤クラス、駒クラス、ルールクラスではイカンのか?

114 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 10:00:59.02 ID:MqC7NAR1.net]
>>111
駒をクラスにしろなんて言ってない。

115 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 10:10:44.41 ID:MqC7NAR1.net]
>>112
明確な正解はなさそうだから、意見交換するにはいい話題だと思って。

駒の動きを駒に持たせるのは自然だけど
局面による制約はあるから盤、駒、ルールの割り振りがはっきりしない。
王手放置、二歩、打ち歩詰めの禁止は盤に紐づいてるように思える。
どちらもルールって考えもありそう。 []
[ここ壊れてます]

117 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 10:19:46.05 ID:MqC7NAR1.net]
>>111
受動的なものだからクラスにならないってのは違うだろ。
MVCもMは受動的なクラスの典型。

駒をクラスにするって制約を勝手に想定して反発してる感じだから
それがないと認識した上で意見を書いて欲しい。

118 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 10:20:56.38 ID:370Huk/V.net]
>>84
お前それ@t_wadaに対して言えんの?

119 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 10:23:44.00 ID:5B+GU3AB.net]
>>114
>王手放置、二歩、打ち歩詰めの禁止は盤に紐づいてるように思える。

個人的にはそれがルールかな

駒は動ける方向を持つ、
盤は駒の位置を保持する
(存在しない位置に駒が動こうとしたらエラーを返す)、
ルールが禁じ手かどうか判定する、
って感じだろうか

120 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 10:29:02.31 ID:HJuydxx6.net]
確かにロジック面では意義が薄いかもしれんが、表示面ではクラス化が有効だと思う。

設計の仕方はいろいろあるけど、一般論として柔軟性を確保しつつ短くてシンプルなコード
になることが一番大事だわな。

で、何をもってシンプルというかが知識量や技術力によって違うだけだと思う。

例えば、ある性質を伝えてもらうとして、普通のエンジニアには微分方程式で示されたほうが
シンプルで使いやすいと思うけど、文系の人はExcelの計算シートで示されたほうが分かりやすい
と思うのかもしれない。



121 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 10:30:10.54 ID:MqC7NAR1.net]
>>117
駒の動きを表現する方法はどう考える?
金の動きは概念的には分かるけど、金クラスに問い合わせたときにどうやって返すんだろ?
配置が決まっていないならマスとして返すことはできない。
金オブジェクトは配置されたマスの情報まで持っているとするのか?

122 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 10:39:44.99 ID:KWV9l2rU.net]
駒は相対的に移動できる箇所を返して
はみ出た部分とかを判定・表示するのはUIの責任かなと

123 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 10:49:52.11 ID:MqC7NAR1.net]
電王戦に参加する将棋ソフトという想定。
>>8-9

124 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 11:04:15.23 ID:3Uom60Ul.net]
>>114
盤にひも付いてない
盤は駒の位置しか知らない
どちらもルール

125 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 11:05:23.92 ID:RnjmzRnq.net]
将棋を知ってるやつなら飛角香と合駒まで考えが及ぶはず

126 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 12:00:09.01 ID:MqC7NAR1.net]
>>122
>>123
とすると、どうなる?

127 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 12:18:23.72 ID:3Uom60Ul.net]
駒は自分がいるマス目と
動ける範囲を知っている

128 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 12:53:57.88 ID:63gTfooz.net]
駒は条件判断の材料なだけでその後の処理は駒の担当ではないから、条件判断しやすい型にする
Javaならenumにしてメソッド追加するならgetDisplayName()程度

将棋盤は9*9のマトリクス情報と手数、棋譜情報(
駒、FromPos , ToPos、時間のリスト)を保持するデータクラス

Playerは持ち駒と評価情報とか。この辺は思考ロジックが分からないから適当だけど打ち筋の傾向とか情報があれば保持って感じでデータクラス

129 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 13:12:22.20 ID:3Uom60Ul.net]
棋譜と時計は独自クラスを持つ
持ち駒は持ち駒台があるし
盤の一部だと考える

130 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 14:06:20.72 ID:MqC7NAR1.net]
なんとなくは分かるんだが、明確には分からない。
以下のケースのそれぞれの場合に、どのクラスのメソッドを呼び出して、
そのメソッドはどのクラスのどんな情報を参照するのか説明して欲しい。
@盤上のすべての合法手を列挙する。王手放置などはしないようにする。
Aある駒が移動できるマスを列挙する。
Bあるマスに移動できる手を列挙する。大駒を取れる手があるなら優先的に考慮するとかあるだろう。



131 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 14:21:18.72 ID:MqC7NAR1.net]
>>128の例を書こうと思って書き始めたけど、文章で書くよりUMLを書いたほうが早そう…。

@合法手をどのクラスに問い合わせるのか?
A盤、駒、ルールはクラスとするのか?駒には金は合計4枚とか複数枚あるけど
それぞれごとにオブジェクトがあるのか?、
B盤、駒、ルールの間の参照は?
といった点について考えを聞きたい。

132 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 14:28:22.36 ID:MqC7NAR1.net]
合法手のルールとして

駒ごとの動き。
縁にあれば動きが制約される。
他の駒によって動きが制約される。
二歩による制約。
王手放置は禁止。
打ち歩詰めの禁止。

とかいろいろあって、駒だけに関係するものから盤全体に関するものまで
レベルがいろいろあるのをそれぞれどのクラスに担当させるんだろう?

>>125とするなら
駒ごとの動き。
縁にあれば動きが制約される。
は駒オブジェクトが返せるけど、他を考慮するには盤の情報が必要。
上の2つは駒クラスに担当させるのか、それともルールクラスが担当するのか、などなど。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<386KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef