FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

オブジェクト指向入門 第6回 ポリモーフィズム

今回テーマはポリモーフィズムです。
以前、オブジェクトとインスタンスをテーマにした時、オブジェクトに名前をつける際はオブジェクト毎ではなくインスタンス毎につけると書きましたが、その事をふまえるとポリモーフィズムを理解しやすくなると思います。

さて、ポリモーフィズム(Polymorphism)はオブジェクト指向関係の資料では「多態性」と訳されることが多いですが、元々は「多形」という意味の単語です。

多形は生物学や化学の用語で、同じ物でも異なる形態が存在することを指す用語です。

  ・石墨とダイヤモンドは、どちらも炭素より成る
  ・同じの種にオスとメスと2形態ある/同じのアリの種に女王アリ、働きアリ、兵隊アリがある

この「同じ物でも異なる形態」をプログラム的に表現するのに、継承や実装が役に立ちます。
例えば、石墨やダイヤモンドは炭素クラスの派生クラスとしたり、女王アリや働きアリや兵隊アリをアリクラスの派生クラスとすると、多形を簡単に表現できます。


今までケータイの例など「1つのオブジェクトを様々なインスタンスと扱う」ことで「1つのオブジェクトが様々な振る舞いをする」ケースを例に挙げてきました。

この性質を生かしてクラス設計すると、そのクラスは本物の携帯電話の様に非常に複雑なものになってしまいます。
複雑なプログラム設計はミスを誘発しバグの原因となるので、継承をこのように使うのは良くないといえます。


継承を有効活用してクラスを単純にするには、以下の様に視点を逆転させます。

  ・1つのオブジェクトを様々なインスタンスと扱う
    ⇒ 様々なオブジェクトを1つのインスタンスで扱う

  ・1つのオブジェクトが様々な振る舞いをする
    ⇒ 1つのインスタンスが様々な振る舞いをする

1つのインスタンスで扱うというのは、様々なオブジェクトを同じ名前で呼ぶということです。

実は、様々なオブジェクトを1つのインスタンスで扱う(1つの名前で扱う)のは日常的な行為です。
典型的な例は「今日の○○」といったものです。

  ・今日の昼飯
  ・今日のラッキーアイテム
  ・今夜の金曜ロードショー

これらは、日々違うオブジェクトをインスタンス(実例)としています。

  ・ノリ弁、カレーライス、ラーメンなど
  ・ハンカチ、ネックレス、バッグなど
  ・ターミネーター、ローマの休日、ポニョなど

そのため、1つのインスタンスを毎回同じように扱っているにもかかわらず、毎回その結果が変化するのです。

  ・今日の昼飯を食べる ⇒ あっさり味?こってり味?
  ・今日のラッキーアイテムを身に着ける ⇒ リラックスできる?運命の人に出会う?
  ・今夜の金曜ロードショーを観賞する ⇒ 興奮する?泣ける?

また、オブジェクトの種類を増やすだけで、新しい結果を生み出す事も簡単にできます。

  ・新しい料理 ⇒ 新しい味
  ・新しいアイテム ⇒ 新しい効果
  ・新しい映画 ⇒ 新しい感想

この「料理も様々/アイテムも様々/映画も様々・・・」という考え方を、オブジェクト指向ではポリモーフィズム(多形)と比喩しているのです。


プログラムの処理もポリモーフィックにする事で、多様なオブジェクトを共通的に扱える様になります。
また、オブジェクトの種類(=クラス)を増やすだけで、処理を拡張できるというメリットもあります。

つまり、ポリモーフィズムは多様性/共通性/拡張性を全て備えているのです。


前回のコンパスプログラムの変更も、1つのインスタンス用の変数に代入するオブジェクトを「コンパスオブジェクト」から「東西南北コンパスオブジェクト」変更しただけなので、一応ポリモーフィズムを活用したといえると思います。
それにより、コンパスの使い方を一切変更することなくプログラムの振る舞いを変更できたのです。

コンパスプログラムと今日の昼飯を対比させると、次のようになります。

  ・内部変数 compass
    ⇒ 今日の昼飯

  ・コンパスオブジェクトや東西南北コンパスオブジェクト
    ⇒ ノリ弁やカレーライス

  ・ボタン押下処理
    ⇒ 今日の昼飯を食べる(それが何かは関係なくただ食べる)

  ・画面に表示される方角
    ⇒ 味(ノリ弁かカレーかで違う)


実際のプログラムでも「今日の○○」の様に、多様なデータを共通的に処理したいことは多々あると思います。
それらは、例えば以下のような形でプログラムに現れてきます。

  ・共通処理(引数が「今日の○○」)
  ・配列のループ処理(配列内の各要素が「今日の○○」)
  ・キューやスタックによる順次処理(キュー/スタック内の各要素が「今日の○○」)

このような個所をポリモーフィックな構造にしておくと、プログラムは多様性/共通性/拡張性を備えたものになっていきます。

特に、これらの処理内でフラグ/列挙型/定数などによる条件分岐をしたくなった場合は、ポリモーフィズムの適用を考えた方が良いです。
この辺りを次回書いてみたいと思います。


最後に、もう1つ重要なポイントがあります。

ポリモーフィズムは拡張性を豊かな構造にもかかわらず、ポリモーフィックにした方が良い場所は上記のように探せば、将来の変更を予測しなくても見つかるという事です。
つまり、今できる事に集中すると、自然と将来的な拡張性も確保できるのです。


■まとめ
  ・様々なオブジェクトを1つのインスタンスで扱う
  ・ポリモーフィズムは多様性/共通性/拡張性を兼ね備えている
  ・現状を分析して、自然と将来的な拡張性も確保する


次回は、新しいサンプルプログラムで、ポリモーフィズムの具体例を書いてみたいと思います。
スポンサーサイト

テーマ : ソフトウェア開発
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

プロフィール

きっぽ

Author:きっぽ

カテゴリ
最新記事
最新コメント
最新トラックバック
月別アーカイブ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。