オブジェクト指向プログラミングはポリモーフィズムから学べ

今シリーズのまとめ

  1. 本記事

  2. オブジェクト指向プログラミングはポリモーフィズムから学べ(2) ~クラス導入編 前編~

  3. オブジェクト指向プログラミングはポリモーフィズムから学べ(2) ~クラス導入編 後編〜

  4. オブジェクト指向プログラミングはポリモーフィズムから学べ(3) ~カプセル化,継承~

始めに

プログラミングを勉強していて多分最初に○○指向プログラミングといえば、オブジェクト指向ですよね。プロパティとかフィールドとかメソッドとかいろいろ出てきて、最初はこんがらがりますよね。またそもそも何のため、クラスを導入しないといけないかわからないですよね。私も最初はそうでした。以前は知人からクラスって何のためにあるの?と聞かれたとき答えられないものでした。
以前書いた記事でプログラミングに数学が必要だと書きましたが、数学を勉強してからオブジェクト指向について、また関数型について、わかってきました。その結果オブジェクト指向の目的から勉強したほうがいいと確信した次第です。

ポリモーフィズムとは

オブジェクト指向の三要素の一つとよく言われるものです。そもそもオブジェクト指向とは?という疑問もありますが、とりあえず何はともあれポリモーフィズムです。
簡単に言えばメソッドや関数の引数などメソッドに関係するデータの違いによってメソッドの中身、具体的な処理が変わるオブジェクト指向言語によくある機能?です。プログラミング言語によって実装の仕方が少しずつ異なりますが、動的な処理が書けるという点では同じです。
数理論理学的に言えば、二階述語論理の特殊なパターンです。ポリモーフィズムについてはいったん横において、ここで二階述語論理について説明していきます。

二階述語論理とは

ここでは簡単に述語論理を説明します。詳しくは数理論理学について本なりなんなりで勉強してください。

述語論理(じゅつごろんり、: predicate logic)とは、数理論理学における記号的形式体系群を指す用語

https://ja.wikipedia.org/wiki/%E8%BF%B0%E8%AA%9E%E8%AB%96%E7%90%86

まず一階述語論理について話します。命題論理と比べるとわかりやすいですが、命題論理の例えば「イワシは魚である」というような真偽について言及できる命題について推論を重ねていくものである。一階述語論理になると「xは魚である」というようにxのよって真偽は変わるがより複雑な内容を言及できるよう命題論理を拡張したものです。数理論理学的に言えば一階述語論理は量化子を使って、定義域を定めれば真偽を判断できるようになります。二階述語論理は雑に言えば「xはy」みたいに前文の「魚である」という述語が「y」という変数にしてしまったものです。
ポリモーフィズムは前節でも言いましたが、特殊なパターンな二階述語論理です。具体的には「x」をきめれば「y」がひとつ決まるような二階述語論理です。

ポリモーフィズムのメリット

前節の続きになります。例えば、図形の面積を求める処理を考えます。図形が円だと「半径×半径×円周率」と処理が決まり、図形が長方形だと「縦×横」と処理が決まります。
こんな感じで抽象的な処理を想定できます。何がうれしいかというと、抽象的な意味での図形を想定してそれに対する処理をやりたい、またたくさん登場するときデータフローがすっきりかけるので、全体的な処理の流れが見やすいソースコードが書ける。

  • 様々な図形が百個用意する

  • それぞれの図形の面積をもとめるのに必要なパラメータの取得

  • それぞれの面積を求める

ということをしたいと思ったとき具体的な流れは別の場所に書いてこの三行の処理だけを(Javaのような言語では)mainメソッドやユースケーズなどにかけばそのプログラムは何をするためのものかはっきりします。初心者や私のようなできないプログラマーは何も方針なくソースをかいているときに、何がやりたかったのかぶれていく。そしてスパゲティコードができていきますす。話がそれてきたので戻しますが、個人的にはオブジェクト指向プログラミングの最大の利点だと思います。そして小さく書いておきますが抽象的なオブジェクトを処理していくために、必然的にカプセル化が必要になります。継承に関しては便利でいろいろ使えますが、個人的にはどうしても遺伝的集合からしか説明できないので、あまり面白くないな、またデータ群の関係が系統樹やツリー構造のようになっていくので、うまく組まないと継承だけでスパゲティコードを作れるので、大変困った機能である。とりあえず継承が深くなるとif文の入れ子と同じで可読性が一気に落ちます。クラスの導入をしていく記事を続編として書きます。そこでカプセル化と継承についても触れます。

まあいろいろ書きましたが、、

今回記事を書くためいろいろネットで調べたりもしましたが、最初のきっかけは数理論理学の入門書「はじめての数理論理学:証明を作りながら学ぶ記号論理の考え方」を読んでいて、述語論理ってプログラミングの関数だなと思ったことですね。一階述語論理の関数が動的に変わるのがポリモーフィズム?って頭によぎって書いたものです。またポリモーフィズムからオブジェクト指向を説明するのが一番かなと常々思っていましたが、見かけなかったので新しいかなと思っていたのですが、Ruby の開発者で世界的に有名なまつもとゆきひろさんが日経クロステックでやっていた連載「まつもと直伝 プログラミングのオキテ」で普通にポリモーフィズムからオブジェクト指向の解説やっているんですよ。個人的にはこの記事その時点企画倒れで、さらに追い打ちをかけるような記事を見つけたのです。さようなら、オブジェクト指向プログラミング という記事です。オブジェクト指向の批判記事なのですが、オブジェクト指向の特徴をうまくまとめすぎだろう。。と言わざるをえない記事でオブジェクト指向を勉強するならまずこの記事を読んで始めてもいいかもですね。。。オブジェクト指向がだめで関数型最高とはなりませんが、関数型言語のErlangがアランケイ流のオブジェクト指向っぽいという話もあるので*(注1)ストラウストラップ流の現在主流のオブジェクト指向から関数型とアランケイ流のオブジェクト指向がまざった感じのプログラミングパラダイムが主流になっていくのが時代の流れですかね~。(構造化プログラミングはもう今の主流のやり方に含まれすぎて当たり前みたいな扱い)

注1 https://tokoma1.hatenablog.com/entry/2015/06/07/083514  参照
これは個人的にすごい衝撃の記事でぜひ読んでいただきたい。

(補足)ダイナミックバインディングとは

ポリモーフィズムを勉強する際、ダイナミックバインディングも大事です。というか、ポリモーフィズムの前提ともいえる技術なので、いかににウィキペディアの記事のリンクおいておきます。
https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0

後記

「クラスの導入をしていく記事を続編として書きます」と書きましたが、しばらくはアニメの感想記事とか書いていきます。細田守の竜とそばかすの姫をdアニメで見て感想記事書きたいなと思っているんですが、なかなかまとまんないんですよね。予告的に書くと細田守の作品群の中では宮崎駿の作品群の中での紅の豚的な立ち位置だというような感想記事を書いています。
オブジェクト指向の記事でしたが、よかったらスキボタンよろしくお願いします。

この記事が気に入ったらサポートをしてみませんか?