例えば、ソフトウェア業界における基本要求は、非常に抽象的です。
実現が困難であったり、矛盾していることも珍しくありません。
現実世界で人が実際に行っている作業を忠実に再現しようとすると、とても扱いにくいモデルを設計することになります。
このため、我々は要求を忠実にモデル化せずに、要求の真意を正確に捉えたものを主軸に詳細要求を検証・分類しながら定義していく必要があります。
このように、設計を常にトップダウンで行うことによって、全体的にバランスのとれた扱いやすいモデルを設計できます。
オブジェクト指向を初心者に語る上で自然界のサンプルを用いると失敗する理由として、初心者は冷蔵庫にキリンを入れることを難しく考えてしまうから、と考えることができます。
「冷蔵庫にキリンを入れる手順を示せ」
とされた時、一般的には大きさの問題を先に解決しようとします。
そして、このようなボトムアップな視点から、以下の回答のように全体が把握できないバランスを欠いた回答ができあがります。
冷蔵庫に入るくらいにキリンを小さくする(冷蔵庫をキリンよりも大きくする)
冷蔵庫に入れる
上記は「冷蔵庫にキリンを入れる手順」は示せていません。
「冷蔵庫にキリンを入れる手順」を全体的に捉える時、大きさの問題を解決するための責任は、冷蔵庫に入れるという手順に委譲します。
扉を開ける
キリンを入れる
扉を閉じる
冷蔵庫に「何か」を入れる行為は全体的に見れば、やはり扉を開けて「何か」を入れて扉を閉めることです。
この「何か」を具象化することで、これに準じる多様な問題が生じます。
そして、その問題は「何か」というオブジェクトに依存します。
どうやって扉を開けるのか?
どうやってキリンを入れるのか?
どうやって扉を閉じるのか?
それらのタイトルに準じた答えは、別に用意すれば良いでしょう。
何故なら、冷蔵庫にキリンを入れる手順の次の次元のテーマだからです。
一部の人はご存じだと思いますが、本日は寝不足で思考力が飛んでしまっております。
こんな妙なこと書いてしまったのも、きっと寝不足のせいです・・・