UGC=人海戦術 vs CGC=人工アジアガラパゴスとはつまりアジアだということだ

2016年06月24日

できるだけわかりやすく説明してみるという実験:オブジェクト指向という発明(その2)

さて前回は、「オブジェクト指向とは何か」ということについて、「各オブジェクトごとに内部完結することで単純化する」という特徴についての説明を試みた。
プロのプログラマーでもオブジェクト指向を正しく理解していない者が多いぐらいなので、この説明で伝わったかどうかは僕にとってチャレンジングなことだが、そもそも、できるだけわかりやすく説明してみる「実験」なので、もし伝わっていないようであればどんどん手を加えていこうとは思っている。

さて、オブジェクト指向のもうひとつの側面。「抽象化」について。

前回の話で、プログラムに登場するすべての人、物をオブジェクトとして考え、それらがそれぞれ内部完結するように設計する、ということを書いた。「内部完結」という言葉をもうちょっとくだいて言えば、あるオブジェクトしか知り得ないことは、オブジェクト外部は知らない、ということだ。買い物に来た客の財布の中身を店側は知らない。

ここで、登場する人、物をもう一度考えてみると、客、商品、財布、店側、ぐらいのものか。
ここで「店員」と言わずに、「店側」としているのは、このプログラムで作られるシステムを指しているからだ。商品の値段を調べて客からお金を受け取るところまでを管理するシステム。
ここではこれらに加えて、「店員」というものも登場させてみよう。

店員は、このシステムを使って、商品のバーコードをピッとやり、客からお金を受け取り、袋に詰めて渡す。
この間にこのシステムがやっていることも書いてみようとしたのだが、必要なこと以外までをも説明する必要があり、問題が発散しそうなので、ここではやめておく。

さて、僕はこういう店(僕の頭の中では勝手にコンビニを描いているのだが共有できているだろうか?)のことをよく知らないが、店員がレジの前に立つ時に何か胸の名札のところにバーコードリーダを当ててピッとやっているのを見たことはないだろうか?
あれは何をしているのだろう?ただ痒かっただけ?

多分あれは、これからちゃんと仕事をするのは店員Aですよー、というのをシステムに教えているのである。
つまり、店員オブジェクトには、店員を特定するIDを持っていて、それをこれからする作業に紐づけているのである。店員がどれだけの客に対応したか、などの統計が残るのであろう。

ここで、ヘンテコな客(多分酔っぱらい)がいて、その店員のマネをして空いていたレジに立ち、胸にピッとやってみても何も起こらない。
つまり、客は店員とは違うので、店員オブジェクトが持っている店員IDを持っていないし、そのIDをシステムに教える機能も持っていない。 

このヘンテコな客は、レジのお金を盗もうとしたわけでもなく、ただふざけていただけなので、ちょっと怒られただけで帰らせてもらえた。
そのヘンテコな客の子供と思われる小学生も一緒に帰った。あんなヘンテコなのが親だなんて、かわいそうだな。でもお菓子を買ってもらえてよかったね。
そして店員もバイトが終わったので帰った。
この3人、ヘンテコ、子供、店員について考えると、ヘンテコと子供は客オブジェクトで、店員は店員オブジェクトということになるが、3人の共通点がある。

3人共が「人間である」ということだ。
そして人間であれば誰もがバスに乗ることができる。

3人共、バスで帰った。
そのバスは一律料金なので、前払いなのだが、ここにバス側のシステムがある。
バスのシステムは、乗ってくる客が大人か子供かで料金が変わるが、料金の違いはそこだけである。乗った距離にも関係ない。

このバスに、ゴリラが乗ろうとした場合はどうなるのだろうか?
ゴリラはおそらく乗車拒否される。「すみません、うちはゴリラはお断りすることになっているので。。。」と。
ここでゴリラは逆ギレして意味のわからないことを言う。
「店員が乗ってよくて、なぜゴリラはいけないのか?」

ここでバスに乗ろうとしていたオブジェクトを分けると、人とゴリラになる。
店員と客とゴリラではない。
つまり、店員と客はバスに乗る時に「人間」として扱われ、その職業を尋ねられることはない。

店員と客は、共通する「機能」として、「バスに乗る」というものを持っている。
ゴリラは持っていない。
店員と客を、その職業にかかわらず、「人間」としてだけ扱うこと。これをオブジェクト指向では「抽象化」という。

抽象化1

「人間」というオブジェクトは客オブジェクトと店員オブジェクトを抽象化したものであり、バスに乗る際は、客であるのか、店員であるのかを問われることはなく、人間であればバスに乗ることができる。

人間とゴリラはその共通項、「食べ物を食べる」という、「動物」というオブジェクトに抽象化できる。人間もゴリラも食べ物を食べることができる。その食べ方には違いがあるだろうが、バナナを渡せば人間であろうがゴリラであろうがそれを食べることができるのだ。
さらにさらに、先ほど店にあった商品と動物の「万有引力の法則に従って、高いところから落ちる」という共通項を考えれば、それらは「もの」というオブジェクトに抽象化できる。

抽象化2
 
システムが「バナナを食べさせる」ということを行うときには、動物オブジェクトに対して行えばよく、そのバナナを食べさせる対象が人かゴリラかを意識する必要はない。
同様に、ものが高いところから落ちるシミュレーションを行うときには、それが商品なのか、ヘンテコ客なのかを考える必要はなく、ニュートンの力学式を考えればよい。高いところから落ちるヘンテコ客が可哀想ではあるが。ちょっとふざけすぎたからだね。

【今回のまとめ】
  • オブジェクトごとに固有の情報(店員IDなど)や固有の機能(ピッとできる)がある。
  • オブジェクトをまたがって共通項がある場合は、それらのオブジェクトを抽象化して考えることができる。
  • オブジェクトを抽象化することで、システムはものごとをよりシンプルに扱うことができるようになる。 
  • 飲み過ぎは良くない。


OLランキングで1位になりたい!賛同していただける方は下記をクリック!
にほんブログ村 OL日記ブログ ドジOLへ
UGC=人海戦術 vs CGC=人工アジアガラパゴスとはつまりアジアだということだ