本稿ではオブジェクト指向とはなにか、理解を深めていただくために具体例を交えて解説していきます。
記事の対象者
- オブジェクト指向をこれから学ぶ方
- オブジェクト指向の理解がふんわりしている方
所要時間
5 分程
そもそもオブジェクト指向とは?
オブジェクト指向とは、簡単に言えば、プログラミングする上での「こうするとチーム開発もしやすいし後からの変更も楽だよね」といったプログラミングに関する思想、概念の総称です。
思想なので明確な答えはありませんが、エンジニア業界ではざっくりとした共通認識が概念として存在します。
▼オブジェクト指向について詳しく知りたい方はこちら
オブジェクト指向とは|例えを交えて【徹底解説】
オブジェクト指向の実装具体例
ここからは具体例を交えて見ていきましょう。
サンプルは PHP で書いています。
※ import や package の定義は省略
今回は「商品の消費税込みの金額を表示する」といった実装をすると仮定して進めます。
実装における「 非オブジェクト指向となる例 」と「 オブジェクト指向が適用された例 」を紹介します。
非オブジェクト指向の場合
class Main {
function index() {
$itemPrice = 100; // 商品の金額
$taxPrice = $itemPrice * 1.1; // 消費税計算
echo $taxPrice;
}
}
$main = new Main();
$main->index();
オブジェクト指向の場合
define( "CONSUMPTION_TAX" , 1.1 );
class PriceComponent {
public static function getPriceConsumptionTax( $price=0 ) {
return $price * CONSUMPTION_TAX;
}
}
class Main {
function index() {
$itemPrice = 100; // 商品の金額
$taxPrice = PriceComponent::getPriceConsumptionTax( $itemPrice ); // 消費税計算
echo $taxPrice;
}
}
$main = new Main();
$main->index();
違いは分かりましたでしょうか。
なぜこれでオブジェクト指向になるのかを説明していきます。
オブジェクト指向の基本
オブジェクト指向は以下の条件を満たしていることが前提です。
- 内容を理解せずとも処理を使用できること
- 汎用的処理は独立した処理となっていること
- 他 class と相互不干渉であること
- 根底からの変更が容易であること
これらの要素から見ると先ほどの例は以下の問題点を有します。
- 消費税計算が main クラスの専用処理となっており、汎用性が無い。
- 消費税の変更に対応できない。
次項から、このような問題点がどのように改善されたのかを説明していきます。
問題点の解決
消費税計算が main クラスの専用処理となっており、汎用性が無い
この問題の解決するため、消費税の計算処理をお金に関する処理を行う Component として独立させています。
こうすることで今後共同開発者が増えた場合もお金に関する処理は PriceComponent に書き、既に存在する処理があればそれを使用する といった認識を植え付けることができます。
また、メソッドや class の役割が明確になったことで、内容を理解せずとも処理を使用することが可能になっています。
※ ↓↓↓ 先ほどの例と同じものを表示しています。
class PriceComponent {
public static function getPriceConsumptionTax( $price=0 ) {
return $price * CONSUMPTION_TAX;
}
}
消費税の変更に対応できない
非オブジェクト指向の例では消費税の倍率が直接処理部分に書かれていました。
1度しか消費税計算をしないならこれでも良いかもしれませんが、そのようなことはまずないでしょう。
そのため処理の根底に関わるような数値は定数として定義しておくことで後から見た時や新規に担当者がきた場合も対応がしやすくなります。
根底からの変更が容易であること に触れた内容となります。
※ ↓↓↓ 先ほどの例と同じものを表示しています。
define( "CONSUMPTION_TAX" , 1.1 );
まとめ
ここまで、具体例を挙げてオブジェクト指向とは何か解説してきましたがいかがでしたか?
このようにオブジェクト指向は複雑な話ではありません。
大切なのはいかに独立した処理にできるか、汎用的にできるか、処理内容を理解しないで使えるメソッドにするかです。
Main クラスにだらだらと処理を書いてしまったり、汎用的にできる処理なのに固有処理にしてしまったり、というようなミスをしないよう意識して開発していきたいですね。