抽象データ型が導入される前の世界から考えると良い気がします。
抽象データ型の無い世界
初期のコンピュータはアドレスに状態を保持できるだけでした。何をするにしても状態遷移に落とし込まないと行けないわけです。
構造化プログラミングにより、処理構造に抽象化されました。やりたいことがif/loopで考えることが出来るようになりました。
関数型言語では、関数によって抽象化されました。IN/OUTの関係性で考えることが出来ました。
抽象データ型の無い世界のECサイト
では、これで、ECサイトというシステムを考えてみましょう。
- ECサイトは、商品の一覧を並べて表示します。
- ECサイトは、一覧にある商品を購入できます。
状態遷移/構造可プログラミング/関数型言語で、考えてみましょう。大半の人は、ふえ?っとなります。
構造体
少しインチキしました。抽象データ型の前に、データ構造で表現する概念があります。
所謂、構造体ですね。この概念があれば、コンピュータシステムとしての抽象化はかなりできます。
商品一覧画面と商品DBという構造体を用意してみましょう。DB -> 画面
って出来ますね。
商品購入はもっと分かりやすいですね。在庫とかDFDなイメージがもっとまんまです。
OOPが業務システム等で流行らない最大の原因がこちらですね。データ構造型があれば、システムがすべきことはだいたい表現出来てしまう。
抽象データ型の発見
抽象データ型とは、何か。
図形型っていうけど、四角形と三角形って持ってるデータ明らかにちがくね。と、データ構造では表現できない共通性がありました。四角形と三角形って、何が共通点なんだろと考えた結果、図形なら面積を計算できる共通点があると気付きました。
このできるを「振舞い」と呼び、データ構造が異なっても振舞いによって共通化(抽象化)することが出来る。という発見がされたのです。これは、最初にクラスとオブジェクトという概念で実現されました、これがオブジェクト指向プログラミングの始まりです。(原理のほうはいい加減省略)
概念の変化
さらこの概念は進化します。することへのこだわりは消えて出来ること。さらにそれ自身でなく備えていること。即ち、性質を表現できるようになりました。実装的な話で言えば、Interfaceや型システムですね。
抽象データ型の最大のポイントはなんでしょうか。オブジェクト指向プログラミング出来ることでしょうか、違います。
「コンピュータソフトウェアの処理ってのは、結局のところ、なんでも抽象化して表現できちゃうわけだな。」です。
ECサイトに戻ってみましょう。
- ECサイトは、商品の一覧を並べます。
- ECサイトは、一覧にある商品を購入できます。
これで抽象データ型ECサイト
の定義が完成です。
分かりやすいの次元じゃないですね。まんまなだけですね。でもこのまんまが表現できるのが、抽象データ型です。この人との親和性の高さが、最大の特徴です。抽象データ型によって、システムに何をさせたいではなく、何をしたいから考えることが容易になりました。
実はこれが「オブジェクト指向」だった...
抽象データ型がちゃんと命を受けて生まれた時に、オブジェクト指向って名前で生まれた都合、この概念をオブジェクト指向と呼びます。が、2021年だと、たぶんみんなそう思ってない。当たり前すぎて普遍的になってるだけかと思います。is 空気。
この記事なしで「システムに何をさせるではなく、何をしたいかから考えるのが、オブジェクト指向だったんだぜ。」と言ったら、何言ってんだコイツと思われかねません。この記事みても、そうかな?と感じるぐらいかと。
工学とかOODAとかOOP
性質(※)を定義する手段は、他にも色々あったりします。でも、振舞いから対象物をあぶりだすオブジェクト指向は、人との親和性が非常に良かったようです。人との親和性というのは、要件や設計の初期の課題まんまで、そちらの方で形式ばってよく活躍しています。モデル駆動とか呼ぶと、なぜかオブジェクト指向が前提になってたりします。
この辺り、要件からコードまで生成的なあれのイメージばかり語られますが、アレの源流はオブジェクト指向ではないです。オブジェクト指向は、とりつかれただけです。アイドルに夢が託されただけです。
みんなDBMS大好きだからデータ中心だと思いがちだけど、ユーザー要求の深掘りとかふんわり段階は、無意識にオブジェクト指向使ってると思うよ。だって、コンピュータシステムに目的の抽象化概念を取り入れたのがオブジェクト指向だもん。オブジェクト指向なのそれ?って言われたらどうだろうね。って答えるけど。
※ オブジェクト指向プログラミングそのものは、命令型なのに、概念的にやってるのは、性質の定義というのは異常にややこしいです。宣言型言語と混同してるのかと思われそう。宣言型言語はあるスコープ内に限ることで安全に性質を定義できる言語です。オブジェクト指向はその辺り関与せずだったのが。。
2021年のオブジェクト指向プログラミング
結果、オブジェクト指向プログラミングそのものは、初期の抽象データ型表現の形式ばった役割という呪縛が着せられてしまいました。関数型言語等のリテラシによって、はまればハマるほど存在意義に悩むもの。というのは皆様の直観通りじゃないでしょうか。おめーまだけいしょうになやんでるのか!?
でも、このスタンダート化は良い意味もあるんですよ。プログラミング世界に、抽象(データ型)概念をぶち込む第一歩として、前線で大活躍されているのです。if/loopでプログラミングを分かった気になった輩に、🐶 exnteds 動物
の洗礼です。(初見殺し過ぎるけどな!)