状態:未整理
閲覧数:4,803
投稿日:2010-06-10
更新日:2013-01-19
1.保守性の向上
2.publicフィールドの危険性回避
3.外部から見たクラスの単純化
1.保守性の向上
・プロパティを直接参照させない。publicプロパティを直接参照してしまうと、クラスと外部とが直接依存してしまう関係になり、修正に対して弱い構造となるため。
▼プロパティを直接参照させない例
▼結果
/demo/capsule1.html
2.publicフィールドの危険性回避
PHPは型の制約がないから、放っておくと一つの変数に対してどんな型でも入ってしまう。
↓
チェックロジックを挟む必要アリ
↓
そのためにはメソッドを挟む必要がアリ
↓
結果、privateフィールド+セッタ・ゲッタメソッドという構成になる
▼「privateフィールド」+「チェックロジックを含むセッタメソッド」+「ゲッタメソッド」の例
▼結果
/demo/capsule2.html
3.外部から見たクラスの単純化(外部に不必要なメソッドは隠す)
クラスは、クラス使用者にとって出来る限り単純であることが望ましい。そのクラスにはどんなメンバが存在し、それがどんな機能を提供するか、ということだけ分かればよい。その機能がどのような方法で実現されているかなどについて、クラス使用者が知る必要はない。
↓
結論、公開する必要のないメソッドはprivateにする。
ex)テレビを見る人は、「スイッチを入れればテレビを見ることができる」という事実さえ知っていればよい。テレビがどうやって、ブラウン管に映像を映すかなどの細かい仕組みを知る必要など全くない。
▼公開する必要のないチェックメソッドをprivateにした例
▼結果
/demo/capsule3.html
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