天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP三層結(jié)構(gòu)(下) PHP實(shí)現(xiàn)AOP第1/2頁(yè)

本文源碼下載地址:http://xiazai.jb51.NET/201007/yuanma/TraceLWord.rar
開發(fā)環(huán)境為 eclipse(pdt)
讓我們把注意力集中到中間服務(wù)層上來(lái)。中間服務(wù)層代碼比較簡(jiǎn)單,只是調(diào)用數(shù)據(jù)訪問(wèn)層代碼將留言保存到數(shù)據(jù)庫(kù)。如代碼1所示:
復(fù)制代碼 代碼如下:
// 代碼 1
// 中間服務(wù)層
class LWordServiceCore implements ILWordService {
// 添加留言
public function append($newLWord) {
// 調(diào)用數(shù)據(jù)訪問(wèn)層
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
}
};

在看到留言板的演示之后,公司的產(chǎn)品部和市場(chǎng)部或許會(huì)提出各種各樣的想法和需求。比如他們希望在添加留言之前判斷用戶的權(quán)限!只有注冊(cè)用戶才能留言!我們需要修改代碼,如代碼2所示:
復(fù)制代碼 代碼如下:
// 代碼 2, 增加登錄驗(yàn)證
// 中間服務(wù)層
class LWordServiceCore implements ILWordService {
// 添加留言
public function append($newLWord) {
if (!($userLogin)) {
// 提示用戶登錄
}
// 調(diào)用數(shù)據(jù)訪問(wèn)層
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
}
};

市場(chǎng)部又希望在添加留言之前,對(duì)留言內(nèi)容進(jìn)行檢查,如果留言中含有臟話就不保存。我們繼續(xù)修改代碼,如代碼3所示:
復(fù)制代碼 代碼如下:
// 代碼 3, 增加臟話過(guò)濾
// 中間服務(wù)層
class LWordServiceCore implements ILWordService {
// 添加留言
public function append($newLWord) {
if (!($userLogin)) {
// 提示用戶登錄
}
if (stristr($newLWord, "SB")) {
// 含有臟話, 提示留言發(fā)送失敗
}
// 調(diào)用數(shù)據(jù)訪問(wèn)層
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
}
};

產(chǎn)品部也提出了新需求,他們希望加入積分機(jī)制。具體來(lái)講就是在用戶每次留言成功以后給用戶+5分。我們繼續(xù)修改代碼,如代碼4所示:
復(fù)制代碼 代碼如下:
// 代碼 4, 加入留言積分機(jī)制
// 中間服務(wù)層
class LWordServiceCore implements ILWordService {
// 添加留言
public function append($newLWord) {
if (!($userLogin)) {
// 提示用戶登錄
}
if (stristr($newLWord, "SB")) {
// 含有臟話, 提示留言發(fā)送失敗
}
// 調(diào)用數(shù)據(jù)訪問(wèn)層
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
// 給用戶加分
$score = getUserScore($userName);
$score = $score + 5;
saveUserScore($userName, $score);
}
};

沒過(guò)多久,產(chǎn)品部又對(duì)需求進(jìn)行細(xì)化,他們希望用戶積分每積累夠1000分以后,就給用戶升級(jí)。我們繼續(xù)修改代碼,如代碼5所示:
復(fù)制代碼 代碼如下:
// 代碼 5, 加入用戶升級(jí)規(guī)則
// 中間服務(wù)層
class LWordServiceCore implements ILWordService {
// 添加留言
public function append($newLWord) {
if (!($userLogin)) {
// 提示用戶登錄
}
if (stristr($newLWord, "fuck")) {
// 含有臟話, 提示留言發(fā)送失敗
}

// 調(diào)用數(shù)據(jù)訪問(wèn)層
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
// 給用戶加分
$score = getUserScore($userName);
$score = $score + 5;
saveUserScore($userName, $score);
// 給用戶升級(jí)
if (($score % 1000) == 0) {
$level = getUserLevel($userName);
$level = $level + 1;
saveUserLevel($userName, $level);
}
}
};

隨著需求的增多,我們需要不斷的修改中間服務(wù)層代碼。但是你應(yīng)該不難發(fā)現(xiàn),需求越多中間服務(wù)層代碼也就越多越龐大!最后會(huì)導(dǎo)致即便我們使用三層結(jié)構(gòu)的開發(fā)模式,也還是沒有有效的降低工程難度!另外就是應(yīng)需求的變化而修改中間服務(wù)代碼以后,需要重新測(cè)試所有代碼,而不是有效的測(cè)試新增代碼……

