カプセル化

クラスとオブジェクト

 状態:未整理  閲覧数:4,670  投稿日:2010-06-10  更新日:2013-01-19  
1.保守性の向上

2.publicフィールドの危険性回避

3.外部から見たクラスの単純化



1.保守性の向上

・プロパティを直接参照させない。publicプロパティを直接参照してしまうと、クラスと外部とが直接依存してしまう関係になり、修正に対して弱い構造となるため。
修正が必要になった場合プロパティ直接参照修正が必要な箇所
a.publicクラスを使用しているアプリケーション側の全てのプログラム修正が必要(publicプロパティへはどこからもアクセスできるため)
b.private不可クラス内のみの修正(privateプロパティへアクセスできる範囲はそもそも限定されているため)

▼プロパティを直接参照させない例
 
class Book{
   private $name;

   public function setName($name){
       $this->name = $name;
   }
   public function getName()    {
        if ($this->name == '') {
           return '発売前につき、タイトル未定';
       } else {
           return $this->name;
       }
   }
}

$book = new Book();
$book->setName('PHPトレーニング');

echo $book->getName() . 'にした。';

▼結果

/demo/capsule1.html






2.publicフィールドの危険性回避

PHPは型の制約がないから、放っておくと一つの変数に対してどんな型でも入ってしまう。



チェックロジックを挟む必要アリ



そのためにはメソッドを挟む必要がアリ



結果、privateフィールド+セッタ・ゲッタメソッドという構成になる

▼「privateフィールド」+「チェックロジックを含むセッタメソッド」+「ゲッタメソッド」の例
 
class Book{
   private $price;  

   // ゲッタ
   public function getPrice(){
       return $this->price;
   }

   // セッタ
   public function setPrice($price){
       if (false == is_numeric($price)) {
           throw new Exception('価格には、数字以外設定できません');
       }
       $this->price= $price;
   }
}

try {
$book = new Book();

   $book->setPrice(100);
   echo $book->getPrice() . '円です。';

   $book->setPrice('公園');
   echo $book->getPrice() . '円です。';

} catch (Exception $e) {
   echo $e->getMessage();
}

▼結果

/demo/capsule2.html






3.外部から見たクラスの単純化(外部に不必要なメソッドは隠す)

クラスは、クラス使用者にとって出来る限り単純であることが望ましい。そのクラスにはどんなメンバが存在し、それがどんな機能を提供するか、ということだけ分かればよい。その機能がどのような方法で実現されているかなどについて、クラス使用者が知る必要はない。



結論、公開する必要のないメソッドはprivateにする。

ex)テレビを見る人は、「スイッチを入れればテレビを見ることができる」という事実さえ知っていればよい。テレビがどうやって、ブラウン管に映像を映すかなどの細かい仕組みを知る必要など全くない。



▼公開する必要のないチェックメソッドをprivateにした例
 
class Book{
   private $price;    

   public function getPrice(){    // ゲッタ
       return $this->price;
   }

   public function __construct($price){//コンストラクタで価格の初期値を設定  
       if (false == $this->checkPrice($price)) {
           throw new Exception('初期設定時の価格設定値が不正です。');
       }
       $this->price = $price;
   }

   public function adjustPrice($price){//adjustPriceメソッドで価格の調整を行なう
       if (false == $this->checkPrice($price)) {
           throw new Exception('価格調整時の設定値が不正です。');
       }
       $this->price += $price;
   }

   private function checkPrice($count){//チェックメソッドを作成し、チェックの必要な箇所(複数)から呼び出す。このチェックメソッドは完全に内部処理用なのでprivateに設定
       if (false == is_numeric($count)) {
           return false;
       }
       return true;
   }
}

try {

$book1 = new Book('100');
   $price1 = $book1->getPrice();
print 'この本は' . $price1 . '円で販売される予定です。';

$book1->adjustPrice('200');
print 'この本は' . $book1->getPrice() . '円で販売されることになりました。';

$book1->adjustPrice("公園");
print 'この本は' . $book1->getPrice() . '円で販売されることになりました。';

} catch (Exception $e) {
   echo $e->getMessage();
}

▼結果

/demo/capsule3.html




インターフェイス

「インターフェイス」「抽象クラス」違い

コメント投稿(ログインが必要)



週間人気ページランキング / 4-20 → 4-26
順位 ページタイトル抜粋 アクセス数
1 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 16
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 14
3 PHPで定数を定義する方法は2種類ある / 配列定数の定義 8
4 curl で Cookie を使用する 7
5 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 5
5 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 5
6 コード例 … 「例外処理」はネストすることができる 4
6 Composer | 依存関係マネージャ 4
6 ブラウザを閉じたらセッションデータはどうなるの? | セッション 4
7 型の種類 | 型 3
7 例外処理 | 制御構造 3
7 or(||) | 演算子 3
7 セッション名 | セッション 3
7 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 3
7 register_shutdown_function | 関数処理 関数 3
7 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 3
7 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined | Fatal error(エラーメッセージ) 3
8 SHA-1(Secure Hash Algorithm 1) | 関数 2
8 スコープ | 変数 2
8 static修飾子 | クラスとオブジェクト 2
2024/4/27 1:01 更新