2016年06月25日
できるだけわかりやすく説明してみるという実験:オブジェクト指向という発明(その3)
前回は、オブジェクト指向の抽象化について説明を試みた。
引き続き、抽象化について。
「オブジェクトを抽象化することで、システムはものごとをよりシンプルに扱うことができる」とは言ったが、その意味はよくわからないかも知れない。
前回登場したオブジェクトには「高いところから落ちる」、「食べ物を食べる」、「バスに乗る」、「買い物をする」、「レジでピッとする」という行動ができた。


引き続き、抽象化について。
「オブジェクトを抽象化することで、システムはものごとをよりシンプルに扱うことができる」とは言ったが、その意味はよくわからないかも知れない。
前回登場したオブジェクトには「高いところから落ちる」、「食べ物を食べる」、「バスに乗る」、「買い物をする」、「レジでピッとする」という行動ができた。

この図で黄色に塗った行動は、それを具体化したオブジェクト(たとえば人間オブジェクトにとっての客オブジェクトと店員オブジェクト)では描かれていない。
抽象化されたオブジェクトにある行動は、それを具体化したオブジェクトも当然持っている行動である。
黄色に塗られた行動のうち、「バスに乗る」ことが、「高いところから落ちる」と「食べ物を食べる」と異なる点がある。
「高いところから落ちる」という行動(?)は、ものに共通の行動ではあったが、そのものオブジェクトを具体化した、動物と商品では「落ち方」が異なる。
商品が高いところから落ちる場合にはニュートン力学に従ってストンッと落ちるのだろうが、動物が高いところから落ちる場合には、落ちた時の衝撃を和らげるために体を動かしたり、「アーーーーーーーっ」と叫びながら、もがきながら落ちるかも知れない。
「食べ物を食べる」という行動について考えてみれば、人間が食べ物を食べる場合とゴリラが食べる場合では、明らかに食べ方が異なる。
ところが、「バスに乗る」という行動については、その行動ができる人間オブジェクトを具体化した客であっても店員であっても、同じ乗り方になる。
抽象化されたオブジェクトにある行動は、それを具体化したオブジェクトも当然持っている行動である。
黄色に塗られた行動のうち、「バスに乗る」ことが、「高いところから落ちる」と「食べ物を食べる」と異なる点がある。
「高いところから落ちる」という行動(?)は、ものに共通の行動ではあったが、そのものオブジェクトを具体化した、動物と商品では「落ち方」が異なる。
商品が高いところから落ちる場合にはニュートン力学に従ってストンッと落ちるのだろうが、動物が高いところから落ちる場合には、落ちた時の衝撃を和らげるために体を動かしたり、「アーーーーーーーっ」と叫びながら、もがきながら落ちるかも知れない。
「食べ物を食べる」という行動について考えてみれば、人間が食べ物を食べる場合とゴリラが食べる場合では、明らかに食べ方が異なる。
ところが、「バスに乗る」という行動については、その行動ができる人間オブジェクトを具体化した客であっても店員であっても、同じ乗り方になる。

この図で水色に塗った行動は、そのオブジェクトを具体化したオブジェクトでその行動の具体的な「やり方」を定義している。つまり、水色の行動は、抽象化された行動、ということである。
黄色に塗られた行動はそのまま具体的な行動を表している。
うーん、どんどんややこしくなってきたなあ。ゴリラとかが出てくるからわけがわからないのか?(多分そうではない)
もうすこしプログラムっぽい話で例えなおしてみよう。
お絵描きソフトを作っているとする。
お絵描きソフトもアプリであるから、プログラムで動いている。
そのお絵描きソフトでは、「直線」と「四角形」と「円」という基本図形を描く機能がある。
それぞれの基本図形は、「描画」という行動を持っている。またそれらの基本図形は、「図形」というオブジェクトに抽象化される。
黄色に塗られた行動はそのまま具体的な行動を表している。
うーん、どんどんややこしくなってきたなあ。ゴリラとかが出てくるからわけがわからないのか?(多分そうではない)
もうすこしプログラムっぽい話で例えなおしてみよう。
お絵描きソフトを作っているとする。
お絵描きソフトもアプリであるから、プログラムで動いている。
そのお絵描きソフトでは、「直線」と「四角形」と「円」という基本図形を描く機能がある。
それぞれの基本図形は、「描画」という行動を持っている。またそれらの基本図形は、「図形」というオブジェクトに抽象化される。
このお絵描きソフトが何らかの図形を描くとき、その図形オブジェクトという抽象化されたオブジェクトに「描画せよ」というだけでよく、そこで描こうとしている実際の図形(直線or四角形or円)の「描かれ方」について知っている必要はない。
描き方についてはその図形オブジェクトを具体化した実際の図形だけが知っていればいいのである。
直線は指定された2点をつなげばよい。円は指定された中心点と半径からグルッと描けばよい。
お絵描きソフトはいちいちそれらの描き方を知っている必要はなく、ただ「描画せよ!」と言うだけ。
これは、このお絵描きソフトに新しい図形(たとえば三角形)を追加しようとした時に非常に都合がいい。
三角形の描き方は、直線とも四角形とも円とも違った別の描き方をするはずであるが、お絵描きソフトそのものはそれをさらに知る必要はなく、その新しい図形オブジェクトが自分の形の描き方を知っていればよいのである。
以上のようにオブジェクト指向は、それぞれのオブジェクトを抽象化して考えることにより、システムをシンプルに設計でき、機能追加や変更に強いものにすることができるのである。
以前、「オブジェクト指向が理解できていない、というプログラマーが結構いる」と書いたが、このあたりを全然理解できていないプログラマーが多い。
そういうプログラマーが書いたプログラムを引き継ぐことになった場合は、このようなシンプルな設計になっていないので、悪夢である。
【今回のまとめ】
描き方についてはその図形オブジェクトを具体化した実際の図形だけが知っていればいいのである。
直線は指定された2点をつなげばよい。円は指定された中心点と半径からグルッと描けばよい。
お絵描きソフトはいちいちそれらの描き方を知っている必要はなく、ただ「描画せよ!」と言うだけ。
これは、このお絵描きソフトに新しい図形(たとえば三角形)を追加しようとした時に非常に都合がいい。
三角形の描き方は、直線とも四角形とも円とも違った別の描き方をするはずであるが、お絵描きソフトそのものはそれをさらに知る必要はなく、その新しい図形オブジェクトが自分の形の描き方を知っていればよいのである。
以上のようにオブジェクト指向は、それぞれのオブジェクトを抽象化して考えることにより、システムをシンプルに設計でき、機能追加や変更に強いものにすることができるのである。
以前、「オブジェクト指向が理解できていない、というプログラマーが結構いる」と書いたが、このあたりを全然理解できていないプログラマーが多い。
そういうプログラマーが書いたプログラムを引き継ぐことになった場合は、このようなシンプルな設計になっていないので、悪夢である。
【今回のまとめ】
- 抽象化されたオブジェクトが行う行動は、それを具体化したオブジェクトにそのまま引き継がれる行動(例:バスに乗る)と、具体化したオブジェクトで実際の行動の仕方を定義するもの(例:高いところから落ちる)とがある。
- 抽象化されたオブジェクトで行動を抽象化し、実際の行動の仕方はそれを具体化したオブジェクト側で定義する、ということをすることにより、システムをよりシンプルにし、変更に強いシステムとして設計することができる。
- このあたりが分かっていないプログラマーが書いたものを引き継ぐことになったら悪夢である(愚痴)。
myinnerasia at 18:03│できるだけわかりやすく説明をしてみるという実験 | コンピューター科学