其實(shí)讓我們仔細(xì)分析一下這個(gè)留言板代碼,我先要提出一個(gè)主業(yè)務(wù)邏輯和次業(yè)務(wù)邏輯的概念。無(wú)論怎樣,把留言內(nèi)容存入到數(shù)據(jù)庫(kù),這是業(yè)務(wù)邏輯的主干!這個(gè)就是主業(yè)務(wù)邏輯!這部分沒有隨著需求的增加而修改。至于在存入數(shù)據(jù)庫(kù)之前要進(jìn)行權(quán)限校驗(yàn),要進(jìn)行內(nèi)容檢查,存入數(shù)據(jù)庫(kù)之后要給用戶加分,然后給用戶升級(jí),這些都是前序工作和掃尾工作,都是次業(yè)務(wù)邏輯!主業(yè)務(wù)邏輯幾乎是一成不變的,次業(yè)務(wù)邏輯變化卻非常頻繁。為了提高代碼的可讀性和可維護(hù)性,我們可以考慮把這些次業(yè)務(wù)邏輯放到別的地方,盡量不要讓它們干擾主業(yè)務(wù)邏輯。主業(yè)務(wù)邏輯專心干自己該干的事情好了,至于別的任何事情,主業(yè)務(wù)邏輯一概都不聞不問(wèn)!那么我們的代碼就可以寫成這樣,如代碼6所示:
復(fù)制代碼 代碼如下:
// 代碼 6, 將主業(yè)務(wù)邏輯和次業(yè)務(wù)邏輯分開
// 中間服務(wù)層
class LWordServiceCore implements ILWordService {
// 添加留言
public function append($newLWord) {
// 添加留言前
beforeAppend($newLWord);
// 調(diào)用數(shù)據(jù)訪問(wèn)層
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
// 添加留言后
behindAppend($newLWord);
}
};

我們可以把權(quán)限判斷代碼和留言內(nèi)容文本過(guò)濾代碼統(tǒng)統(tǒng)塞進(jìn)beforeAppend函數(shù),把用戶積分代碼塞進(jìn)behindAppend函數(shù),這樣就把次業(yè)務(wù)邏輯從主業(yè)務(wù)邏輯代碼中清理掉了。主業(yè)務(wù)邏輯知道有個(gè)“序曲”函數(shù)beforeAppend,有個(gè)“尾聲”函數(shù)behindAppend,但是在序曲和尾聲函數(shù)中具體都做了什么事情,主業(yè)務(wù)邏輯并不知道,也不需要知道!當(dāng)然實(shí)際編碼工作并不那么簡(jiǎn)單,我們還要兼顧產(chǎn)品部和市場(chǎng)部更多的需求變化,所以最好能實(shí)現(xiàn)一種插件方式來(lái)應(yīng)對(duì)這種變化,但是僅僅依靠?jī)蓚€(gè)函數(shù)beforeAppend和behindAppend是達(dá)不到這個(gè)目的~

想要實(shí)現(xiàn)插件方式,可以建立接口!使用接口的好處是可以將定義和實(shí)現(xiàn)隔離,另外就是實(shí)現(xiàn)多態(tài)。我們建立一個(gè)留言擴(kuò)展接口ILWordExtension,該接口有兩個(gè)函數(shù)beforeAppend和behindAppend。權(quán)限校驗(yàn)、內(nèi)容檢查、加分這些功能可以看作是實(shí)現(xiàn)ILWordExtension接口的三個(gè)實(shí)現(xiàn)類,主業(yè)務(wù)邏輯就依次遍歷這三個(gè)實(shí)現(xiàn)類,來(lái)完成次業(yè)務(wù)邏輯。如圖1所示:
CheckPowerExtension擴(kuò)展類用作用戶權(quán)限校驗(yàn),CheckContentExtension擴(kuò)展類用作留言內(nèi)容檢查,AddScoreExtension擴(kuò)展類用作給用戶加分和升級(jí)。示意代碼如代碼7所示:

