監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

PHP設(shè)計(jì)模式 編程慣用法

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

南昌網(wǎng)站建設(shè)www.diyphp.net

 

進(jìn)修一門新的言語(yǔ)意味著要采用新的習(xí)用法。這章將引見(jiàn)或許能夠從新強(qiáng)調(diào)一些習(xí)用法。你會(huì)發(fā)現(xiàn)這些習(xí)用法在你要在代碼中完成設(shè)計(jì)形式時(shí)分長(zhǎng)短常有效的。


在這里總結(jié)的很多編程習(xí)用法都是很值得做為獨(dú)自一個(gè)章節(jié)的,甚至一本書(shū)的。你應(yīng)該把這章做為PHP形式設(shè)計(jì)運(yùn)用習(xí)用法的相關(guān)引見(jiàn),并且檢查一些列出的參考書(shū)來(lái)進(jìn)行更深化的進(jìn)修。

 

測(cè)試你的代碼

 

能夠沒(méi)有什么代碼習(xí)用法比測(cè)試代碼愈加主要了。好的測(cè)試可以進(jìn)步開(kāi)拓速度。
能夠一開(kāi)端,這句格言會(huì)和你的直覺(jué)相矛盾。你能夠會(huì)斷言,測(cè)試是自在的妨礙物。現(xiàn)實(shí)上恰好相反,假如你非常完好的運(yùn)轉(zhuǎn)那些測(cè)試來(lái)反省你的軟件的公共接口,你就能夠在不改動(dòng)(或許愈加蹩腳,毀壞)本來(lái)的使用軟件的前提下改動(dòng)本人系統(tǒng)內(nèi)涵的執(zhí)行。測(cè)試并查驗(yàn)?zāi)愕墓步涌诘臏?zhǔn)確性和準(zhǔn)確性,而且讓本人隨意改動(dòng)一些代碼的內(nèi)涵任務(wù)來(lái)確保你的軟件是準(zhǔn)確并且沒(méi)有bug(錯(cuò)誤)。

 

在評(píng)論更多關(guān)于測(cè)試的益處之前,先讓我們看一個(gè)示例。這本書(shū)里面一切的測(cè)試實(shí)例都運(yùn)用了PHP測(cè)試框架——SimpleTest 。這個(gè)測(cè)試框架可以在 http://simpletest.org 獲取到。

 

思索下面的代碼

<?php
// PHP4
// the subject code
define(‘TAX_RATE’, 0.07);
function calculate_sales_tax($amount) {
round($amount * TAX_RATE,2);
}
// include test library
require_once ‘simpletest/unit_tester.php’;
require_once ‘simpletest/reporter.php’;
// the test
class TestingTestCase extends UnitTestCase {
function TestingTestCase($name=’’) {
$this->UnitTestCase($name);
}
function TestSalesTax() {
$this->assertEqual(7, calculate_sales_tax(100));
}
}
// run the test
$test = new TestingTestCase(‘Testing Unit Test’);
$test->run(new HtmlReporter());

 

 上面的代碼起首界說(shuō)了一個(gè)常量——TAX_RATE,和一個(gè)核算發(fā)賣稅的函數(shù)。接著,代碼包括了運(yùn)用SimpleTest框架的必備組件:?jiǎn)误w測(cè)試自身和一個(gè)用來(lái)顯示測(cè)試后果的“reporter”模塊。
類TestingTestCase承繼于SimpleTest框架的UnitTestCase類。經(jīng)過(guò)擴(kuò)展UnitTestCase,類TestingTestCase里面一切運(yùn)用Test開(kāi)首的辦法都將被以為是測(cè)試實(shí)例——發(fā)明前提來(lái)調(diào)試你的代碼并斷言后果。
TestingTestCase界說(shuō)了一個(gè)測(cè)試,TestSalesTax(),它包括了一個(gè)斷言函數(shù)AssertEqual()。假如它的前兩個(gè)輸入?yún)?shù)是相等的,它將返回true,不然返回false。(假如你想顯示assertEqual()掉敗的信息,你可以傳入三個(gè)參數(shù)就像如許$this->assertEqual(7,calculate_sales_tax(100), “The sales tax calculation failed”))。


代碼的最終兩行創(chuàng)立了這個(gè)測(cè)試實(shí)例的實(shí)體而且運(yùn)用一個(gè)HtmlReporter運(yùn)轉(zhuǎn)了它。你可以拜訪這個(gè)web頁(yè)面來(lái)運(yùn)轉(zhuǎn)這個(gè)簡(jiǎn)略的測(cè)試。

 

