実在主義とモデリング
同僚に教えてもらった資料に実在主義とモデリングの関連性が語られていた。
モデリングと抽象化
モデリングとは、言うまでもなくモデルを作ることです。モデルを作るということは、抽象化を行い、理解できる範囲を広げることにもなります。 具体的なもの(インスタンス)の方が理解しやすいことがあるかもしれませんが、理解できる範囲が狭くなります。
『具体⇔抽象』トレーニングにも同じようなことが書かれていた。
抽象化は表現を広げる、具体化は表現を狭める
『具体⇔抽象』トレーニング](https://amzn.to/3LIiSAK)
- 抽象的な問題が理解できないときは、具体例をいくつか考える
- 具体的な問題が理解できないときは、抽象化して考える
名前の役割
名前で役割がわかるようにすることで、コードを読めば何が起きているのか、何をやろうとしているのかがわかります。
このあたりはリーダブルコードでも散々言われていることだ。
モデリングと実在主義
「モノ」は本質が実存に先立つ
「ヒト」だけが実存が本質に先立つ存在
- 「モノ(自然物以外)」はその役割のために作られたもの
- 「ペットボトル(モノ)」は「飲料を入れる(役割)」ために作られた
- よって本質(役割)が先に存在している
- 「ヒト」は存在が先にあり、役割はあとから付いてくる
- 「自分(ヒト)」という存在があって、「講演者(役割)」を演じる
データは単なる値です。適切な名前を付けることで「意味」を持ちます。適切な名前を付けることで「役割」を持つと言い換えることができます。
- 先に「データ」が存在していて、名前をつけることで「役割」「振る舞い」が決まる
- 「hoge * 0.9」というデータが先にあり、「Order」「Discount」という名前をつけ「Discount(anOrder)」とすることで役割、振る舞いがわかりやすくなる
- 「0.9」という単なる値が存在している。この状態では役割が存在しない
- 「discount」という名前をつけることで、はじめて「0.9」に意味(役割)が生まれる
モデリングしていると、ある要素をクラスとロールのどちらにすべきか、迷うことがあります。
そのような時は、 「そのオブジェクトは生まれた時からそのクラスのインスタンスか?」と考えてみることで判断しやすくなります。 「存在が役割に先立つか」どうかで判断するわけです。
-
社員A のオブジェクト
- Aさんはヒト(生まれた瞬間から「社員」でない)
- Aさんは「社員」というロールを演じている
- つまり、「社員」はクラスではなくロール
class 社員 {}
ではなくclass ヒト { 役割: 社員 }
ということ(この例は若干わかりづらい気がする……)
-
「管理者のオブジェクト」で考えてみると…
- 「管理者」は生まれた瞬間から管理者ではない
- ユーザーが「管理者」というロールを演じている
- つまり、「管理者」はクラスではなくロール
class ユーザー { 役割: 管理者 }
ということ