オブジェクト指向とは?初心者でも解る主な特徴や手法を紹介
最近、主流となっているプログラミング言語は多くがオブジェクト指向型言語となっています。
Java
c#
ruby
Python
PHP
なかなかマスターするのが難しいと言われているオブジェクト指向とはどのような考え方なのか
オブジェクト指向についてまとめてみました。
オブジェクト指向とは?
オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方である
wikipediaより抜粋
プログラムコードの一つ一つをオブジェクト(部品)として捉え、各オブジェクトの振る舞いを定義し、それらを組み合わせる事で1つの大きなシステムを構築していく手法の事です。
オブジェクト指向のメリット
オブジェクト思考には以下のようなメリットがあります。
プログラムのメンテナンスがしやすくなる
プログラムの一つ一つを小さなまとまりで考える事が出来る為、複雑なプログラムが減ります。
改修による影響度が減り、メンテナンスがしやすくなります。
分業化ができる
システムの規模が大きくなる程、プログラムの実装は膨大になります。大人数で開発作業を並列で行う事が出来ます。処理内容を細かく分類したり他の機能と似通った機能を共通化したり誰かが作った機能を使って、影響を与えずにカスタマイズしたりという事が実現出来る為、開発の生産性が高まります。
カスタマイズがしやすい
オブジェクト指向型プログラムの特徴である、「継承」や「ポリモフィズム」という考え方を使う事で、既存機能の処理を引き継ぐ事が出来ます。
プログラムの品質が向上する
プログラムのいたるところが部品化されている為、不具合が発生した場合の問題箇所特定が速くなります。
また、まとまりのあるプログラム仕様の為、コードの可読性が向上します。
オブジェクト指向のデメリット
オブジェクト思考には良い事ばかりではありません。
難易度が高く教育コストが掛かる
オブジェクト指向を理解し、開発の現場で活用する為には、付け焼き刃の知識ではとても役に立ちません。
抽象的な概念が多く、理解する為には理論の他に実践経験が数多く必要になります。
また教える側にとっても、どのように教えたら理解してもらえるのか考える事がとても難しく教育には大変時間が掛かります。
設計能力が問われる
オブジェクト指向型プログラムの設計を行う場合
「他の機能との影響度は?」
「将来的な再利用性・拡張性は?」
「もっと共通化できないか」
といった目線で常に設計が出来る必要があります
またプログラムを「オブジェクト」という1つの部品としてイメージする能力も必要になってくる為、小規模なプログラムや手続き型のプログラムを作っていた人にとって、オブジェクト指向のメリットを活かした設計は難しくなります。
オブジェクト指向を実現する3つの性質
オブジェクト指向を実現する為には大きく3つの性質を理解する必要があります。
独立性(クラス化)
独立性とは、外部のオブジェクトのデータを参照せず、自分自身の処理で完結している事です。
独立性が高いプログラムの場合、プログラムを変更しても、他のプログラムに与える影響が少なくなります。
そして外部の依存度を無くし、独立性が高い変数や振る舞いをまとめる事を、クラス化と言います。
再利用性
再利用とは、プログラムの一部または全部を別のプログラムで利用することです。
同じような処理は出来る限り使い回す。
開発の現場では、過去に作られたコードを参考にして、既存のプログラムからコードを一部または全部抜き出して新しいプログラムにコピーすることがあります。
開発工数を削減する為にこのような方法は、開発現場でも良く使われますが、コピー・アンド・ペーストによるプログラミングを多用すると、後で似たような重複コードが乱立し、管理が煩雑になります。
オブジェクト指向プログラムでは、そもそもが部品化を前提として設計・実装される事が多く、再利用が大変しやすくなります。
拡張性
後述する、「継承」や「ポリモフィズム」などの手法を活用する事で、既存機能を拡張した独自クラスを作る事ができます。
「他の機能に対して、別の機能を付加したい」
「元の機能には影響を与えたくない」
といった悩みも、拡張する事でが高いプログラムの場合は実現が可能です。
オブジェクト指向プログラムでは、「継承」をうまく活用する事で、既存機能に影響を与えずサブクラスの拡張ができます。
オブジェクト指向型プログラミングを実現する主な手法
カプセル化
カプセル化とは、データ構造の内部の情報を外部から直接参照できないようにし、代わりにデータ操作のためのインターフェースを外部に提供する事です。
テレビの内部の仕組みを理解していなくても、
「テレビのリモコンの電源を入れると、テレビが付く」
「番号を押すとチャンネルが切り替わる」
という、入力と出力結果さえ把握していれば、テレビを使いこなす事ができますよね。
オブジェクトを使用する側は、内部の細かい処理を理解しなくても、使い方さえ理解していれば、誰でも利用出来るため、開発効率を上げる事が可能になります。
継承
クラスの様々な機能を引き継ぐことができます。
継承元をスーパークラス(親クラス)と呼び、継承先をサブクラス(子クラス)と呼びます。
継承後、サブクラスではスーパークラスのメソッドや変数を使えるようになります。
また、サブクラス独自の処理を追加する事や、スーパークラスのメソッドの内容をカスタマイズする事もできます。
ポリモーフィズム
「継承」と合わせて活用されます。
「継承」されたサブクラスの振る舞いをサブクラス毎に変える事ができます。
ポリモーフィズムの仕組みを活用する事で、同じ振る舞いをする部分は共通化し、違う振る舞いにしたい部分を目的に合わせて変更する事ができます。
まとめ
今回は、オブジェクト指向についての概略を説明しました。
理論だけでオブジェクト指向を理解する事はとても難しいですが、実践を通して理解をしていきましょう。
ヴァックスラボではSE・プログラマを募集中です
私たちと一緒に価値を提供していく新しい仲間を募集します。
[spheader position="center"]
[/spheader]