Ruby、Java、PHP、Python、JavaScript などなど、多くのプログラミング言語には「オブジェクト指向」の考え方が採用されています。
ここではオブジェクト指向とは何か? また、オブジェクト指向の言語で用いられるクラス・メソッド・インスタンスの意味を図解します。
目次
オブジェクト指向とは?
オブジェクト指向は、プログラムを設計するときの考え方のひとつ。
プロパティとメソッドをひとまとめにしてクラスを作り、それを元にオブジェクト(インスタンス)を作成する手法です。
これだけでは難しいと思うので、以下から さらに詳しく解説していきます。
オブジェクト指向という考え方自体は、ルールのように明確に定められているわけではありません。プログラムを設計するときのベースとなる考え方として覚えておくと良いでしょう。
オブジェクト指向の用語と使い方
ここからは、オブジェクト指向で出てくる用語と、自動車を例にあげながら使い方を解説していきます。
クラスとは?
クラスは、オブジェクトを作成するための設計図です。
自動車を例に考えてみると、自動車を作る元となる設計図にあたります。
クラスの中は、「プロパティ」と「メソッド」(詳しくは後述します)で構成します。
イメージをつかむために、実際に Ruby のプログラムで表してみます。
以下は「Car」というクラスを作成した例です。class ○○○
と end
の間に、クラスに含めたいプロパティやメソッドを書いていきます。
class Car
# ここにプロパティやメソッドを書いていく
end
プログラム上での詳しいクラスの使い方はこちら。
プロパティとは?
プロパティは、オブジェクト(後述します)が持つ性質や属性のことです。
自動車を例に例えてみると、メーカーや色、ガソリン量や走行距離などにあたります。
イメージをつかむために、実際に Ruby のプログラムで表してみます。
プログラム上では、クラスの中にプロパティの変数をあらかじめ設けておきます。
以下では「Car」というクラスの中に、プロパティとして、gasoline
(残りの燃料で走行できる距離)と mileage
(走行距離)を設けてみました。
class Car
def initialize(gasoline, mileage)
@gasoline = gasoline # 残りの燃料で走行できる距離
@mileage = mileage # 今までの走行距離
end
end
プログラム上での詳しい書き方はこちら。
メソッドとは?
メソッドは、オブジェクト(後述します)内のデータを操作するためのふるまいをまとめたものです。
自動車を例に考えてみると、「走る」や「ガソリンを入れる」といったものにあたります。
イメージをつかむために、実際に Ruby のプログラムで表してみます。
プログラム上では、クラスの中にメソッドをあらかじめ設けておきます。
以下では「Car」というクラスの中に、メソッドとして、run
(走る動作)と refuel
(給油する動作)を追加してみました。
メソッドの中では、動作に応じて gasoline
(残りの燃料で走行できる距離)や mileage
(走行距離)の値を操作しています。
class Car
def initialize(gasoline, mileage)
@gasoline = gasoline # 残りの燃料で走行できる距離
@mileage = mileage # 今までの走行距離
end
def run(distance)
@gasoline -= distance
@mileage += distance
end
def refuel(gasoline)
@gasoline += gasoline
end
end
プログラム上での詳しいメソッドの使い方はこちら。
オブジェクト(インスタンス)とは?
オブジェクト(インスタンス)は、設計図であるクラスから作成した実体を表します。ひとつのクラスをもとに、複数のオブジェクトを作成することができます。
自動車を例に考えてみると、設計図であるクラスから作成した「青いトヨタの車」「赤いホンダの車」などの実物を指します。
オブジェクトを作成するときに、例えばクラスで定義してあった「メーカー」プロパティに「トヨタ」、「色」プロパティに「青」を入れることで、クラスから「青いトヨタの車」のオブジェクトを作成することができるというイメージ。
このように、クラスの中であらかじめ設計してあった「プロパティ」や「メソッド」は、オブジェクト(インスタンス)を作成することによって活きてきます。
イメージをつかむために、実際に Ruby のプログラムで表してみます。
「Car」クラスからインスタンスを作成するときは、Car.new
のようにします。それを「car1」と「car2」の変数に代入しています。これでひとつのクラスから複数のオブジェクトを作成できたことになります。
class Car
# ここにプロパティやメソッドを書いていく
end
car1 = Car.new
car2 = Car.new
プログラム上での詳しいオブジェクト(インスタンス)の使い方はこちら。
クラス・プロパティ・メソッド・オブジェクト(インスタンス)の関係まとめ
ここまでで説明してきたオブジェクト指向に関する要素を まとめて図にすると、以下のようになります。
具体的にコードを書いていないと完全に理解するのは難しいですが、イメージをつかんでおきましょう。
オブジェクト指向のメリット
多くのプログラミング言語でオブジェクト指向の考え方が採用されているのには、以下のようなメリットがあるからです。
- プログラムの変更に柔軟に対応できる。
- 同様の機能はコードが使い回せるので、コードの記述量が減り、開発工数が削減できる。
- 改修時の影響範囲が限定され、不用意なバグが減らせる。
- 大規模な開発において、複数人で分担して開発しやすい。
具体的に自動車の燃料タンクを2倍にする変更を行うとしましょう。
プログラム上では「Car」クラスから「青いトヨタの車」と「赤いホンダの車」の2つのオブジェクトを作成したとします。
このとき、通常であればプログラム上で「青いトヨタの車」か「赤いホンダの車」が出てきているコードを探して、ひとつずつコードを修正していく必要があります。オブジェクト指向で開発をしていれば、元となる「Car」クラスの燃料タンクのコードを修正するだけで、「Car」クラスから作成された「青いトヨタの車」と「赤いホンダの車」オブジェクトの仕様がまとめて変更できます。
また、「Car」クラスさえあれば、その中の詳しいコードを知らなくても誰でも簡単に自動車のオブジェクトを作成することができます。これによって複数人で分担して開発にあたることができるようになります。
そして、不用意に「Car」クラスをいじらない限り、他の車のオブジェクトに影響が出ないので、修正の影響範囲を限定することができ、開発時の予期しないバグを防ぐことができるようになります。
小さなプログラムであれば問題ありませんが、商用で大規模なプログラムになると、コードをすべて追いきれなくなったり、複数人で開発することがあったり、開発に時間がかかったりします。オブジェクト思考の言語を取り入れることで、それらをカバーし、安全かつ安心、そして便利に開発を進めやすくなるということです。
その分 デメリットとしては、プログラム設計時により高いスキルを要することや、設計に時間がかかる、ということが挙げられます。
オブジェクト指向の特徴
ここからはさらに理解を深めたい方向け。
オブジェクト指向の特徴として、よく挙げられる原則を1つずつ解説していきます。
カプセル化
機能をひとまとまりにし、直接 使われない処理を隠してカンタンに使えるようにすることを「カプセル化」と言います。
自動車を例に考えてみましょう。アクセルを踏んだときに車体の中で起こっているしくみは見えないようになっていますね。しかし内部の処理は理解していなくても、「アクセルを踏めば進む」という使い方さえ知っておけば、誰でもカンタンに車を操作できます。
プログラム上でも同じように、対象物を操作するために必要な情報だけを外部から見えるようにして、残りをカプセルに包んで内部の処理を隠してしまうことをカプセル化と言います。
こうしておくことで、誰でもカンタンにその機能を使えるようにできるだけでなく、カプセルの内部にあるデータを勝手に書き換えたり参照できないようにして、他のプログラムから干渉できないようにすることができます。
継承
上位の機能を引き継いで使うことを「継承」と言います。
自動車を例に考えてみましょう。自動車の設計図を引き継いで、「赤いトラック」や「青いダンプカー」を作るイメージです。
アクセルやブレーキ、ミラー、ハンドルといった機能はすべての自動車において共通です。そのような共通化できる機能を設計図に記録しておき、それを引き継いで さまざまな種類の車を作成する、という考え方になります。
これで似たようなコードをひとまとめにすることができたり、一度作成したコードを再利用できるようになったりします。結果的にコード量が減って冗長しないようにすることができます。
ポリモーフィズム
複数のいろんな種類の対象物に対して同じメッセージを送れば、同じ目的の挙動が行われるようにすることをポリモーフィズムと言います。
自動車を例に考えてみると、トラックとダンプカー それぞれに対して「クラクションを押す」という動作を与えたとします。そうするとメーカーによって音は違いますが、「大きな音が鳴る」という目的は同じです。
このようにどのような種類の車であっても「クラクションを押す」と「大きな音が鳴る」ということを決めておくことで、使う側は同一のルールでさまざまな対象物を利用することができるようになるというわけです。
具体的なプログラム上の話で言うと、複数のクラスで同じ名前のメソッドを使えるようにしておくことです。どのクラスであっても同じ名前のメソッドを呼び出せば、処理は違えど同じ目的の動作が行われるようになっているイメージになります。
まとめ
以上、オブジェクト指向とは何か? という解説でした!
ここまでの内容をまとめておきます。
- 「オブジェクト指向」は、プログラムを設計するときの考え方のひとつで、「プロパティ」と「メソッド」をひとまとめにして「クラス」を作り、それを元に「オブジェクト」を作成する手法。
- 「クラス」は、オブジェクトを作成するための設計図。
- 「プロパティ」は、オブジェクトが持つ性質や属性のこと。プログラム上では、クラスの中にプロパティの変数をあらかじめ設けておく。
- 「メソッド」は、オブジェクト内のデータを操作するためのふるまいをまとめたもの。プログラム上では、クラスの中にメソッドをあらかじめ設けておく。
- 「オブジェクト(インスタンス)」は、設計図であるクラスから作成した実体。ひとつのクラスをもとに、複数のオブジェクトを作成できる。
- オブジェクト指向を取り入れることで、プログラムが整理されて 冗長なコードがなくなるので、開発工数が削減できたり、複数人で開発するときに分担しやすくなったり、予期しないバグを防ぐことができる。