php設計モード紹介の値対象モデル第1/5ページ


例えば、日付、数字、通貨は一つのオブジェクトで一般的に説明されます。日付、整数または米ドルの定義は、いずれも使いやすく、すばやく、包装しやすく、コピーしやすく、比較したり、作成したりします。表面から見れば、これらの説明は簡単なオブジェクトで実行されやすいです。それらの語句は非常に少なく、構造クラスの時にCustomarに適用されてもSKUに適用されてもあまり違いがありません。この考えは正しいようですが、いわゆる「正しいようです」ということはバグを生みやすいです。下のコードを見てください。これはドルで従業員に給料を支払う対象についての定義と実行操作です。多くの場合、その運行は大丈夫です。このクラスはBadDolarと名付けられています。バグがまだ存在していますから。考えてみてください。バグを見つけられますか?/ PHP 5クラス BadDolar { protected $グループpublic 機能 __construct($amount=0) { $this->amount = (float)$amount;public 機能 get Amount() { return $this->amount;public 機能 add($dollar) { $this->amount += $dollar->get Amount()}クラス Work { protected $salarypublic 機能 __construct() { $this->salary = new BadDolar(200);public 機能 payDay() { return $this->salary;}クラス Person { public $wallet;機能 testBadDolarWorking() { $job = new Work;p 1 = new Person;p 2 = new Person;p 1->wallet = $job->payDay();this->astertEqual(200、 $p 1->wallet->get Amount();p 2->wallet = $job->payDay();this->astertEqual(200、 $p 2->wallet->get Amount();p 1->wallet->add($job->payDay();this->astertEqual(400、 $p 1->wallet->get Amount()/。this is bad ― actually 400$this->astertEqual(200、 $p 2->wallet->get Amount()/。this is really bad ― actually 400$this->astertEqual(200、 $job->payDay()->get Amount();では、 バグは何ですか?上記のコード例で問題が直感的に発見できない場合、ここではヒントがあります。まず、クラスワードとクラスPersonのインスタンスが作成されました。では、各従業員が最初に空いている電子マネーを持っていると仮定すると、従業員の電子マネーPerson:walletはWork::payDay()関数によって返された対象リソース変数によって割り当てられたので、BadDolar類の対象例に設定されている。PHP 5の対象割当処理方式を覚えていますか?PHP 5のオブジェクト割当の処理方法は、salary、$p 1:wallet、$p 2:walletの3つの見たところ異なるオブジェクトインスタンスが異なる識別子を使用しているが、それらは全て同一のオブジェクトインスタンスに指定されている。したがって、次の給与の支払い操作(PayDayは給料の支給日を示しています。ここでは給料の支払いの動作を示しています。)は、$job->payDayを使っています。本来は$P 1の給料を増やしたいだけですが、思いがけず$P 2にも支給されました。そして、この動きは仕事の基本給の額を変えました。したがって、最後の2つの値の検出エラーが発生しました。Value Object PHP 5 ユニット Test 1) エチル expectation fails because [Integer: 200) ディffers from [Float: 400) by 200 in testBadDolarWorking in Value ObjTestCase 2) エチル expectation fails because [Integer: 200) ディffers from [Float: 400) by 200 in testBadDolarWorking in ValueObjTestCase FAILURES!!
2 3 4 5 次のページ 全文を読む