menu
ホーム > PHPの文法 > 11 クラスとオブジェクト > PHP オブジェクト指向プログラミング(OOP)とは!
UPDATE:2017年12月11日

PHP オブジェクト指向プログラミング(OOP)とは!

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

PHP オブジェクト指向プログラミング(OOP)とは!

  • オブジェクト指向とは考え方であり概念のこと
  • オブジェクト指向プログラミングとは、オブジェクト指向の概念を基に設計・記述する手法

オブジェクト指向とは、「概念」であり一つの考え方です。そして、この概念に基づいたプログラミング手法のことをオブジェクト指向プログラミング(OOP:Object-Oriented programming)と言います。OOP に明確な答えはありません。それぞれのエンジニアやプログラマーが各々の考えや定義を持っています。初めから完璧に理解するようなものではなく、知識の蓄積と共に OOP に対する考え方も変化するでしょう。

最初はおおざっぱに把握してみる。

初心者の方はまずオブジェクト指向やオブジェクト指向プログラミングの基本を覚え、なんとなく大ざっぱに把握してみましょう。その上で、OOP の概念を成長させ、自分なりに定義を定着させていきましょう!

OOP に基づいた アプリケーションソフトウェア は非常に保守性が高く、修正・変更・拡張・再利用 などが容易に行えるようになり、全体設計もシンプルにデザインできます。

オブジェクト は モノ

オブジェクト指向プログラミングでは、プログラムコードを オブジェクト = モノ と考えます。例えば、モノをDVDプレイヤーとしましょう。DVDプレイヤーは機械に詳しくない普通の人でもコントローラーで操作が出来ます。車などもアクセスで加速、ブレーキで減速と容易制御できます。操作するのに中の仕組みを知る必要はありません。「モノ を作り モノ を操作する」これがオブジェクト指向の基本的な概念です。大切なことは、最初に モノ の定義を作ってしまい、その中の仕組みを知らなくても モノ を簡単に操作出来るようにすることです。

モノ があれば作業が楽になる

最初から モノ を定義して作ってしまえば、プログラミング作業を モノ に集約することが出来ます。機能の変更や追加も モノ に修正を加えれば良いのです。

OOP は複数人数による大規模開発でも力を発揮する

モノ を用意しておけば、複数人数で開発するのにも便利です。モノ は中身を知らなくても「簡単に操作できる」ようにする。「再生ボタンで再生」、「停止ボタンで停止」、「アクセスで加速」、「ブレーキで減速」するという操作方法さえ知っていれば複数人数での利用も容易です。モノ の中身や仕組みは作成者さえ知っていれば良いのです。手続き型プログラムであれば、他のプログラマーも中身を理解する必要があり、操作するのにプログラムを壊してしまう可能性もあります。

モノ は再利用可能にする

モノ は再利用可能なものにします。例えばBlu-rayプレイヤーを新たに登場させる場合、DVDプレイヤーの基本機能は再利用することです。光学ドライブにBlu-rayディスクの再生機能を追加し、既存の機能を再利用してコードの不要なコピー&ペースを防ぐのもオブジェクト指向の大切な考え方です。

モジュール性を考える

オブジェクト指向プログラミングの重要な要素の一つがモジュール性の概念を持たせることです。

モジュール化とは、一つの複雑なシステムを、相互依存の強い部品同士で構成するのではなく、交換可能な独立した機能を持つ部品同士で構成しようとすることです。交換可能な独立システムで構成させます。複雑な対象であっても、各部分に分割すれば単純化し易く、計算も用意になる、このような考えは分割統治として工学分野で一般的に受け入れられている計算原理です。

パソコンなどはその恩恵で大きく発展しました。IBMが1980年代にパソコンの設計仕様を公開し、その仕様の規格に適合したハードウェアであれば中身はブラックボックスとして扱うことにしました。この開発体制によって、世界中のメーカーがモジュールの性能を競うことになり、パソコンの性能が大きく躍進することになりました。



オブジェクトを考える

  • オブジェクトはデータと処理コードが一つにまとまったもの

OOP では、[データ自身]とデータを取り扱う[処理コード]をまとめて扱うことで、データとコードが一つになっています。これが オブジェクト です。そしてこの集まりは無秩序ではなくテーマがありグループ化されています。
ブログシステムを考えてみましょう。ユーザー、投稿記事、コメント、などをオブジェクトとして考えます。オブジェクトはデータと処理コードが一つにまとまったものです。手続き型プログラミングでは、ユーザー情報をデータベースなどの構造体で管理し、その構造体を処理する関数(新規登録、更新、取得、削除など)を作成します。データと処理コードがあることには変わりませんが、OOP ではデータと処理コードを一つのまとまりとして扱います。

ユーザーオブジェクトでは、ユーザー名、ユーザーID、パスワードなどユーザー個々のデータがあり、ユーザー情報の新規追加、更新、取得、削除、などの処理系コードがあります。

投稿記事オブジェクトは、投稿された記事内容、投稿日、投稿したユーザー名などの各記事固有データ、記事を新規に投稿する、既存の記事内容を取得するなどの処理コードを持っています。

