1. はじめに
オブジェクト指向で設計していると、こんな経験はないでしょうか?
- クラス図は綺麗なのに、なぜか全体が分かりにくい
- レビューで「全体が見えていない」と言われる
私はこれにずっと違和感を持っていました。
その違和感の正体を説明してくれたのが、
『木を見る西洋人、森を見る東洋人』という一冊です。
本記事では、この本で示されている「認知の違い」をもとに、
オブジェクト指向設計で何が起きているのかを整理します。
2. 「木を見る」と「森を見る」はどう違うのか
この違いは、単なる概念ではなく、実験レベルで確認されています。
『木を見る西洋人、森を見る東洋人』の中では、いくつか象徴的な例が紹介されています。
例1: 牛はどっちと仲間?
子供に「草」と「鶏」を見せて、こう質問します。
「牛はどっちと一緒?」
このときの答えはこう分かれます:
- 西洋人 -> 「鶏」(どちらも動物だから)
- 東洋人 -> 「草」(牛は草を食べるから)
ここにある違いはシンプルです:
- 西洋: 属性・カテゴリで捉える(=木)
- 東洋: 関係性で捉える(=森)
例2: 風船はなぜ向きを変えたか?
空を飛ぶ風船が上空で動く向きを変えたとき:
- 東洋人 -> 「上空で風が変わった」
- 西洋人 -> 「風船がそっちに行きたかった」
これはこういう違いです:
- 東洋: 関係性を捉える
- 西洋: 個体の表現を捉える
例3: この人は幸せか?
5人いる中で中央の人物が笑顔で、周囲の人が不満そうな写真を見せて:
「この人は幸せか?」
- 西洋人 -> 「幸せだ(笑っているから)」
- 東洋人 -> 「幸せそうだが、何かおかしい」
つまり:
- 西洋: 個人の状態を見る(=木)
- 東洋: 周囲との関係を見る(=森)
まとめ
これらをまとめると:
| 視点 | 特徴 |
|---|---|
| 木を見る | 対象を切り出し、属性やカテゴリで理解する |
| 森を見る | 関係性・文脈の中で意味を捉える |
この違いは、
「世界をどうモデリングするか」
そのものに直結しています。
3. オブジェクト指向は「木を見る」技術
ここまでの例を見ると分かる通り、
- 西洋的な捉え方 = 対象を切り出して分類する(=木)
- 東洋的な捉え方 = 関係性の中で意味を持たせる(=森)
という違いがあります。
では、オブジェクト指向はどちらに近いでしょうか?
答えは明確で、「木を見る」側です。
ここで一つ、興味深い事実があります。
『オブジェクト指向開発の落とし穴』に掲載されている、
主要な分析・設計手法の系譜を辿ると、
それらはすべて西洋圏で生まれたものであり、
東洋発のものは全く見当たりません。
つまりオブジェクト指向という考え方自体が、
「対象を分解し、境界を定義し、分類する」
という西洋的な認知の延長線上にあると考えられます。
オブジェクト指向では、
- クラスを定義する
- 属性を持たせる
- メソッドを定義する
- カプセル化する
といった形で、「対象を独立した存在として切り出す」ことを重視します。
つまりオブジェクト指向とは、
「世界をクラスという単位に分解する技術」
だと言えます。
クラス図の抽出とアリストテレス哲学
UMLのクラス図を作成する際、私たちは無意識に
「目の前の具体的な対象」から
「共通する本質」を抜き出す
という作業を行っています。
このプロセスは、古代ギリシャの哲学者
アリストテレスが提唱した「形相(エイドス)」の概念と
驚くほど似ています。
実体と形相の類似性
アリストテレスは、個別の物体(個体)には、
「そのものをそのものたらしめている本質(形相)」
が宿っていると考えました。
-
アリストテレスの視点
目の前にある「個別の机」は、
その背後にある「机という形相(型)」を具現化したものである -
オブジェクト指向の視点
メモリ上の「個別のインスタンス」は、
設計時に定義した「クラス(型)」を具体化したものである
クラス図において
- 属性(Attribute)
- 操作(Operation)
を定義する行為は、
アリストテレスが『カテゴリー論』で試みた
「事物をどう定義し、分類するか」
という知的営みの現代版といえます。
私たちはモデリングを通じて、
図らずも数千年前の哲学者と同じ視座で
世界を解体しているのです。
4. しかし「木」だけでは設計はうまくいかない
ここで問題が起きます。
オブジェクト指向を真面目に学ぶほど、こうなりがちです。
- クラス設計にこだわる
- 責務分割を厳密に行う
- 継承やインターフェースを整理する
しかし実務では、
- なぜか分かりにくい
- 修正しづらい
- バグが出やすい
という状況に陥ることがあります。
これはなぜか?
答えはシンプルです。
「森」を見ていないからです。
5. 具体例(注文処理で考える)
例えばECサイトの注文処理を考えます。
木だけを見る設計
- Orderクラスを定義
- Itemクラスを定義
- Paymentクラスを定義
それぞれの責務は正しい。
しかし、
- 処理の流れが分からない
- どこで状態が変わるか見えない
森を見る設計
先に「流れ」を考えます。
注文 -> 決済 -> 在庫確保 -> 配送
この流れを見ることで、
- オブジェクト同士の関係
- 状態の変化
- 処理の責任範囲
が明確になります。
その上でクラスを設計すると、
「動く設計」になります。
6. 実務でよくある罠
このズレは、実務で頻繁に起こります。
パターン1: クラスは綺麗だが読めない
-> 木しか見ていない
パターン2: 責務は正しいが遅い
-> 相互作用(森)が最適化されていない
パターン3: 変更に弱い
-> 流れを考えていない
7. 解決策(視点を切り替える)
解決策はシンプルです。
設計時に、次の2つを意識します。
- 今、自分は木を見ているのか
- 今、自分は森を見ているのか
そして、意図的に切り替えます。
| フェーズ | 視点 |
|---|---|
| 要件理解 | 森(業務の流れ) |
| クラス設計 | 木(構造の分解) |
| 見直し | 森(相互作用の確認) |
8. 結論
オブジェクト指向は「木を見る力」を強く要求する技術です。
しかし実際のシステムは、
「木の集まり」ではなく「森として動く」
ものです。
そのため重要なのは、
- 木を定義する力(クラス設計)
- 森を見る力(相互作用の理解)
この両方です。
設計で詰まったときは、次を確認してください。
- クラスばかり見ていないか
- オブジェクトのやり取りを見ているか
この2つを意識するだけで、設計の見え方は大きく変わります。
参考文献
- リチャード・E・ニスベット『木を見る西洋人、森を見る東洋人』鈴木主税訳, ダイヤモンド社, 2004年, ISBN:978-4478910184
- ジョン・ラカメラほか『オブジェクト指向開発の落とし穴』トッパン, 1996年, ISBN:978-4894712160
- アリストテレス『カテゴリー論・命題論』山本光雄訳, 岩波書店, 1959年, ISBN:978-4003360415