カプセル化

クラスとオブジェクト

 状態:未整理  閲覧数:4,878  投稿日: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




インターフェイス

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

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



週間人気ページランキング / 3-4 → 3-10
順位 ページタイトル抜粋 アクセス数
1 PHPで定数を定義する方法は2種類ある / 配列定数の定義 5
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 4
2 curl で Cookie を使用する 4
3 SQLite(エラーメッセージ) カテゴリー 3
3 Fatal error: Call to undefined method MDB2_Error::execute() in ○○ on line △△ | Fatal error(エラーメッセージ) 3
3 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 3
3 「POSIX正規表現」と「PCRE正規表現」の違い 3
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 3
3 session_start() | セッション 3
4 バッファリング | 出力バッファリング制御(関数) 2
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2
4 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 2
4 Fatal error: Uncaught HeadlessChromium\Exception\OperationTimedOut: Operation timed out (3sec) in | Fatal error(エラーメッセージ) 2
4 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 2
4 Notice(エラーメッセージ) カテゴリー 2
4 register_shutdown_function | 関数処理 関数 2
5 Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused | Fatal error(エラーメッセージ) 1
5 コード例 … 「例外処理」はネストすることができる 1
5 親クラスのコンストラクタは自動実行されないから、明示的に呼び出す必要がある 1
5 シリアライズ(シリアル化) | 関数 1
2025/3/11 1:01 更新