コメントオブジェクトでは、コメントタイトル、コメント内容、コメント日、コメントユーザー、など各コメントの固有データ、コメントを投稿する、既存コメントに返信する、コメントを削除する、などの処理コードを持っています。

ここで重要なのは、新規に記事を投稿するコードをユーザーオブジェクトに持たせることも可能です。必要な処理を各オブジェクトにどのように分割するかは、設計や考え方によって変わってきます。どれが正解というわけではありません。例えばSQL関連をまとめたクラスを作成する場合もあるでしょう。重要なのは、アプリケーションの各部分を部品化して再利用可能なものにして、モジュール性を高めることです。

オブジェクト指向プログラミングの用語

クラス(class)

クラス は オブジェクト を作成する際の設計書となる雛形のことです。どのようなデータを持ち、どのような関数を使用するのか決められています。オブジェクト の プロパティ や メソッド を一まとめにして保持しています。

オブジェクト(object)

オブジェクト は、クラス を実体化させた モノ です。プログラム上では データ と 処理コード の集合体です。固有のデータがあり、データに対して行う処理コードを持っています。
オブジェクト と クラス の関係は 値 と データ型 の関係に似ているといわれます。文字列型は1つですが、文字列は無数にあります。ユーザークラスはプログラム内で1度定義して終わりですが、ユーザーオブジェクトは必要な分だけ作成することが出来ます。

プロパティ(property)

オブジェクトに関連付いたデータを プロパティ と言います。Blu-ray/DVDプレイヤーに例えると、「メーカー」「色」「サイズ」などのプロパティを持っていると言えます。データ、状態、変数ともいわれます。「現在の再生時間」などは状態を示すプロパティと言えます。

メソッド(method)

オブジェクトに関連付いた関数を メソッド(操作) と言います。Blu-ray/DVDプレイヤーで言えば「再生」「停止」「コピー」「録画」などの処理です。メソッド はオブジェクト自身に対する操作、振る舞い、を行う関数のことです。

インスタンス(instance)

設計図となる クラス から作成した オブジェクト を利用するために生成されたものを インスタンス と言います。インスタンス は 実体 実例 という意味で、クラス から実体化したもののことです。クラス から オブジェクト を生成するのを インスタンス化 と言います。

カプセル化(encapsulation)

カプセル化 は OOP の3第原則の1つと言われています。少し詳しく説明します。そもそもカプセルとは、中に何かを入れて密閉する容器のことです。では OOP における カプセル化 とはどのようなことでしょうか。オブジェクト の構造をカプセル状にすることです。カプセルの中に入れることで中が見えなくなります。これを 隠蔽 と言います。では何を 隠蔽 するのでしょうか。その クラス の オブジェクト が持つ データ(プロパティ) や 処理コード(メソッド) です。これらを利用する場合、外部から操作するための処理(メソッド)を別途作ります。この利用するための メソッド は インターフェース となり、クラス自身で提供します。 インターフェース を通してデータや処理コードにアクセスさせるようにする構造がカプセル化です。

カプセル化することで、オブジェクト のデータ構造を外部から直接操作する必要がなくなります。クラス内部のコードを修正変更しても、外部とのインターフェースさえ同じにしておけば、オブジェクトを利用しているその他のコードを修正する必要がなくなり、メンテナンス性が向上します。

継承(inheritance)

OOP の3第原則の2つ目 継承。新規クラス を作成する際に、既存クラス のメソッドやプロパティを引き継いで新しい プロパティ や メソッド を追加/変更 などが出来ます。これを継承と言います。

  • 既存クラス:スーパークラス、親クラス、基底クラス と言います。
  • 新規クラス:サブクラス、派生クラス と言います。

コードの無駄なコピー&ペーストを使用しないで基底クラスの機能を再利用します。そうすることで、不要なコードの作成やそれに伴う手間を省きます。
親クラスの変更は派生クラスにも反映されます。

ポリフォーリズム(polymorphism)

OOP の3第原則の3つ目 ポリフォーリズム。例えば、Blu-ray/DVDプレイヤー、録音機器、ポータブル音楽プレイヤーなどの家電のリモコンの「再生ボタン」があるとします。大よそこのボタンの機能は「再生する」ということで予測できるでしょう。内部動作は機器によって異なりますが。車のアクセルやブレーキなどにも似たようなことが言えます。
プログラムでも同じ処理名で多様な機能が動作すると便利です。この利点は OOP の基本性質となります。
ポリフォーリズム は、同一のメソッド(同じ処理名)で インスタンス によって異なる処理が実行できる性質のことです。クラス利用者が一見 スーパークラス をコールしているようで実際は異なる クラス を使っているなどで、共通の メソッド で インスタンス によって機能を変化させることです。この性質を持たない場合、 サブクラス の インスタンス を別々に生成することになってしまうなどの弊害が発生します。

polymorphism の意味は、多型、多形性、多型性、遺伝子多型、結晶多形 などがあります。OOP の場合、「多相性」、「多様性」の意味として使用されています。


タグ(=記事関連ワード)

日付

公開日:2017年12月10日
最終更新日:2017年12月11日

関連記事

配列関数サンプル

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

http://wepicks.net/phpref-oop-intro/trackback/

page top