なぜ抽象メソッドを使うのかとその本質 ~ポリモーフィズムの保証~

スポンサーリンク

対象読者

  • 実装のない抽象メソッドを使う意味が分からない方

結論

  • 抽象メソッドは責務(役割)を表現する

根拠

抽象メソッドを使う意味が分からなかった

私はオブジェクト指向初学者の頃、抽象メソッドを使う意味が分からなかった。実装のない抽象メソッドを継承しても動作しないし、結局、具象クラスでその抽象メソッドを実装しなければならない。

抽象クラスなんて用意せずに、それぞれの具象クラスで同じ名前、同じインターフェイスのメソッドを実装すれば同じことやんけ。そう思ってた時期が私にもありました、はい。

しかし、今では抽象メソッドをよく使うようになった。オブジェクト指向に対する理解が、私に変化をもたらした。以下にその理解について述べる。

責務は手続きよりも変更されにくい

プログラミングの要諦は、変更されやすい部分とされにくい部分を分けることにより、変更を容易にすることだ。責務(ある役割を全うする義務)は変更されにくい。

プログラムの目的を達成するための手段にはバリエーションがあり、変更され易い。しかし、その目的を達成するための役割については変更が少ない。

例えば、事務作業はIT化が進んでいっても残り続ける作業だろう。しかし、その作業は自動化されつつある。ヒトによる手動の作業から、ソフトウェアによる処理に置き換わりつつある。この場合、具体的な手続きは変化しているが、事務という役割は不変である。

このように、具体的な手続きよりも高次なものが責務なのだ。責務をプログラムの設計の中心に据えることで、より変更に強いプログラミングが実現できる(責務駆動開発)。

制約によるプログラミングの進化

制約を設けることにより、プログラミングは進化してきた。以下に例を列挙する。

  • 定数は変数の更新を禁止することにより、より安全にプログラミングを行えるようにする。
  • gotoレスプログラミングはgoto文を禁止し、構造化文によりプログラムを表現することで可読性に優れたプログラミングを実現する。
  • 関数型プログラミングは副作用を禁止することにより、バグを排除しやすくする。

抽象メソッドによる制約は、サブクラスのメソッドのインターフェイスを固定することである。この制約により、そのサブクラスを使用する際、振舞いが予測できるため、安心して仕事を依頼することができる(ポリモーフィズム)。

抽象メソッドによる制約は責務を表現する

クラスの責務は振舞い(メソッド)によって達成される。料理をしない料理人なんていない。デュエルしない者はデュエリストではない。クラスが何者なのかは行動(メソッド)によって規定できる。

抽象クラス(抽象メソッドを持つクラス)はサブクラスに抽象メソッドの実装を強制することにより、サブクラスに確実に責務を負わせる。こうしてエセデュエリストが存在する可能性をなくすことができる。

抽象クラスを使わずに、クラス名(○○Visualizerとか)によっても、責務を表現することはできる。それぞれのVisaulizerに共通のインターフェイスを持つメソッド(visualize)を実装することでも、抽象メソッドを実装した場合と同じことができる。

しかし、名前によって責務を表現しただけでは、本当に責務を果たすようなメソッドを持っているかは保証できない。プログラマの判断に依存してしまうからだ。抽象メソッドを使えば、プログラムの制約によって、確実にクラスに責務を負わせることができる。visualizeしてくれないVisualizerは存在する余地がなくなる。これが結論で書いた「抽象メソッドは責務(役割)を表現する」の趣旨だ。

ポリモーフィズム(多態性)とは

ポリモーフィズムは、サブクラスのカプセル化である。同じインターフェイスのメソッドを持つサブクラスならば、どれでも同様に動作させることができる。ポリモーフィズムを実現したクラス群に対しては、どのサブクラスなのか具体的に知る必要はない。故に、制御プログラムの変更なしに、サブクラスを置き換えることができる。

現実世界から見るポリモーフィズムの例

レストランの責務は、顧客に料理を提供することだ。具体的な料理や調理方法は変更されやすいが、料理を提供するという点は変更はない。

料理を提供する責務を持つ抽象クラス(料理人)には,「料理を作る」、という抽象メソッドをとりあえず持たせておく。このメソッドは、材料を引数として渡すと、料理を返すというインターフェイスを持つとする。

具体的な料理人はプロの場合もあるし、業界未経験のアルバイトかもしれない。その調理方法(実装)は超絶テクニックによる調理かもしれないし、レンジでチンかもしれない。

抽象クラス(料理人)を継承しているならば、具体的な方法は分からないが、必ず料理を作ることが保証される(ポリモーフィズム)。

参考

  1. オブジェクト指向のこころ[アラン・シャロウェイ]
  2. コーディングを支える技術[西尾 泰和]
  3. オブジェクト指向でなぜつくるのか[平澤 章]

コメント

タイトルとURLをコピーしました