カプセル化

クラスとオブジェクト

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



Twitter検索結果。「カプセル化」に関する最新ツイート

boardgame_fan @boardgame_fan

インターフェイス

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

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



週間人気ページランキング / 5-26 → 6-1
順位 ページタイトル抜粋 アクセス数
1 ブラウザを閉じたらセッションデータはどうなるの? | セッション 30
2 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 13
3 PHP用語 12
3 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 12
4 スコープ | 変数 11
5 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 10
5 ブラウザを閉じたらセッションデータはどうなるの? | セッション 10
6 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 9
7 セッションID | セッション 8
8 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 7
9 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 5
9 Warning: include() [function.include]: Failed opening '**.php' for inclusion (in | Warning(エラーメッセージ) 5
9 コード例 … 「例外処理」はネストすることができる 5
10 curl | その他のサービス 4
10 型の種類 | 型 4
10 Cookie | クッキー 4
10 @ | 演算子 4
10 Warning: PDO::query(): LOAD DATA LOCAL INFILE forbidden | Warning(エラーメッセージ) 4
10 Fatal error: Call to undefined method MDB2_Error::execute() in ○○ on line △△ | Fatal error(エラーメッセージ) 4
11 Fatal error: Cannot access protected property ○○ in △△ on □□ | Fatal error(エラーメッセージ) 3
2023/6/2 1:01 更新