今更ながら、OOPについて考えてみる

最近mixi経由(大多数がリアル友人)からのアクセスがめっきり落ちていて、ちょびっと悲しい気持ちです。このブログが達人スターターキットの写経シリーズに入ってから、より一層顕著になったような気が・・・><


2008-07-25 - 思っているよりもずっとずっと人生は短い。で、オブジェクト指向について話題になっていたので、復習がてら自分の言葉で表現してみることに。

オブジェクト指向プログラミングとは、オブジェクトと呼ばれる機能の部品でソフトウェアを構成させるものであり、一般的に以下の機能や特徴を活用したプログラミング技法のことをいう。

オブジェクト指向プログラミング - Wikipedia

この3つと、インスタンスの導入によって変数のスコープを拡張できることが、オブジェクト指向の特徴だと捉えています。*1

この中で「カプセル化」と「クラスの継承」は分かりやすいし、「インスタンスの導入による変数のスコープ拡張」はクラスとインスタンスという概念が分かればまぁそうだよねというものなので、(オブジェクト指向の考え方に慣れていない)第三者にもまだ説明がしやすいのです。しかし、「ポリモフィズム」については、switch文*2でやればいいことをわざわざ複雑にするだけで、意味がないよね。という話になりがちです。いや、私の説明が下手なだけかもしれませんが…orz

ポリモフィズム」について自分なりに考えているメリットをもう少し詳しく説明すると、こんな感じかなと。

  • 機能追加を行う際に、既存のコードを修正することなく拡張できる
    • いわゆる、Open-Closedの原則というやつ
  • モジュールの分割をクラス構造で明示的に表現することができる
    • 分割単位が明確なので、その分可読性や保守性が向上
    • 同様の分岐が複数箇所に散在する場合にも、(クラス構造内に表現されていれば)修正を見落とすことが少なくなる

かくいう私も、Javaの文法を覚えただけではイマイチ使いどころが分からなかったけど、デザインパターンに触れてからは考えを改めました。今では「ポリモフィズム」こそがオブジェクト指向の本質だと考えています。


せっかくなので、元記事を読んだときに感じたことも。

本章ではOOPのうち、クラスの特徴を3つにまとめます。

  1. サブルーチンと変数を「まとめる」
  2. クラスの内部だけで使う変数やサブルーチンを「隠す」
  3. 1つのクラスからインスタンスを「たくさん作る」
2008-07-25 - 思っているよりもずっとずっと人生は短い。

確かに構造化プログラミングからの流れだと、2と3の特徴が際立っているのですよね。多分、私が今の職場(ABAPということからも分かるように、バリバリの構造化プログラミング的な考え)で説明するときもここから入るでしょうし。

さらに、ポリモーフィズムが説明されます。このポリモーフィズムの説明も秀逸で、いろいろなところから呼ばれるサブルーチン、いわば共通サブルーチンは呼び出される側を共通化するものであるのに対し、ポリモーフィズムは呼び出す側を共通化するもの、すなわち「共通メインルーチン」である、とします。

2008-07-25 - 思っているよりもずっとずっと人生は短い。

「秀逸です」と書いていながら、なぜ「共通メインルーチン」だと嬉しいのかが書いていないのがもったいないような*3。機能追加する際に「共通メインルーチン」だと既に組み込まれているメインルーチンは共通だから修正する必要がなくって、新たに追加する分のコードだけ組み込めばいいからですよね。その分、影響範囲が少なくなってテスト対象も少なくなりますよと。


新しい概念は、伝え聞くだけではダメで自分でやってみないと本質が伝わらないのが本音ですが、そうまでして新しいものに移り変わりたくないという人も多いのは確かなのですよね。特に、オブジェクト指向とかxUnitとか*4は何度か導入しようとしての実感です。

この辺、自分が誘導したい方向にうまく持っていけるようなスキルも身につけていかないと…。

*1:もしかしたら、この辺はJavascriptとかのプロトタイプベースのOOPでは違うのかも。Javascriptは触ったことがほとんどないので、よく分かっていません。

*2:ABAPではcase文。最近ABAPべったりなので、いつもこの辺間違えます。

*3:もしかしたら本の中では書いていて、ブログに引用する際に削っただけかもしれませんが。

*4:もうそんなに新しくない、というより枯れてきているものかもしれませんが、自分の周りはという意味で…