(圖1),加入擴(kuò)展接口
復(fù)制代碼 代碼如下:
// 代碼 7,加入擴(kuò)展接口
// 擴(kuò)展接口
interface ILWordExtension {
// 添加留言前
public function beforeAppend($newLWord);
// 添加留言后
public function behindAppend($newLWord);
};

// 檢查權(quán)限
class CheckPowerExtension implements ILWordExtension {
// 添加留言前
public function beforeAppend($newLWord) {
// 在這里判斷用戶權(quán)限
}

// 添加留言后
public function behindAppend($newLWord) {
}
};

// 檢查留言文本
class CheckContentExtension implements ILWordExtension {
// 添加留言前
public function beforeAppend($newLWord) {
if (stristr($newLWord, "SB")) {
throw new Exception();
}
}

// 添加留言后
public function behindAppend($newLWord) {
}
};

// 用戶積分
class AddScoreExtension implements ILWordExtension {
// 添加留言前
public function beforeAppend($newLWord) {
}

// 添加留言后
public function behindAppend($newLWord) {
// 在這里給用戶積分
}
};

// 中間服務(wù)層
class LWordServiceCore implements ILWordService {
// 添加留言
public function append($newLWord) {
// 添加留言前
$this->beforeAppend($newLWord);

// 調(diào)用數(shù)據(jù)訪問(wèn)層
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);

// 添加留言后
$this->behindAppend($newLWord);
}

// 添加留言前
private function beforeAppend($newLWord) {
// 獲取擴(kuò)展數(shù)組
$extArray = $this->getExtArray();

foreach ($extArray as $ext) {
// 遍歷每一個(gè)擴(kuò)展, 并調(diào)用其 beforeAppend 函數(shù)
$ext->beforeAppend($newLWord);
}
}

// 添加留言后
private function behindAppend($newLWord) {
// 獲取擴(kuò)展數(shù)組
$extArray = $this->getExtArray();

foreach ($extArray as $ext) {
// 遍歷每一個(gè)擴(kuò)展, 并調(diào)用其 behindAppend 函數(shù)
$ext->behindAppend($newLWord);
}
}

// 獲取擴(kuò)展數(shù)組,
// 該函數(shù)的返回值實(shí)際上是 ILWordExtension 接口數(shù)組
private function getExtArray() {
return array(
// 檢查權(quán)限
new CheckPowerExtension(),
// 檢查內(nèi)容
new CheckContentExtension(),
// 加分
new AddScoreExtension(),
);
}
};

如果還有新需求,,我們只要再添加ILWordExtension 實(shí)現(xiàn)類并且把它注冊(cè)到getExtArray函數(shù)里即可。程序從此有了條理,并且算是具備了可擴(kuò)展性。

php技術(shù)PHP三層結(jié)構(gòu)(下) PHP實(shí)現(xiàn)AOP第1/2頁(yè),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 一本道高清到手机在线 | 狠狠插综合 | 色久久一个亚洲综合网 | 一本道色综合手机久久 | 99久久麻豆AV色婷婷综合 | 好男人好资源在线观看免费视频 | 中文字幕按摩 | 日韩精品免费一区二区 | 十8禁用B站在线看漫画 | 超碰免费视频在线观看 | 免费观看桶机十分钟 | 97无码人妻精品1国产精东影业 | 俄罗斯搜索引擎Yandex推广入口 | 久久综合久久鬼 | 在线电台收听 | 色多多旧版污污破解版 | 天天躁日日躁狠狠躁午夜剧场 | 两个奶被男人揉了一个晚上 | 亚洲免费观看 | 香蕉久久一区二区三区啪啪 | 亚洲欧美视频在线 | 久久婷婷五月免费综合色啪 | 快乐激情网 | 美女大本营 | 中文字幕一区二区三区在线观看 | 牛牛在线(正)精品视频 | 亚洲电影成人 成人影院 | 久久这里只有精品2 | 久久这里的只有是精品23 | 老头xxx | 亚洲日韩精品AV中文字幕 | 久久久中日AB精品综合 | 桥本有菜护士 | 国产精品AV无码免费播放 | 第九色区av天堂 | 717影院理论午夜伦不卡久久 | 小货SAO边洗澡边CAO你动漫 | 亚洲综合久久一本伊伊区 | 欧美特级另类xxx | 在线精品视频免费观看 | 美女被强奷到抽搐的动态图 |