2016年10月04日
抽象化の次元
ブラックボックスが入れ子になった多層構造において、ある層の上位の層は、その層にとっての「意味」となる。
下位層にある「部分」が上位層の「全体」を作り上げる。
このとき、上位層である「全体」は下位層の「部分」の総和を超えたものとなる。これを「創発」という。
オブジェクト指向の本質は「ブラックボックスの利点を応用すること」と書いたが、オブジェクト指向のもうひとつの側面として、「抽象化」というものがある。
実はこの「抽象化」というものも、つきつめて考えれば「ブラックボックス化」ということになるのだろうが、「部分と全体」が層になったブラックマトリョーシカで表される多層構造の中に、この「抽象化」の概念を当てはめて考えることは不可能である。
という意味で、オブジェクト指向のもうひとつの側面である「抽象化」は、ブラックマトリョーシカとは違う次元軸で考える必要がある。
下位層にある「部分」が上位層の「全体」を作り上げる。
このとき、上位層である「全体」は下位層の「部分」の総和を超えたものとなる。これを「創発」という。
オブジェクト指向の本質は「ブラックボックスの利点を応用すること」と書いたが、オブジェクト指向のもうひとつの側面として、「抽象化」というものがある。
実はこの「抽象化」というものも、つきつめて考えれば「ブラックボックス化」ということになるのだろうが、「部分と全体」が層になったブラックマトリョーシカで表される多層構造の中に、この「抽象化」の概念を当てはめて考えることは不可能である。
という意味で、オブジェクト指向のもうひとつの側面である「抽象化」は、ブラックマトリョーシカとは違う次元軸で考える必要がある。
ここで以前書いた「オブジェクト指向における抽象化」について、おさらいを。
「店で買い物をするとき」を非常に単純に言ってしまえば、登場人物は「客」と「店員」ということになる。
それぞれがそこで行うことは異なるが、 それらは「人間」というオブジェクトに抽象化することができる。
客が買い物を終え、バスで家に帰る。
店員が仕事を終え、バスで家に帰る。
ここで彼らがバスに乗るときには、ともに「人間」として扱われるので、バス料金を払う必要がある。
ここでは客が買い物をした店にとっての客であるのか店員であるのか、ということは関係ない。
以前の説明で僕は、そこへゴリラがやって来てバスに乗ろうとする、という変な例を出した。例に困っていたのでかなりテキトーに書いたんだと思う。我ながらひどいたとえだ。ごめんなさい。
そこで書きたかったことは、「ゴリラはバスに乗れない」ということだ。それは「バスに乗ることができる」ということが人間オブジェクトに備わった機能である、ということを表している。
「人間」と「ゴリラ」はさらに「動物」というオブジェクトに抽象化することができる。
動物オブジェクは「食べ物を食べる」という機能が備わっている。
この「動物オブジェクトは食べ物を食べる」という機能は、「人間オブジェクトがバスに乗ることができる」という機能と異なるものである。
「人間がバスに乗る」という機能そのものは人間に備わった機能であるのに対し、「動物が食べ物を食べる」という機能は、「食べる」という行為そのものが抽象化されている。
「動物が食べ物を食べる」という行為そのものは、その動物によって様々な様式が見られる。
ゴリラと人間であればある程度同じような食べ方なのであろうが、たとえばバナナの皮をむかずにそのまま丸呑みする動物もいれば、口以外の器官によって栄養を吸収する、というものもあるだろう。
それらを含めて「動物は食べ物を食べる」と言ってしまうことは、「食べる」という行為を抽象化していることになる。
上図で動物オブジェクトの「食べ物を食べる」というものが水色で表されているが、これは抽象化された機能を表している。その実際の「食べる」という行為のありかたについては、実際のオブジェクトが知っている。
言い換えれば、「動物は食べ物を食べる」というときには、「食べる」ということの詳細については誰も知らない。
プログラミングにおいてオブジェクト指向で設計をするということは、このようにオブジェクトを抽象化していく中で、その機能(行為)をも抽象化することになる。これはオブジェクトをブラックボックス化する、というだけではなく、そのオブジェクトが持つ機能をもブラックボックス化する、ということである。
これはブラックボックスの層が積み重ねられた多層構造とは別の次元として扱われるべきものである。
「店で買い物をするとき」を非常に単純に言ってしまえば、登場人物は「客」と「店員」ということになる。
それぞれがそこで行うことは異なるが、 それらは「人間」というオブジェクトに抽象化することができる。
客が買い物を終え、バスで家に帰る。
店員が仕事を終え、バスで家に帰る。
ここで彼らがバスに乗るときには、ともに「人間」として扱われるので、バス料金を払う必要がある。
ここでは客が買い物をした店にとっての客であるのか店員であるのか、ということは関係ない。
以前の説明で僕は、そこへゴリラがやって来てバスに乗ろうとする、という変な例を出した。例に困っていたのでかなりテキトーに書いたんだと思う。我ながらひどいたとえだ。ごめんなさい。
そこで書きたかったことは、「ゴリラはバスに乗れない」ということだ。それは「バスに乗ることができる」ということが人間オブジェクトに備わった機能である、ということを表している。
「人間」と「ゴリラ」はさらに「動物」というオブジェクトに抽象化することができる。
動物オブジェクは「食べ物を食べる」という機能が備わっている。
この「動物オブジェクトは食べ物を食べる」という機能は、「人間オブジェクトがバスに乗ることができる」という機能と異なるものである。
「人間がバスに乗る」という機能そのものは人間に備わった機能であるのに対し、「動物が食べ物を食べる」という機能は、「食べる」という行為そのものが抽象化されている。
「動物が食べ物を食べる」という行為そのものは、その動物によって様々な様式が見られる。
ゴリラと人間であればある程度同じような食べ方なのであろうが、たとえばバナナの皮をむかずにそのまま丸呑みする動物もいれば、口以外の器官によって栄養を吸収する、というものもあるだろう。
それらを含めて「動物は食べ物を食べる」と言ってしまうことは、「食べる」という行為を抽象化していることになる。
上図で動物オブジェクトの「食べ物を食べる」というものが水色で表されているが、これは抽象化された機能を表している。その実際の「食べる」という行為のありかたについては、実際のオブジェクトが知っている。
言い換えれば、「動物は食べ物を食べる」というときには、「食べる」ということの詳細については誰も知らない。
プログラミングにおいてオブジェクト指向で設計をするということは、このようにオブジェクトを抽象化していく中で、その機能(行為)をも抽象化することになる。これはオブジェクトをブラックボックス化する、というだけではなく、そのオブジェクトが持つ機能をもブラックボックス化する、ということである。
これはブラックボックスの層が積み重ねられた多層構造とは別の次元として扱われるべきものである。