下面這個例子演示了如何為FieldMatchSpecification字段匹配規(guī)范書寫測試實例。
class SpecificationsTestCase extends UnitTestCase { // ... function TestFieldMatchSpecification() { $valid_email = new FieldMatchSpecification( ‘email’, ‘/^[^\s@]+@[^\s.]+(?:\.[^\s.]+)+/’); $this->assertTrue($valid_email->isSatisfiedBy($this->ds)); $name_ten_letters = new FieldMatchSpecification( ‘name’, ‘/^\w{10}$/’); $this->assertFalse($name_ten_letters->isSatisfiedBy($this->ds)); } }
上面例子中的email正則要求“在@前是一串不包含空格、@的字符,在@后是兩組或者兩組以上不包含可個空格或者句點的字符串,這些字符串之間由句點間隔著”。而變量$name_ten_letters規(guī)范要求輸入的值必須恰好是由10個字符組成。
注:正則表達式 有許多書籍單獨開一章來講解正則表達式,甚至有些整本書都在討論這個話題(譯者注:作者是為了說明正則表達式的重要性和難度)。所以,請認識到上面的代碼只是一個過于簡單化的例子,而不是一個檢查email的完善的正則表達式。
下面讓我們搭建最后一個具體的規(guī)范用來檢驗一個字段值是否大于或者等于對應的值。我們毫無疑問的把它命名為FieldGreaterThanOrEqualSpecification.。
class FieldGreaterThanOrEqualSpecification { protected $field; protected $value; public function __construct($field, $value) { $this->field = $field; $this->value = $value; } public function isSatisfiedBy($datasource) { return ($datasource->get($this->field) >= $this->value); } }
這里沒有太多的不可思議的:在構造器里面存儲相應的要被比較的字段和值,然后在方法isSatisfiedBy()里面驗證提取出來的字段。
下面是一個測試實例,用來演示如何應用FieldGreaterThanOrEqualSpecification。
class SpecificationsTestCase extends UnitTestCase { // ... function TestFieldGreaterThanOrEqualSpecification() { $adult = new FieldGreaterThanOrEqualSpecification(‘a(chǎn)ge’, 18); $presidential_age = new FieldGreaterThanOrEqualSpecification(‘a(chǎn)ge’, 35); $this->assertTrue($adult->isSatisfiedBy($this->ds)); $this->assertFalse($presidential_age->isSatisfiedBy($this->ds)); } }
你是否已經(jīng)注意到在規(guī)范對象被標識上合理的名稱時候,這些代碼是如何開始證明自己的嗎?你是否能夠通過規(guī)范對象的名稱來理解到代碼的相應的功能? $adult->isSatisfiedBy($something)你看一眼就會明白,根本無需深入詳細的鉆研代碼。這也是規(guī)范模式的優(yōu)點之一吧。
到現(xiàn)在為止,你應該很清楚的明白規(guī)范模式就如一個接口。使用PHP5明確的表示出這個規(guī)范模式:
interface Specification { public function isSatisfiedBy($datasource); }
我們把這些基本的模塊按照一定的格式集中起來,這甚至是非常有用的。因為從一個規(guī)范類的方法isSatisfiedBy()中返回的結果是一個布爾值(boolean),把這些布爾值運用到具體不同的規(guī)范類的效果都是相當好的。
為了實現(xiàn)邏輯與,我們創(chuàng)建一個類,把兩個具體的規(guī)范實例類組合起來,當給出的數(shù)據(jù)源參數(shù)同時滿足給定的條件后就返回true。
class AndSpecification implements Specification { protected $spec; protected $andSpec; public function __construct($spec, $andSpec) { $this->spec = $spec; $this->andSpec = $andSpec;
function isSatisfiedBy($datasource) { return ($this->spec->isSatisfiedBy($datasource) && $this->andSpec->isSatisfiedBy($datasource)); }
你也可以類似的實現(xiàn)邏輯或。
class OrSpecification implements Specification { protected $spec; protected $orSpec; public function __construct($spec, $orSpec) { $this->spec = $spec; $this->orSpec = $orSpec;
function isSatisfiedBy($datasource) { return ($this->spec->isSatisfiedBy($datasource) || $this->orSpec->isSatisfiedBy($datasource)); }
利用已經(jīng)給出的“邏輯”規(guī)范和最初的一些規(guī)規(guī)范集合,你可以實現(xiàn)一些復雜的驗證。
class PolicyFactory { public function createJasonPolicy() { $name_jason = new FieldEqualSpecification(‘name’, ‘Jason’); $age_at_least_thirty = new FieldGreaterThanOrEqualSpecification(‘a(chǎn)ge’, 30); $male = new FieldEqualSpecification(‘sex’, ‘male’); $jasons_email = new OrSpecification( new FieldEqualSpecification(‘email’, ‘jsweat_php@yahoo.com’) , new FieldEqualSpecification(‘email’, ‘jsweat@users.sourceforge.net’)); return new AndSpecification( $name_jason, new AndSpecification( $age_at_least_thirty, new AndSpecification($male, $jasons_email) )); } }
出處:
責任編輯:bluehearts
上一頁 php設計模式介紹之規(guī)范模式 [4] 下一頁 php設計模式介紹之規(guī)范模式 [6]
◎進入論壇網(wǎng)絡編程版塊參加討論
|