カプセル化

クラスとオブジェクト

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




インターフェイス

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

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



週間人気ページランキング / 6-25 → 7-1
順位 ページタイトル抜粋 アクセス数
1 PHPで定数を定義する方法は2種類ある / 配列定数の定義 7
2 エラー | エラーメッセージ 5
3 ブラウザを閉じたらセッションデータはどうなるの? | セッション 4
3 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 4
3 オブジェクト関係マッピング | データベース関連 4
4 「POSIX正規表現」と「PCRE正規表現」の違い 3
4 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 3
4 register_shutdown_function | 関数処理 関数 3
4 Notice(エラーメッセージ) カテゴリー 3
4 _FILE__ | 定数 3
4 PHP用語 3
5 Fatal error(エラーメッセージ) カテゴリー 2
5 session_start() | セッション 2
5 You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal. | Twitter API(エラーメッセージ) 2
5 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 2
5 Warning: PDO::query(): LOAD DATA LOCAL INFILE forbidden | Warning(エラーメッセージ) 2
5 Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | エラーメッセージ 2
5 Propel | データベース関連 2
5 syntax error | エラーメッセージ 2
5 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2
2025/7/2 1:01 更新