この記事では「オブジェクト指向における具象と抽象」を取り上げたいと思います。オブジェクト指向を突き詰めていくと、アプリケーションを組み立てる際に重要になっていくのが、オブジェクト間のやり取りであることが、なんとなく雰囲気として伝わってきていると思います。
抽象とは何か
これまでインターフェースや抽象クラスにおける解説で「抽象」という言葉が出現してきました。この抽象とは何かを考えてみたいと思います。抽象を国語辞典で検索してみると「多くの物や事柄や具体的な概念から、それらの範囲の全部に共通な属性を抜き出し、これを一般的な概念としてとらえること」として解説されています。これはまさに「プログラミング」そのものでありませんかと思ってしまいました。
「具体的な概念から一般化する」というのをオブジェクト指向に当てはめて見ると、様々なオブジェクトから共通項や機能などを一般化していくことだと言えると思います。まさに「分類」や「コンポジション」と言えるわけです。クラス自身やクラス内部を分析していく能力ですね。
「抽象」という言葉をよりオブジェクト指向に当てはめて見ると「各オブジェクトの外部やり取りを一般書いて考える」ということかなと思っています。要するにインターフェースや抽象クラスといった「具体的な実装を持たない定義」のみでアプリケーションの動きを体現するということになります。
具象とは何か
具象とは言ってしまえば抽象の反対です。国語辞典で検索してみると「物が実際にそなえている形。」とシンプルに定義されています。要するに「実体として存在していること」であります。
抽象の世界では、あくまでも具体的な処理を持たずにメソッドやプロパティなどで動きを考えていくことですが、具象の世界では、そうした抽象の定義達に具体的な処理を吹き込んでいくことになります。「【C#】抽象クラスを定義して使用する方法」で紹介したアプリケーションで例えると抽象はReportBaseクラスであり、具象はFirstReportやSecondReportクラスになります。
抽象の世界は「オブジェクトがどうやり取りするのか」を一般化して考えることができますが、具象の世界では「で、オブジェクト自身はどうやって動いているの?」という点を埋めていく作業ということです。抽象では計算結果を返すメソッドを定義して外側のオブジェクトとのやり取りを考えますが、具象の世界では「計算結果をどうやって求めるか」に注目して細部を決めていくことになります。
オブジェクト指向との関わり
オブジェクト指向はクラスなどを駆使して、多彩に定義したオブジェクトを組み合わせてアプリケーションを構築していく手法になります。この世界では様々な事象を一般化して抽象の世界で動きを考え、具象の世界でオブジェクトの挙動を決めていくことになります。
アプリケーションとしてどのようなオブジェクトを定義する必要があり、それらがどのように関わりあっているのかを分析して定義していく抽象の世界と、オブジェクト達が実際にどんな挙動をしていくのか、どう動かさなければならないかを考える具象の世界、この二つが折り重なって生み出されていると考えられます。
実際にオブジェクト指向をマスターするのは難しいことです。抽象の世界を操れる人はそう多くはありません。多くのエンジニアは具象の世界での処理を考えるのが普通であり、それらを組み合わせることをオブジェクト指向だと思っている節もあると思います。しかしながら、それはちょっと違うので注意が必要です。
オブジェクト指向を体現するには「様々なオブジェクトの関連」を捉える抽象と、「オブジェクトの実際の動き」をとらえる具象の両方をしっかりと身に付けることが重要です。そのためオブジェクト指向は難しいのです。とはいえ少なくともオブジェクト指向で重要となる概念は身に付けておけば十分であると思っています。