運(yùn)轉(zhuǎn)這個(gè)測(cè)試將顯示測(cè)試稱號(hào),掉敗斷言的具體狀況和一個(gè)總結(jié)條。(綠色的意味著成功(一切的斷言都經(jīng)過(guò)了),而赤色的暗示著掉敗(至少有一個(gè)斷言沒(méi)有經(jīng)過(guò)))
(assertion(斷言)在軟件開(kāi)拓中是一種常用的調(diào)試方法,良多開(kāi)拓言語(yǔ)中都支撐這種機(jī)制。在完成中,assertion就是在順序中的一條語(yǔ)句,它對(duì)一個(gè)boolean表達(dá)式進(jìn)行反省,一個(gè)準(zhǔn)確順序必需包管這個(gè)boolean表達(dá)式的值為true;假如該值為false,闡明順序曾經(jīng)處于不準(zhǔn)確的形態(tài)下,系統(tǒng)將給出正告或退出。普通來(lái)說(shuō),assertion用于包管順序最根本、要害的準(zhǔn)確性。assertion反省凡間在開(kāi)拓和測(cè)試時(shí)開(kāi)啟。為了進(jìn)步功能,在軟件發(fā)布后,assertion反省凡間是封閉的。)
注:(assertion(斷言)在軟件開(kāi)拓中是一種常用的調(diào)試方法,良多開(kāi)拓言語(yǔ)中都支撐這種機(jī)制。在完成中,assertion就是在順序中的一條語(yǔ)句,它對(duì)一個(gè)boolean表達(dá)式進(jìn)行反省,一個(gè)準(zhǔn)確順序必需包管這個(gè)boolean表達(dá)式的值為true;假如該值為false,闡明順序曾經(jīng)處于不準(zhǔn)確的形態(tài)下,系統(tǒng)將給出正告或退出。普通來(lái)說(shuō),assertion用于包管順序最根本、要害的準(zhǔn)確性。assertion反省凡間在開(kāi)拓和測(cè)試時(shí)開(kāi)啟。為了進(jìn)步功能,在軟件發(fā)布后,assertion反省凡間是封閉的。)

 

上面的代碼有一個(gè)(有意的)錯(cuò)誤,所以運(yùn)轉(zhuǎn)是不克不及經(jīng)過(guò)了,顯示后果如下:


 
Calculate_sales_tax()這么一個(gè)簡(jiǎn)略的才一行的函數(shù)哪里犯錯(cuò)了呢?你能夠曾經(jīng)留意到這個(gè)函數(shù)沒(méi)有返回后果。下面是準(zhǔn)確的函數(shù):

function calculate_sales_tax($amount) {
return round($amount * TAX_RATE,2);
}

修正后運(yùn)轉(zhuǎn),測(cè)試經(jīng)過(guò)。


 
然則一個(gè)簡(jiǎn)略的測(cè)試并不克不及包管代碼是不變的。比方,你把calculate_sales_tax()改成 function calculate_sales_tax($amount) { return 7; },代碼也會(huì)經(jīng)過(guò)測(cè)試,但只要當(dāng)1美元等價(jià)于100的時(shí)分才是準(zhǔn)確的。你可以本人添加一些額定的測(cè)試辦法來(lái)測(cè)試其他的靜態(tài)值。

function TestSomeMoreSalesTax() {
$this->assertEqual(3.5, calculate_sales_tax(50));
}

或許改動(dòng)函數(shù)TestSalesTax()來(lái)驗(yàn)證第二個(gè)(和第三個(gè),等等)值,如下所示

 

function TestSalesTax() {
$this->assertEqual(7, calculate_sales_tax(100));
$this->assertEqual(3.5, calculate_sales_tax(50));
}

到當(dāng)前為止還有一種更好的辦法,就是新添加一個(gè)測(cè)試:選擇隨即值來(lái)測(cè)試你的代碼。詳細(xì)如下:

function TestRandomValuesSalesTax() {
$amount = rand(500,1000);
$this->assertTrue(defined(‘TAX_RATE’));
$tax = round($amount*TAX_RATE*100)/100;
$this->assertEqual($tax, calculate_sales_tax($amount));
}

TestRandomValuesSalesTax()引入了辦法assertTrue(),假如傳入的第一個(gè)變量等于于布爾真則assertTrue()經(jīng)過(guò)。(和辦法assertEqual()一樣,辦法assertTrue()在承受一個(gè)可選擇性的、額定的后將返回一個(gè)掉敗的信息)。所以TestRandomValuesSalesTax()起首以為常量TAX_RATE曾經(jīng)界說(shuō)了,然后運(yùn)用這個(gè)常量來(lái)核算隨機(jī)選擇的的數(shù)目的稅收。


然則TestRandomValuesSalesTax()也存在一個(gè)問(wèn)題:它很大水平的依靠于辦法calculate_sales_tax()。測(cè)試是應(yīng)該和非凡的完成細(xì)節(jié)無(wú)關(guān)的。一個(gè)更好的測(cè)試應(yīng)該只樹(shù)立一個(gè)合理的分界限。接下來(lái)的這個(gè)測(cè)試假定發(fā)賣稅永遠(yuǎn)不會(huì)超越20%。

 

function TestRandomValuesSalesTax() {
$amount = rand(500,1000);
$this->assertTrue(calculate_sales_tax($amount)<$amount*0.20);
}


確保你的代碼正常任務(wù)是測(cè)試的首要的目標(biāo),然則在測(cè)試你的代碼時(shí)分,你應(yīng)該看法到除此之外還有一些額定的,相對(duì)非必須的目標(biāo):

 

