いまさら聞けないJavaによるオブジェクト指向の常識:プログラマーの常識をJavaで身につける(11)(1/5 ページ)
本連載は、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象とします。Javaコアパッケージを掘り下げることにより「プログラマーの常識」を身に付けられるように話を進めていきます。今回は、Javaを学習する際によく耳にする「オブジェクト指向」について。いまさら聞けない人はぜひ読んでみてください。
いまこそ振り返る「オブジェクト指向」
今回は、オブジェクト指向プログラミングの常識について、Java言語を通じて学んでいきます。
この連載「プログラマーの常識をJavaで身につける」では、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象としています。そのため、本稿をご覧になっているJava言語やその文法を学ばれた皆さんは、「オブジェクト指向」についても、一通り学ばれてきたことと思います。
とはいえ、オブジェクト指向はなかなか習得しにくいものです。抽象的で、とても難しいものですからね。この記事を通して「オブジェクト指向とは、何なのか?」をいま一度振り返って見直してみましょう。
そもそも、オブジェクト指向って、いったい何?
私たちがJava言語やその関連技術に接していると「オブジェクト指向」という用語や、「オブジェクト指向」を含む用語をよく耳にします。でも、そもそも、オブジェクト指向とは何なのでしょう?
オブジェクト指向は、いくつかの基本概念から成り立っています。多くの書籍では、オブジェクト指向の基本概念は、以下のような用語によって説明されています(※用語については、後ほど説明します。下記リストはインデックスになっています)。
- オブジェクト(Object)
- クラス(Class)
- 汎化・特化(Generalization/Specialization)
- メッセージ・パッシング(Message Passing)
- カプセル化(Encapsulation)
- 多態性(Polymorphism)
どれも、とても抽象的で、あまり耳にしない用語も多いかもしれませんね。皆さん、おのおのを説明できますか? できない方も多いことと思います。でも、いまは分からなくてもまったく問題ありません。実のところ、比較的熟練したJavaプログラマーでも、ここで挙げた基本概念について、あまり精通していない方もいらっしゃることと思います。
さまざまなところで使われている「オブジェクト指向」
前述のように、オブジェクト指向の基本概念はとても抽象的であり、また、応用範囲も広いものです。実際、「オブジェクト指向分析・設計」「オブジェクト指向プログラミング」「オブジェクト指向プログラミング言語」など「オブジェクト指向」を含む用語がいろいろありますね。それぞれの用語について、ここで簡単に整理しておきましょう。
- オブジェクト指向分析・設計
オブジェクト指向の考え方を取り入れた分析・設計手法や開発方法論 - オブジェクト指向プログラミング
オブジェクト指向の考え方を取り入れたプログラミング手法。オブジェクト指向プログラミングでは、多くの場合オブジェクト指向プログラミング言語が使われるが、非オブジェクト指向プログラミング言語でオブジェクト指向プログラミングを行う場合もある - オブジェクト指向プログラミング言語
オブジェクト指向の考え方を、言語仕様に反映している言語。Java言語も、もちろんオブジェクト指向プログラミング言語の1つ
世間一般では、「オブジェクト指向分析・設計」「オブジェクト指向プログラミング」「オブジェクト指向プログラミング言語」のそれぞれを、省略して単に「オブジェクト指向」と呼んでいる場合があります。「オブジェクト指向」と書いてある際に、それらのどれを指しているのか、あるいは「オブジェクト指向」全般を指しているのか、注意する必要があります。
オブジェクト指向に関連する技術
「オブジェクト指向」という名称が付いていないオブジェクト指向関連技術も、これまたいろいろあります。主なものを以下に挙げます。
- UML(統一モデリング言語)
オブジェクト指向のモデルをグラフィカルに表現するための表記法。OMGという団体により標準化されている - デザインパターン
設計上、よく使われるパターンをカタログ化したもの(最初はなんのことだか分からないと思いますが、APIやクラスライブラリ、そして各種フレームワーク類を利用しているうちに、だんだん分かるようになってくると思います) - リファクタリング
ソフトウェアの外部的振る舞いを保ったまま、内部の構造を改善していく作業
編集部注
デザインパターンの具体例について詳しく知りたい読者は、Java Tipsの「クラスのインスタンスを1つに保つ(Singletonパターン)」「再帰的なデータ構造を表現する(デザインパターン活用)」「Adapterパターンを使い利用コンポーネントを切り替える」をご参照ください。
「オブジェクト指向」の神話
「オブジェクト指向」は世の中のすべての問題を解決…… しません!
このように、さまざまなジャンルに応用されているオブジェクト指向ですが、実際のところ問題解決のための1つの方法論にすぎません。私たちが扱うコンピュータ・プログラミングの世界において、「どんな課題もオブジェクト指向が解決する」なんてことはありません。むしろ、「オブジェクト指向で進めることによってデメリットの方が大きくなってしまう」なんていう場合もあります。
オブジェクト指向に限らず、方法論にはメリットとともに必ずといってよいほどデメリットがセットで付いてきます。方法論を使いこなすためには、バランス感が最も重要という場合も多いものなのです。
オブジェクト指向分析・設計をしないと、オブジェクト指向プログラミング言語で開発できない…… なんてことはありません。
良くも悪くも、オブジェクト指向分析・設計によるシステム分析・設計とオブジェクト指向プログラミング言語によるシステム開発とは、まったく分離されたものです。おのおのオブジェクト指向という手法が利用されていますが、密に連結したものではありません。
オブジェクト指向分析・設計は採用せずに、オブジェクト指向プログラミング言語を用いたシステム開発を行うことは、珍しくありません。これは、対象となるシステムにもよるものなのですが、例えば業務システムのようなジャンルでは、オブジェクト指向分析・設計は採用しない方が現時点では多数派です。不思議なことのように聞こえますが、これもプログラマーの常識です。
関係者の多くがオブジェクト指向に不慣れな状態で、オブジェクト指向分析・設計をシステム開発に導入すると、単なる手段であるべきオブジェクト指向が、いつの間にか目的にすり替わってしまう、という恐ろしい状況に陥ってしまう可能性があります。
次ページでは、Java言語を通してオブジェクト指向の基本概念を学んでいきましょう。
「オブジェクト指向」そのものはとても抽象的なものですが、Java言語に当てはめて具体化することにより、Javaによるプログラミング経験のある皆さんには理解しやすくなることと思います。
Copyright © ITmedia, Inc. All Rights Reserved.