PHP设计模式 编程惯用法
进修一门新的言语意味着要采用新的习用法。这章将引见或许能够从新强调一些习用法。你会发现这些习用法在你要在代码中完成设计形式时分长短常有效的。
在这里总结的很多编程习用法都是很值得做为独自一个章节的,甚至一本书的。你应该把这章做为PHP形式设计运用习用法的相关引见,并且检查一些列出的参考书来进行更深化的进修。
测试你的代码
能够没有什么代码习用法比测试代码愈加主要了。好的测试可以进步开拓速度。
能够一开端,这句格言会和你的直觉相矛盾。你能够会断言,测试是自在的妨碍物。现实上恰好相反,假如你非常完好的运转那些测试来反省你的软件的公共接口,你就能够在不改动(或许愈加蹩脚,毁坏)本来的使用软件的前提下改动本人系统内涵的执行。测试并查验你的公共接口的准确性和准确性,而且让本人随意改动一些代码的内涵任务来确保你的软件是准确并且没有bug(错误)。
在评论更多关于测试的益处之前,先让我们看一个示例。这本书里面一切的测试实例都运用了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,和一个核算发卖税的函数。接着,代码包括了运用SimpleTest框架的必备组件:单体测试自身和一个用来显示测试后果的“reporter”模块。
类TestingTestCase承继于SimpleTest框架的UnitTestCase类。经过扩展UnitTestCase,类TestingTestCase里面一切运用Test开首的办法都将被以为是测试实例——发明前提来调试你的代码并断言后果。
TestingTestCase界说了一个测试,TestSalesTax(),它包括了一个断言函数AssertEqual()。假如它的前两个输入参数是相等的,它将返回true,不然返回false。(假如你想显示assertEqual()掉败的信息,你可以传入三个参数就像如许$this->assertEqual(7,calculate_sales_tax(100), “The sales tax calculation failed”))。
代码的最终两行创立了这个测试实例的实体而且运用一个HtmlReporter运转了它。你可以拜访这个web页面来运转这个简略的测试。
运转这个测试将显示测试称号,掉败断言的具体状况和一个总结条。(绿色的意味着成功(一切的断言都经过了),而赤色的暗示着掉败(至少有一个断言没有经过))
(assertion(断言)在软件开拓中是一种常用的调试方法,良多开拓言语中都支撑这种机制。在完成中,assertion就是在顺序中的一条语句,它对一个boolean表达式进行反省,一个准确顺序必需包管这个boolean表达式的值为true;假如该值为false,阐明顺序曾经处于不准确的形态下,系统将给出正告或退出。普通来说,assertion用于包管顺序最根本、要害的准确性。assertion反省凡间在开拓和测试时开启。为了进步功能,在软件发布后,assertion反省凡间是封闭的。)
注:(assertion(断言)在软件开拓中是一种常用的调试方法,良多开拓言语中都支撑这种机制。在完成中,assertion就是在顺序中的一条语句,它对一个boolean表达式进行反省,一个准确顺序必需包管这个boolean表达式的值为true;假如该值为false,阐明顺序曾经处于不准确的形态下,系统将给出正告或退出。普通来说,assertion用于包管顺序最根本、要害的准确性。assertion反省凡间在开拓和测试时开启。为了进步功能,在软件发布后,assertion反省凡间是封闭的。)
上面的代码有一个(有意的)错误,所以运转是不克不及经过了,显示后果如下:
Calculate_sales_tax()这么一个简略的才一行的函数哪里犯错了呢?你能够曾经留意到这个函数没有返回后果。下面是准确的函数:
function calculate_sales_tax($amount) {
return round($amount * TAX_RATE,2);
}
修正后运转,测试经过。
然则一个简略的测试并不克不及包管代码是不变的。比方,你把calculate_sales_tax()改成 function calculate_sales_tax($amount) { return 7; },代码也会经过测试,但只要当1美元等价于100的时分才是准确的。你可以本人添加一些额定的测试办法来测试其他的静态值。
function TestSomeMoreSalesTax() {
$this->assertEqual(3.5, calculate_sales_tax(50));
}
或许改动函数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()经过。(和办法assertEqual()一样,办法assertTrue()在承受一个可选择性的、额定的后将返回一个掉败的信息)。所以TestRandomValuesSalesTax()起首以为常量TAX_RATE曾经界说了,然后运用这个常量来核算随机选择的的数目的税收。
然则TestRandomValuesSalesTax()也存在一个问题:它很大水平的依靠于办法calculate_sales_tax()。测试是应该和非凡的完成细节无关的。一个更好的测试应该只树立一个合理的分界限。接下来的这个测试假定发卖税永远不会超越20%。
function TestRandomValuesSalesTax() {
$amount = rand(500,1000);
$this->assertTrue(calculate_sales_tax($amount)<$amount*0.20);
}
确保你的代码正常任务是测试的首要的目标,然则在测试你的代码时分,你应该看法到除此之外还有一些额定的,相对非必须的目标:
1.测试让你书写轻易测试的代码。这使得代码松懈耦合,复杂设计,并且具有很好的模块性。
2.测试能让你明晰的调查运转代码的希冀后果,让你从一开端就注重于模块的设计和剖析。经过测试,也会让你思索一切能够的输入和响应的输出后果。
3.测试能很疾速的调查编码的目标。换句话说,测试事例饰演着“实例”和“文档”的功用,精确的展现着若何构建一个类,办法等。在这本书中,我有时分经过一个测试事例来演示代码的希冀功用。经过读取一个测试办法的声明,你可以清晰的调查代码是若何运转的。一个测试实例界说在代码在明白习用法下的运转状况。
最终,假如你的测试集——测试实例的调集——长短常彻底的,并且当一切的测试都经过的时分,你可以说你的代码是齐备的。风趣的是,这个观念也恰恰是Test Driven Development(测试驱动开拓)的特征之一。
Test Driven Development(TDD)也被以为是Test First Coding(编码前测试)。Test First Coding是一种把测试更提早一步的办法:在你写任何代码之前先写好测试。你可以从http://xprogramming.com/xpmag/testFirstGuidelines.htm下载到一份很好的,简练的关于TDD的摘要文章,还下载到一本很好的关于战略的入门书——Kent Beck著作的《Test Driven Development:By Example》(这本书的例子都是用JAVA开拓的,但个中代码的可读性是很好的,并且对主题的引见和阐明都做的很好的)。
注:矫捷开拓(Agile Development)
比来,单体测试——特殊是测绘驱动开拓——曾经和矫捷开拓办法学严密的联络起来了,比方说极限编程(XP)。极限编程的核心存眷于疾速的重复的发步功用性的代码给客户,并把转变的客户需求做为开拓进程中的必备局部。下面是一些关于进修矫捷编程的在线资本:
函数性测试
这本书里面的大局部测试例子都是用来测试面临对象的代码,然则一切方式的编程都可以从中获得收成的。单体测试框架,比方说PHPUnits和SimpleTest,也都能很轻易的用来测试功用函数的。例如上面的SimpleTest例子,它就是用来测试calculate_sales_tax()函数的。世界各地的顺序员们:把单体测试用例放到你的函数库里面吧!
我但愿经由上面的评论后,你也会被带动起来——“测试指导”(Test Infected)!(这个术语,原创于Erich Gamma,具体状况请见文章http://junit.sourceforge.net/doc/testinfected/testing.htm),就象Gamma所写的那样,刚开端你能够会感应测试是很繁琐的,然则当你为你的顺序建立好一个宽广的测试集后,你将你的代码愈加自傲!
- 1站长最常用的两个流量统计 多年使用心得
- 2吃火锅最烦的9种人~你碰到过没得?
- 3讨好百度要大流量选择独立服务器很关键
- 4MES系统对生产型企业的重要
- 5网站微观研究部之一《营销型网站的建立》
- 6探讨搜索引擎是如何识别原创?
- 7挑选网页字体类型的细节
- 8写原创文章的技巧
- 9来了解下制作沙盘时影响沙盘表现效果的因素
- 10电子电器行业ERP软件|深圳电子电器ERP
- 11起初在ECshop建站时遇到问题及解决方法
- 12纳客软件定制开发流程
- 13使用进销存管理软件的理由
- 14域名注册基础知识
- 15毕业答辩的目的与意义
- 16网站优化全过程
- 17纳客连锁会员管服务器相关提问
- 18网站优化需多长时间
- 19如何寻找适合自己的外贸ERP管理系统
- 20seo之外链分析篇
- 21VMware虚拟机下linux不能全屏的解决方法
- 22中文域名狂热未减 市场价值无限攀升
- 23关于虚拟机管理的五个关键性问题
- 24优秀的OA软件应具备的五大特性
- 25关于动态主机配置协议几个常识
- 26开发者需关注的几项Web新技术
- 27脚气病是复发性和传染性很强的皮肤病
- 28网站优化的小技巧
- 29企业如何让ERP系统更加安全
- 30如何选择虚拟主机?