1.測(cè)試讓你書(shū)寫(xiě)輕易測(cè)試的代碼。這使得代碼松懈耦合,復(fù)雜設(shè)計(jì),并且具有很好的模塊性。
2.測(cè)試能讓你明晰的調(diào)查運(yùn)轉(zhuǎn)代碼的希冀后果,讓你從一開(kāi)端就注重于模塊的設(shè)計(jì)和剖析。經(jīng)過(guò)測(cè)試,也會(huì)讓你思索一切能夠的輸入和響應(yīng)的輸出后果。
3.測(cè)試能很疾速的調(diào)查編碼的目標(biāo)。換句話說(shuō),測(cè)試事例飾演著“實(shí)例”和“文檔”的功用,精確的展現(xiàn)著若何構(gòu)建一個(gè)類,辦法等。在這本書(shū)中,我有時(shí)分經(jīng)過(guò)一個(gè)測(cè)試事例來(lái)演示代碼的希冀功用。經(jīng)過(guò)讀取一個(gè)測(cè)試辦法的聲明,你可以清晰的調(diào)查代碼是若何運(yùn)轉(zhuǎn)的。一個(gè)測(cè)試實(shí)例界說(shuō)在代碼在明白習(xí)用法下的運(yùn)轉(zhuǎn)狀況。
最終,假如你的測(cè)試集——測(cè)試實(shí)例的調(diào)集——長(zhǎng)短常徹底的,并且當(dāng)一切的測(cè)試都經(jīng)過(guò)的時(shí)分,你可以說(shuō)你的代碼是齊備的。風(fēng)趣的是,這個(gè)觀念也恰恰是Test Driven Development(測(cè)試驅(qū)動(dòng)開(kāi)拓)的特征之一。
Test Driven Development(TDD)也被以為是Test First Coding(編碼前測(cè)試)。Test First Coding是一種把測(cè)試更提早一步的辦法:在你寫(xiě)任何代碼之前先寫(xiě)好測(cè)試。你可以從http://xprogramming.com/xpmag/testFirstGuidelines.htm下載到一份很好的,簡(jiǎn)練的關(guān)于TDD的摘要文章,還下載到一本很好的關(guān)于戰(zhàn)略的入門書(shū)——Kent Beck著作的《Test Driven Development:By Example》(這本書(shū)的例子都是用JAVA開(kāi)拓的,但個(gè)中代碼的可讀性是很好的,并且對(duì)主題的引見(jiàn)和闡明都做的很好的)。

 

注:矯捷開(kāi)拓(Agile Development)
比來(lái),單體測(cè)試——特殊是測(cè)繪驅(qū)動(dòng)開(kāi)拓——曾經(jīng)和矯捷開(kāi)拓辦法學(xué)嚴(yán)密的聯(lián)絡(luò)起來(lái)了,比方說(shuō)極限編程(XP)。極限編程的核心存眷于疾速的重復(fù)的發(fā)步功用性的代碼給客戶,并把轉(zhuǎn)變的客戶需求做為開(kāi)拓進(jìn)程中的必備局部。下面是一些關(guān)于進(jìn)修矯捷編程的在線資本:
函數(shù)性測(cè)試
這本書(shū)里面的大局部測(cè)試?yán)佣际怯脕?lái)測(cè)試面臨對(duì)象的代碼,然則一切方式的編程都可以從中獲得收成的。單體測(cè)試框架,比方說(shuō)PHPUnits和SimpleTest,也都能很輕易的用來(lái)測(cè)試功用函數(shù)的。例如上面的SimpleTest例子,它就是用來(lái)測(cè)試calculate_sales_tax()函數(shù)的。世界各地的順序員們:把單體測(cè)試用例放到你的函數(shù)庫(kù)里面吧!
我但愿經(jīng)由上面的評(píng)論后,你也會(huì)被帶動(dòng)起來(lái)——“測(cè)試指導(dǎo)”(Test Infected)?。ㄟ@個(gè)術(shù)語(yǔ),原創(chuàng)于Erich Gamma,具體狀況請(qǐng)見(jiàn)文章http://junit.sourceforge.net/doc/testinfected/testing.htm),就象Gamma所寫(xiě)的那樣,剛開(kāi)端你能夠會(huì)感應(yīng)測(cè)試是很繁瑣的,然則當(dāng)你為你的順序建立好一個(gè)寬廣的測(cè)試集后,你將你的代碼愈加自傲!  

發(fā)布:2007-03-31 14:49    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
南昌OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢

泛普南昌網(wǎng)站建設(shè)公司其他應(yīng)用

南昌OA軟件 南昌OA新聞動(dòng)態(tài) 南昌OA信息化 南昌OA快博 南昌OA行業(yè)資訊 南昌軟件開(kāi)發(fā)公司 南昌門禁系統(tǒng) 南昌物業(yè)管理軟件 南昌倉(cāng)庫(kù)管理軟件 南昌餐飲管理軟件 南昌網(wǎng)站建設(shè)公司