Niftyの過去ログ集 - 16 パズルの抽象化
16 パズルの抽象化
概念モデルという言葉が出てきたとき,16 パズルを例にしてモデル化をどう行うかを説明したことがあります.これを読むと,僕のオブジェクト指向の考え方は他の人に比べてかなりずれていると思われるかもしれません.
01748/01749 BYI20012 まさーる RE^2:1.1 概念モデル ( 6) 98/09/15 10:55 01747へのコメント 田中 祐 さん、こんにちは。 (中略) >で、結局「概念モデル」とはなんぞや、という部分が例を示すだけで曖昧なま >まのような気がしますが、もしその辺りにこだわるならばそれはマーティン& >オーデルを参照せよ、ということなのでしょうか。 マーティン&オーデルってまったく知らないので,またチェックしておきます. この概念モデルですが,もっと設計よりの面から考えると,オブジェクト指向に ついて僕が考えてきたことに非常に似ています.そういう意味で共感できます. 例えば,16パズルのプログラムを作ることを考えましょう.普通,教科書通りの オブジェクト指向ならならまずこう考えますね: ・16パズルは,15個のパネルが,盤の上にのっている ・じゃあ,パネルクラスと盤クラスをつくろう でも,僕はこれがほんとにオブジェクト指向か?とまず疑うのです.上のように 考えたときは,表面しかみてない,オブジェクト指向では抽象化が大事なんだ, 抽象化が足りん,もっと抽象化しないと...というふうにまず考えます.これが Fowlerのいう概念モデルに近いのではないかと思います. こういう場合,何をもって16パズルたらしめてるのかを考えます.つまり,16パ ズルが成立するのに必要最小限のことは何か,と.絶対に盤とパネルオブジェク トじゃないと16パズルにならないのか,それがなくてもいいんじゃないか,とい う風にです. そもそも16パズルの目的って何でしょう? 16パズルは,パネルをスライドさせ ていって最終的には番号順にきれいにならべる,ということですよね.つまり16 パズルというのは, ・1から16番までの番号を順番にならべるソートの問題である. ・ただし,順番を変形するステップには制約条件がある. ということです.別にパネルがなくても16パズルは16パズルです.僕の考える理 想的なオブジェクト指向は,この概念モデルにしたがって作るべきじゃないか, というものです.そうすれば,16パズルというゲームそのものを再利用,拡張で きる可能性が広がります. 決してパネルオブジェクトと盤オブジェクトの部品の再利用がオブジェクト指向 じゃありません.部品の再利用だけなら,構造化プログラミングでもできます. #この話をもっと進めて実装レベルまでいったら話のネタになるな,と思ってい #たのですが,まだ考えてません.やっぱり概念モデルって難しい(^^;). (以下省略) 98/09/15(火) まさーる(BYI20012)
実際の仕事では,いつもこれぐらいの抽象化を考えてみるようにはしています.けれども,大抵うまくいかず妥協することが多いです.一度突き詰めて考えた後,とりあえず実装してフィードバックを繰り返しながらプログラムの品質をよくしていく,というのが僕のスタイルでしょうか.