1 名前:デフォルトの名無しさん mailto:sage [2016/05/30(月) 23:08:42.31 ID:pIEuB3Z3.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つは駒クラスに担当させるのか、それともルールクラスが担当するのか、などなど。
133 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 16:55:28.98 ID:9b+rCIOV.net] どういう方向性で組むか次第だろうが… 実際の将棋であればルールを知っているのは棋士であって、駒台を含む盤や駒はすべて表示のためのものに過ぎないんじゃない? 目隠し将棋の例がある様に、盤や駒などは将棋というゲームを成立させる必須条件ではないよな 情報を分散して持つのは将棋の様な評価すべき選択肢が多い場合には多くのオーバーヘッドを生むため処理速度的にも好ましくないと思う
134 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 17:07:40.64 ID:3Uom60Ul.net] >>128 合法手は「手」クラスのメソッドに問い合わせる 2. は手が駒クラスのメソッドに問う 1. は2を全駒に問い合わせた後、ルールでフィルタして完了 3. も1の後、マス目でフィルタすれば完了 >大駒を取れる手があるなら優先的に考慮する のは駒でなく手や形勢判断とか上位クラスの責務
135 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 17:08:56.70 ID:3Uom60Ul.net] >>129 1. 「手」に問い合わせる。手は盤、駒、ルールに問い合わせる 2. クラスにする。1枚1つで、40枚の駒は40個のオブジェクト 3. 盤と駒は相互に参照。手はその2つとルールを参照。
136 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 17:09:22.17 ID:3Uom60Ul.net] >>130 >合法手のルールとして 前半3つは駒と盤 後半3つはルールと手が判断
137 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 17:10:02.02 ID:3Uom60Ul.net] >>131 目隠し将棋はプレイヤーへの表示を UIでカットしてるだけで 内部処理的には盤と駒(の概念)が必要 なお処理速度は考慮せず スレタイに沿って純粋にOOだけ考えている
138 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 20:47:21.69 ID:9b+rCIOV.net] >>135 >>1 にはそういうアホな事すんなって書いてあるぞ?w 駒や盤面なんかUI部分を除けばビットフラグの集合で事足りる、内部処理をリアルの構造と同じにする必要なんかないだろう だいたい>>132-134 を忠実に実行したら1手指すまでに何回の移譲が入るのよ? 内部処理に関して言えば効きテーブルや過去の棋譜データの探索等の棋士の脳内の思考の動きを分析してオブジェクト化してコンポジットした方がなんぼかまし OOP自体は否定しないが、ダメ設計は迷惑だ
139 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 20:51:02.12 ID:cinc5ABC.net] >>108 自分の意見を正当化するために必死すぎるだろ if文の条件1つとっても仕様が無いのにどうやってソースだけで判断するんだ? 死ねよ
140 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 22:33:58.92 ID:KWV9l2rU.net] >>136 委譲の数についてはそこまで気にすることはないのでは? もちろ
141 名前:デメテルの法則なんかは意識しないとだけど パフォーマンスの話をすると早すぎる最適化の議論が絡んでくるからややこしい 必要なら全部出来たあとにロファイルとってやろうねってことになる [] [ここ壊れてます]
142 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 22:44:47.80 ID:3uAWtRHV.net] >>137 正当化もなにも、もともと >>73 >コーディングの仕方でテスト項目は変わらない この発言に対する反論としてホワイトボックステストを挙げただけだよ かなり脱線してOOと関係無くなってるからこの話題はもういいよ
143 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 23:32:23.85 ID:cinc5ABC.net] >>139 でも変わらないんだぜ ちゃんと仕様に基づいた意味のある条件分岐であるなら どう組んでもチェック項目は絶対同じ数と内容になる 増えたりも減ったりもしない 記述する場所が違うだけ だから反論にはなっていない もし違うのであればそれは違う仕様のものを作っているんだよ
144 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 23:57:23.45 ID:MqC7NAR1.net] う〜ん。よく分からん。 しっかりした設計者なら自分の理解をUMLでモデリングするんだろうなと思った…。
145 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 23:58:26.59 ID:Q91V44dw.net] 同じ「駒」でもロジック部分とUI 部分じゃ持ち方が異なって当然でしょ。 てかそのためのモジュール分けだと思うんだが。 UI とは独立に最適化できるっつーのがこういうモジュール分けの良いところな訳で。
146 名前:デフォルトの名無しさん mailto:sage [2016/06/02(木) 00:02:22.14 ID:qX3K4vQy.net] >>140 > どう組んでもチェック項目は絶対同じ数と内容になる そうでもないというか、その発想は抜けがあるよ。 たとえば数値が偶数か奇数かを文字列で返す関数があったとしよう。 function foo(value) { return (value % 2 == 0) ? 'even' : odd'; } これのチェック項目はfoo(0)とfoo(1)の2つで十分だろう。 だけどさ、関数の中身がこうなっていたらどうする? (1レスに収めるためにわざと改行せずに一行にしたけどそこは無視して) function foo(value) { var i = value % 10; if (i == 0) return 'even'; if (i == 1) return 'odd'; if (i == 2) return 'even'; if (i == 3) return 'odd'; if (i == 4) return 'even'; if (i == 5) return 'odd'; if (i == 6) return 'odd'; if (i == 7) return 'odd'; if (i == 8) return 'even'; if (i == 9) return 'odd'; } わざとバグを入れたけど、バグが無ければこの関数は仕様どおりに動くしfoo(0)とfoo(1)のテストにも通る。 だけどこの関数にはバグがあるし、だからチェック項目は2つでは十分ではないということになる。 コーディングの仕方でチェック項目数は変わらないっていうのは、半分は正しい。 もし2つあるコードのどちらも同じぐらい正しい品質であればその通り。 だけどこの例の場合は違う。2つのテストでは足りないということになっている。 この例のあるべき姿はチェック項目数を増やすのではなくて、コードをリファクタリングしてシンプルにすること。 そうすることでチェック項目は2つになるわけだが、ここまでの話で明らかなように 「コーディングの仕方でテスト項目は変わる」というか「悪いコードだとバグがないことを担保するためのテスト項目は増える」
147 名前:デフォルトの名無しさん mailto:sage [2016/06/02(木) 00:06:33.20 ID:IPFd2Mdr.net] >>143 これはコードがアホだとテストも必要って言ってるだけのような。 一般論としてここまでアホなコードに対応することを要求するのは違う気がする。
148 名前:デフォルトの名無しさん mailto:sage [2016/06/02(木) 00:11:25.02 ID:qX3K4vQy.net] >>144 これはわかりやすい例にしたからアホに見えるけど似たようなことはある。 もう一つの例が関数やコードのコピペ。 関数やコードがコピペされていると本来一箇所でいいテストを 何箇所でもやらないといけないはめになる。 テスト項目っていうのは無駄なコードがないという前提で仕様書から起こされている。 だから無駄なコードがあれば仕様書から起こしたテスト項目をテストしてもテスト項目が足りない。 正確に言えば理論上テスト項目は足りるはずなのだが、それでは品質を担保できないという現実に直面する。 だからテストする前にコードに無駄がないかを見ないといけない。 コードが想定通りでないとテストしても想定どおりの品質を保つことが出来ない。
149 名前:デフォルトの名無しさん mailto:sage [2016/06/02(木) 00:15:44.44 ID:NmrKPHaw.net] >>136 盤や駒をクラスにするのは 責務の分散協調の結果だが OOの設計を知らないのは分かった まあ将棋のように仕様が固定しているなら 高速化を重視するのはいいが RPGのように仕様変更が想定できる場合 構造化で済ましてると書き直しで汚くなる
150 名前:デフォルトの名無しさん mailto:sage [2016/06/02(木) 00:16:54.66 ID:IPFd2Mdr.net] >>145 これあるいはこのようなバグによりテストができていないことが判明した場合、 テストが漏れていると判定するか、コードがおかしいと判定するかということ。 条件の境界のテストが漏れているのはテスト漏れだと思うけど、コード固有の境界線のテストが不十分だった場合 本来の仕様とは違うことを境界線にしているコードがおかしいと判断すると思う。
151 名前:デフォルトの名無しさん mailto:sage [2016/06/02(木) 00:22:21.92 ID:NDe+tfkH.net] >>143 > function foo(value) { > return (value % 2 == 0) ? 'even' : odd'; > } > これのチェック項目はfoo(0)とfoo(1)の2つで十分だろう。 テストは仕様を満たすかどうかを確認するのが目的だから想定される入力を出力を 出来れば全部それが無理なら適当に間引いてテスト項目を作る必要がある 仕様が良く分からないけど入力は正の整数なのか自然数なのかあるいはもっと別か きちんと仕様を確認した上でないとfoo(0)とfoo(1)の2つで十分とは言えない
152 名前:デフォルトの名無しさん mailto:sage [2016/06/02(木) 00:23:27.91 ID:qX3K4vQy.net] >>144 逆に無駄なテストっていうのもある。 たとえば、入力画面に数値入力項目が複数ある。 たとえば「原価」「定価価格」「値引価格」みたいに。 で仕様書では、それぞれの入力項目は数字しか入力できないこと。 という仕様だったとする。 このテストに「原価」「定価価格」「値引価格」の三箇所を それぞれ数字しか入力できないことをチェックするのか?ということ。 同じ画面ならば省こうと思うかもしれないが、 これが違う画面にある「年齢」だったらどうするか? 仕様書から起こせば、それぞれの項目でチェックしようってなりそうだろう? だけど開発者がこれらを、数値入力項目用の汎用コンポーネントで実装すれば 数字しか入力できないというテストは無駄でしかない。 ・・・が、開発者が馬鹿で、一箇所だけ普通の入力項目を使って 独自で数字のみ有効なんてコードを書いていたら?