日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

《PHP設(shè)計(jì)模式介紹》第十章 規(guī)范模式(3)_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:《PHP設(shè)計(jì)模式介紹》第九章 觀測模式
一些面向?qū)ο蟮木幊谭绞�,提供了一種構(gòu)建對(duì)象間復(fù)雜網(wǎng)絡(luò)互連的能力。當(dāng)對(duì)象們連接在一起時(shí),它們就可以相互提供服務(wù)和信息。 通常來說,當(dāng)某個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),你仍然需要對(duì)象之間能互

當(dāng)你的應(yīng)用程序必須加工處理一個(gè)表單,你可以先把$_POST過來的數(shù)據(jù)值裝載到數(shù)據(jù)源DataSource,然后使用參數(shù)化規(guī)范來完成表單的驗(yàn)證。(同樣的方法也可以用到配置文件上,把配置文件的數(shù)據(jù)裝載到DataSource數(shù)據(jù)源,然后使用規(guī)范來驗(yàn)證)。

現(xiàn)在,讓我們構(gòu)造一個(gè)參數(shù)化規(guī)范的示例類,主要用來搭建一個(gè)數(shù)據(jù)塊。首先,我們要建一個(gè)規(guī)范,這個(gè)規(guī)范得滿足“某一個(gè)字段和指定的值等價(jià)”的條件。

class FieldEqualSpecification {
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);
}
}

這個(gè)思路是很簡單的:在構(gòu)造(construction)期間,存儲(chǔ)一個(gè)字段和它期望的值,從數(shù)據(jù)源(DataSource)中獲取到期望的值傳遞到方法isSatisfiedBy(),然后比較。

為了測試這個(gè)規(guī)范,寫一個(gè)測試實(shí)例來演示這個(gè)數(shù)據(jù)源(DataSource):

class SpecificationsTestCase extends UnitTestCase {
protected $ds;
function setup() {
$this->ds = new DataSource;
$this->ds->set(‘name’, ‘Jason’);
$this->ds->set(‘age’, 34);
$this->ds->set(‘email’,
[email protected]
);
$this->ds->set(‘sex’, ‘male’);
}
}

在上面的例子里,方法setup()創(chuàng)建了一個(gè)數(shù)據(jù)源對(duì)象,并設(shè)置了相應(yīng)的屬性。這個(gè)測試還包含一個(gè)方法,這個(gè)方法要么返回pass要么返回fail。

class SpecificationsTestCase extends UnitTestCase {
// ...
function TestFieldEqualSpecification() {
$name_jason = new FieldEqualSpecification(‘name’, ‘Jason’);
$this->assertTrue($name_jason->isSatisfiedBy($this->ds));
$sex_other = new FieldEqualSpecification(‘sex’, ‘other’);
$this->assertFalse($sex_other->isSatisfiedBy($this->ds));
}
}

通常在評(píng)估字符串的時(shí)候,一個(gè)正則表達(dá)式比一系列嚴(yán)格的比較關(guān)系能夠更好的幫助你來定義你的需求。那么,讓我們?cè)贔ieldMatchSpecification中使用正則表達(dá)式來匹配我們的規(guī)范工具集。

class FieldMatchSpecification {
protected $field;
protected $regex;
public function __construct($field, $regex) {
$this->field = $field;
$this->regex = $regex;
}
public function isSatisfiedBy($datasource) {
return preg_match($this->regex, $datasource->get($this->field));
}
}


在這個(gè)例子里,這個(gè)字段對(duì)應(yīng)的值和PCRE表達(dá)式都在構(gòu)造的時(shí)候保存好了。然后方法isSatisfiedBy()從傳遞過來的數(shù)據(jù)源DataSource獲取到這個(gè)字段,并且使用preg_match()方法來比較它的值是否滿足對(duì)應(yīng)的正則表達(dá)式。

下面這個(gè)例子演示了如何為FieldMatchSpecification字段匹配規(guī)范書寫測試實(shí)例。

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正則要求“在@前是一串不包含空格、@的字符,在@后是兩組或者兩組以上不包含可個(gè)空格或者句點(diǎn)的字符串,這些字符串之間由句點(diǎn)間隔著”。而變量$name_ten_letters規(guī)范要求輸入的值必須恰好是由10個(gè)字符組成。

注:正則表達(dá)式

有許多書籍單獨(dú)開一章來講解正則表達(dá)式,甚至有些整本書都在討論這個(gè)話題(譯者注:作者是為了說明正則表達(dá)式的重要性和難度)。所以,請(qǐng)認(rèn)識(shí)到上面的代碼只是一個(gè)過于簡單化的例子,而不是一個(gè)檢查email的完善的正則表達(dá)式。

下面讓我們搭建最后一個(gè)具體的規(guī)范用來檢驗(yàn)一個(gè)字段值是否大于或者等于對(duì)應(yīng)的值。我們毫無疑問的把它命名為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);
}
}

這里沒有太多的不可思議的:在構(gòu)造器里面存儲(chǔ)相應(yīng)的要被比較的字段和值,然后在方法isSatisfiedBy()里面驗(yàn)證提取出來的字段。

下面是一個(gè)測試實(shí)例,用來演示如何應(yīng)用FieldGreaterThanOrEqualSpecification。

class SpecificationsTestCase extends UnitTestCase {
// ...
function TestFieldGreaterThanOrEqualSpecification() {
$adult =
new FieldGreaterThanOrEqualSpecification(‘age’, 18);
$presidential_age =
new FieldGreaterThanOrEqualSpecification(‘age’, 35);
$this->assertTrue($adult->isSatisfiedBy($this->ds));
$this->assertFalse($presidential_age->isSatisfiedBy($this->ds));
}
}

你是否已經(jīng)注意到在規(guī)范對(duì)象被標(biāo)識(shí)上合理的名稱時(shí)候,這些代碼是如何開始證明自己的嗎?你是否能夠通過規(guī)范對(duì)象的名稱來理解到代碼的相應(yīng)的功能? $adult->isSatisfiedBy($something)你看一眼就會(huì)明白,根本無需深入詳細(xì)的鉆研代碼。這也是規(guī)范模式的優(yōu)點(diǎn)之一吧。

分享:《PHP設(shè)計(jì)模式介紹》第八章 迭代器模式
類中的面向?qū)ο缶幊谭庋b應(yīng)用邏輯。類,就是實(shí)例化的對(duì)象,每個(gè)單獨(dú)的對(duì)象都有一個(gè)特定的身份和狀態(tài)。單獨(dú)的對(duì)象是一種組織代碼的有用方法,但通常你會(huì)處理一組對(duì)象或者集合。 屬性來自 SQL 查

來源:模板無憂//所屬分類:PHP教程/更新時(shí)間:2008-08-22
相關(guān)PHP教程