カプセル化

クラスとオブジェクト

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




インターフェイス

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

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



週間人気ページランキング / 11-16 → 11-22
順位 ページタイトル抜粋 アクセス数
1 ブラウザを閉じたらセッションデータはどうなるの? | セッション 8
2 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 5
3 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 4
3 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 4
4 PHPで定数を定義する方法は2種類ある / 配列定数の定義 3
4 インポートするデータを受信できませんでした。ファイル名が送信されていないか、ファイルサイズが PHP の設定で許可された最大値を超えています。FAQ 1.16 をご覧ください | エラーメッセージ 3
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 3
4 クラスの継承 | クラスとオブジェクト 3
5 curl で Cookie を使用する 2
5 例外処理 | 制御構造 2
5 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 2
5 関数定義内での「外部ファイル読込」 | 制御構造 2
5 set_error_handler | 例外処理(制御構造) 2
5 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined | Fatal error(エラーメッセージ) 2
5 コード例 … 「例外処理」はネストすることができる 2
5 PHP用語 2
5 register_shutdown_function | 関数処理 関数 2
6 クロージャ | 関数 1
6 session.cookie_lifetime / session.use_cookies | セッション 1
6 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 1
2024/11/23 1:01 更新