アクセス修飾子
アクセス修飾子とはメソッドや変数のアクセスできる範囲を指定するもので、以下が存在します。
| アクセス修飾子 | 同一クラス | サブクラス | すべて |
|---|---|---|---|
| public | 〇 | 〇 | 〇 |
| protected | 〇 | 〇 | × |
| private | 〇 | × | × |
私自身そうだったのですが、プログラムに触れて間もない頃はわざわざprotectedやprivateでアクセス権限を弱める理由が分からずとりあえず全部publicで書きがちだと思います。なので、今一度使い分けを整理していきます。
私が思うにアクセス修飾子の使い分けの観点は以下です。それぞれ説明していきます。
①外部に公開する情報を制限する。
②イミュータブルなオブジェクトを作るため。(今回割愛)
③継承の原則を守るため。
外部に公開する情報を制限する。
呼び出し側と呼び出される側という関係を意識して、呼び出される側は呼び出し側に必要な情報のみを公開し、不必要な情報は隠蔽する。所謂カプセル化です。
割引コードを扱うオブジェクトで考えた時、以下のようなビジネスロジックが考えられます。
・入力された割引コードが存在する割引コードか
・割引コードが利用期間の範囲内か
・商品の値段によって割引率(額)を変更する
・割引額を計算する
・割引率(額)を元に最終的な決済金額を求める
サンプルコード
<?php
class CouponCode {
private $coupon_code;
private $discount_rate;
private $discount_fixed_amount;
public function __construct(string $coupon_code) {
$this->check_exist_coupon_code($coupon_code);
$this->check_usage_period($coupon_code);
$this->coupon_code = $coupon_code;
}
private function check_exist_coupon_code(string $coupon_code) {
//存在チェック
}
private function check_usage_period(string $coupon_code) {
//利用期間チェック
}
/**
* 割引額取得
*
* @param PaymentItem $payment_item
* @return integer
*/
public function get_discount_amount(PaymentItem $payment_item): int {
$this->set_discount($payment_item);
return $this->discount_fixed_amount + $this->get_discount_amount_for_rate($payment_item);
}
private function set_discount(PaymentItem $payment_item) {
//割引コード、商品の値段から割引率(額)取得
$this->discount_rate = $discount_rate;
$this->discount_fixed_amount = $discount_amount;
}
private function get_discount_amount_for_rate(PaymentItem $payment_item): int {
return $payment_item->get_item_amount * (1 - $this->discount_rate);
}
/**
* 決済金額取得(戻り値プリミティブ型なのほんとは良くない)
*
* @param PaymentItem $payment_item
* @return integer
*/
public function get_payment_amount(PaymentItem $payment_item): int {
$discount_amount = $this->get_discount_amount($payment_item);
return $payment_item->get_item_amount - $discount_amount;
}
}
上記のサンプルコードは以下のようになっています。
・入力された割引コードが存在する割引コードか(隠蔽)
・割引コードが利用期間の範囲内か (隠蔽)
・商品の値段によって割引率(額)を変更する (隠蔽)
・割引額を計算する (公開)
・割引率(額)を元に最終的な決済金額を求める(公開)
呼び出し側が知らなくても良い情報を隠蔽して、必要な情報のみを公開することで呼び出し側は直観的にオブジェクトを操作できるようになります。(作り方次第ですが)わざわざコードを読んで使い方を逆算するようなことをしなくてよくなります。

