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

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

申請免費試用、咨詢電話:400-8352-114

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

 

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


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

 

測試你的代碼

 

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

 

在評論更多關(guān)于測試的益處之前,先讓我們看一個示例。這本書里面一切的測試實例都運用了PHP測試框架——SimpleTest 。這個測試框架可以在 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());

 

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


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

 

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

 

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


 
Calculate_sales_tax()這么一個簡略的才一行的函數(shù)哪里犯錯了呢?你能夠曾經(jīng)留意到這個函數(shù)沒有返回后果。下面是準確的函數(shù):

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

修正后運轉(zhuǎn),測試經(jīng)過。


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

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

或許改動函數(shù)TestSalesTax()來驗證第二個(和第三個,等等)值,如下所示

 

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

到當前為止還有一種更好的辦法,就是新添加一個測試:選擇隨即值來測試你的代碼。詳細如下:

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(),假如傳入的第一個變量等于于布爾真則assertTrue()經(jīng)過。(和辦法assertEqual()一樣,辦法assertTrue()在承受一個可選擇性的、額定的后將返回一個掉敗的信息)。所以TestRandomValuesSalesTax()起首以為常量TAX_RATE曾經(jīng)界說了,然后運用這個常量來核算隨機選擇的的數(shù)目的稅收。


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

 

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


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

 

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

 

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

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

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

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

咨詢:400-8352-114

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

QQ在線咨詢

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

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