當前位置:工程項目OA系統(tǒng) > 泛普各地 > 江西OA系統(tǒng) > 南昌OA系統(tǒng) > 南昌網(wǎng)站建設(shè)公司
PHP設(shè)計模式 編程慣用法
進修一門新的言語意味著要采用新的習(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)測試是很繁瑣的,然則當你為你的順序建立好一個寬廣的測試集后,你將你的代碼愈加自傲!
- 1站長最常用的兩個流量統(tǒng)計 多年使用心得
- 2吃火鍋最煩的9種人~你碰到過沒得?
- 3討好百度要大流量選擇獨立服務(wù)器很關(guān)鍵
- 4MES系統(tǒng)對生產(chǎn)型企業(yè)的重要
- 5網(wǎng)站微觀研究部之一《營銷型網(wǎng)站的建立》
- 6探討搜索引擎是如何識別原創(chuàng)?
- 7挑選網(wǎng)頁字體類型的細節(jié)
- 8寫原創(chuàng)文章的技巧
- 9來了解下制作沙盤時影響沙盤表現(xiàn)效果的因素
- 10電子電器行業(yè)ERP軟件|深圳電子電器ERP
- 11起初在ECshop建站時遇到問題及解決方法
- 12納客軟件定制開發(fā)流程
- 13使用進銷存管理軟件的理由
- 14域名注冊基礎(chǔ)知識
- 15畢業(yè)答辯的目的與意義
- 16網(wǎng)站優(yōu)化全過程
- 17納客連鎖會員管服務(wù)器相關(guān)提問
- 18網(wǎng)站優(yōu)化需多長時間
- 19如何尋找適合自己的外貿(mào)ERP管理系統(tǒng)
- 20seo之外鏈分析篇
- 21VMware虛擬機下linux不能全屏的解決方法
- 22中文域名狂熱未減 市場價值無限攀升
- 23關(guān)于虛擬機管理的五個關(guān)鍵性問題
- 24優(yōu)秀的OA軟件應(yīng)具備的五大特性
- 25關(guān)于動態(tài)主機配置協(xié)議幾個常識
- 26開發(fā)者需關(guān)注的幾項Web新技術(shù)
- 27腳氣病是復(fù)發(fā)性和傳染性很強的皮膚病
- 28網(wǎng)站優(yōu)化的小技巧
- 29企業(yè)如何讓ERP系統(tǒng)更加安全
- 30如何選擇虛擬主機?
成都公司:成都市成華區(qū)建設(shè)南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