php设计模式-中级
php设计模式-中级
在上一次的介绍了c的编程的一些方法,今天就重点的说一下php的设计的一些方法。
首先,php是采用c来开发的,他们有很多的相似的地方,特别是在编码的方面,我想这也是因为开发php的人主要是作c的把,把他们的编码习惯也映射到了php中,可是他们最主要的区别在于c是编译的,用中间代码生成,而php是解释型的,没有中间代码的生成,为此,使用c的一些方法对于php就不是很合适,所以今天的就合上一篇的文章的差异就大一些。
这篇文章主要从下边的几点来分别的详细说明:
1 测试在前。
1.1 测试的目的
一般的在任何一种编程语言中,他们的编译器或者是解释器,在程序运行的时候只是检查他们限定的或者是语法的错误,不能对项目需求或 者是别的地方进行检查,可能会给程序带来未知的bug。我们测试的目的不旦旦是为了检验我们的程序是不是可以运行,可以完成模一项功能,更重要的是对现在使用的编译器或者是解释器的一种补充,检验代码的安全,排除未知的bug,保证程序的健壮性,同时也涵盖了对程序的可运行和功能的检查。
极限编程的爱好者们把测试在前的编码这种方式在项目的开发中使用,并且去得了很好的效果,还有很多的人在追捧他,所以对他的使用也是五花八门,在这里我部做过多的介绍,只是使用极限编程的一个很重要的地方TDD,中文意思是测试驱动,这种方式要求我们在编码之前,对需求分析进行准确把我之后,这一段时间,根据需求分析的要求,对程序的功能,可能遇到的边界值,错误输入等一系列的问题进行提前的思考,然后做成测试的用例,程序原根据要就编写代码,在运行程序的时候自动的运行测试用例,根据测试用例的输出结果判断程序的正确性等要求。
1.2 测试的方法
php的测试就现在而言,主要是在开发之后对程序的运行结果(页面和数据库的结果的进行检查,而且是手工的)进行检查,这样的不好之处在于,测试在后,在测试的结果出来之前,程序原已经做了大量的工作,如果测试的结果错误较多,对代码的修改就会更多,程序员在修改代码的时候是一种被动的行为,加上些代码和测试后修改的时间间隔,思维就会和些代码的时候有较大的不同,这就可能带来新的未知的错误,并且在时间上又是一种浪费,如果测试在前的话,每一次的单元测试都运行测试用例,程序员是在编码的同时对程序进行测试,思维还是很清楚的情况下,带来的好处会更多。
这就是为什么要在编码之前就编写测试用例的原因。那么我们该如何的编写测试那,下面我就下一个简单的测试用例,方便大家参考。
假设有一个处理文件上传的upFile函数文件,要求上传的文件的大小不得大于1M,文件类型是jpg格式,文件保存在../img的文件夹下,如果正常的话就返回TRUE,否则返回FALSE,具体的文件上传的php文件就不编写,相信大家都会,我在这里仅仅的便从、些如何测试这个文件。具体看代码清单1.1
/**
code 1.1
@文件名: test.php
@作者: 耿鸿飞
@日期: 2007-4-20
@描述: 对上传文件upFile()方法的检验。
*/
<?php
include(“upFile.inc“);
defined("len",1024*1024);
$size = $_FILE[‘upfile’][‘size’];
$type = $_FILE[‘upfile’]["type"];
if($size > len || $type != "jpg")
{
if(upFile())
{
echo "no litmit upFile size or type";
}
}
if(!upFile())
{
echo "right file size and type , but not save upFile ,pleace check you FUNCTION upFile()";
}
else
{
if(exist("../img/$_FILE['name']"))
{
//检查保存后文件的大小和类型,书否和要求一致。然后输出相应的字符。
}
}
echo <<<EOF
<html>
...
<file name=upfile>
...
</html>
EOF;
?>
在写完程序之后直接的在浏览器中输入http://127.0.0.1/test.php,然后上传文件进行测试,其实这一种的测试方法还是很不方便,还要不断的进行测试,有没有更好的办法那,其实是有的,你可以在相应的目录建立一些符合要求和不符和要求的文件,然后在测试文件中,对$_FILE['upfile']不断的进行赋值,然后执行上边的代码,就可以验证所有的输入,做到全面的测试了,有兴趣的朋友可以自己些这些代码。我在这里就不在写了。
2 编码要求
编码是对程序的实现工作,一般每一个公司都有自己一套的编码规范,要做到统一是不容易的,所以你在公司的编码就要符合公司的要求,一般的规范是骆驼命名发,但是在使用常量的时候和c语言的定义宏一样,全部大写,单词之间用_,类的命名和java一样,第一个单词的首字母大写,然后就是骆驼命名法的规则。当然要根据自己的情况而定了,这样作的目的主要是为了以后的维护,使用一种好的统一的命名方法,可以方便的对程序进行维护。
3 文件调用
3.1 文件调用的好处
php的include等方法和c语言的include的功能一样,是在文件的这个位置使用包含的文件的代码来替换他们,但是php的一些方法如果从父就会替换前边的定义,有时候还可能出现别的问题,特别是在文件的反复调用的情况下,比如A调用了B文件,C文件也掉用了B文件,然后c文件又调用了A和B文件,如果是使用的include函数,这样的话就更容易出现问题了,但是php还提供了include_once()等方法,让这样的代码只出现一次,这就类似于c语言的下边的定义,
#ifndef LIB_H
#include "lib.h"
#endif //LIB_H
这样就避免了代码的重复。
php之所以提供这样的函数是为了公用代码的分离,减少工作量,提高开发的效率,比如说,程序中要经常的和数据库进行连接,如果每一个页面都要新建的话就会增加一段代码,但是如果把数据库的连接专门的提取出来,然后在每一个需要和数据库连接的程序中直接的调用数据库连接文件的话,就减少了很多不必要的编码工作,在项目的开发过程中,常常有很多的相同的代码,只要把他们提取出来,就会减少很多的编码工作,这就很大程度上提高了开发效率,缩短了开发时间。
3.2 文件调用可能遇到的问题
使用文件的包含虽然可以提高效率,加大程序的耦合性,但是不一定会给我们的程序带来好的运行效率,因为php的这种方式使用文件操作,把要包含的文件读取出来,然后在当前的位置显示,他的这种特性和c语言#include有不同,以为c语言是把文件替换之后然后编译成中间文件,也就不存在反复的读取文件的问题了。但是php是解释型的,在每一次的执行的时候都要去读取文件,然后替换,但是,加入我们有一个程序很复杂,有很多的业务逻辑要处理,我们可能需要包含大量的文件,这样一个程序需要反复的去读取文件,执行的效率必然会要影响,还有变量的命名可能就会有重复的,造成程序的不可知的错误,如何解决这个问题请看3.3平衡文件调用的策略。
3.3 平衡文件调用的策略
上边对文件包含的优点和确定进行了分析,那么到底该如何的平衡这种关系那,这里可以给出一个简单的办法,程序的包含文件一般不超过5个,这样就可以把一般常用到的文件抽象出来,然后写成文件的形式,文件要尽量的断,最好不要超过500行,或者是一个文件就实现一个功能,如果程序的业务逻辑很复杂,要用到很多的文件,我们己考虑这样复杂的程序是不是很多,如果很多的话,我们就按照文件的作用,把多个文件和并称一个文件,然后在程序中调用,如果这样复杂的程序很少很少,我们可以把其他的文件直接到拷贝到这个程序中,减少文件的操作,以次提高程序的效率。
4 使用面相对象
4.1 使用面相对象好处
面相对象的好处很多,介绍的也很多,在这里我不做介绍,如果你对面相对象不是很了解,建议你去网上查找相关的资料。
4.2 使用面相对象容易忽略的问题
在使用面向对象的使用过程中,即使很有经验的开发人员也可能会犯的错误就是对象的传递是引用的,其实很多的面相对象的语言都是这种的方式,包括java,php等,他们在方法的参数如果是对象的话,如果在方法中对对象的属性进行设置,就会影响到原有的对象,在大多数的面向对象的语言中都有相应的方法来实现对对象的拷贝,比如java是使用对象对Object对象的copy方法经覆盖来实现的,php就可以直接的编写cone来实现,为此,在我们使用对象传递参数,同时又不希望在该方法中对该对象的修改影响到原对象的时候一定要把对象的拷贝传递进来,即在方法调用前对对象进行拷贝,传给方法的是该对象的拷贝就可以了。
5 优化代码
5.1 时间优化
对于时间的优化我们需要考虑的是这个程序如果正常的退出需要运行到少条语句,看清来好像不容易的对他进行优化,其实不然,我们要对程序的运行时间进行优化可以给出一些简单的策略:1,对于需要反复进行的运算进行预处理,比如,一个网上商城,假设有100种商品,他们对于特定会员的打折幅度是不一样的,还要根据会员的积分来相应的优惠,一个vip会员一次购买了20种商品,在他要去结帐的时要进行计算总得价格,如果你去按照如下的代码去写的话效率就不是很高
<?php
$jiFen =100;
$zhekou = 0.37;
$sum=0;
for($price as $product)
{
$sum = $jiFen/10*$zhekou*$price;
}
echo $sum;
?>
上边的代码是非常的糟糕的,为什么那?在进行计算的时候要反复的在循环中进行计算工作,现在我们来对他进行优化,砍下变得代码
<?php
$jiFen =100;
$zhekou = 0.37;
$jiFen = $jiFen/10*$zhekou;
$sum=0;
for($price as $product)
{
$sum = $jiFen*$price;
}
echo $sum;
?>
在经过这样的修改之后的效率就会很大的提高。
2。如果两个循环可以合并的话,尽量的把他们合并到一个循环当中。
3。在对文件进行操作的时候在读取的时候不要一个字符一个字符的读取,尽量的一次读取一行或者是更多。
5.2 内存优化
内存优化是用尽量少的变量来处理程序,这需要熟练的运用数据结构,这里不说了,有兴趣的朋友请参考数据结构方面的书籍。
php设计模式-中级相关推荐
- 软考中级软件设计师--7.设计模式
设计模式 参考 https://www.yuque.com/saodai/ss8tp9 B站视频 我这里只是个做个笔记,设计模式最好结合UML 类图并且结合实际代码学习,最好还是看上边视频中相关内容 ...
- 【软件设计师中级】设计模式之抽象工厂学习笔记(c++)
本文适合新手和小白 目录 1.Absstract Factrory (1)意图 (2)结构 (3)适用性 2.看类图写码 (1)利用泛化关系 (2)利用c++多态的特点 (3)利用依赖关系 (4)UM ...
- 从Java类库看设计模式
//From http://www.uml.org.cn/j2ee/201010214.asp 很多时候,对于一个设计来说(软件上的,建筑上的,或者它他工业上的),经验是至关重要的.好的经验给我们以指 ...
- asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】
asp.net2.0学习历程 菜鸟到中级程序员的飞跃 --30本好书点评 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.5.1 ...
- 代码规范+设计模式落地之路
欢迎关注方志朋的博客,回复"666"获面试宝典 | 前言 刚刚与同事开了一个分享会,笔者分享了一些了代码设计模式相关的内容. 以及复盘了一下项目中有些复杂的业务场景,为什么没有很好 ...
- asp.net2.0学习历程 菜鸟到中级程序员的飞跃
如果你是一个菜鸟或者自认为初学者那么本文非常适合你: 不能说这30本书就是最佳组合,但是可以说这个组合不差: 本人曾博览群书,很多书重复,很多书讲的不适用,这些书都是目前书店可以买到的: 达到中级程序 ...
- 抽象工厂和工厂设计模式之间有什么区别?
我知道有很多关于这两种模式之间差异的帖子,但有一些我找不到的东西. 从我一直在阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但是从客户端隐藏实现,因为他们将看到通用产品. 我的第一个 ...
- 大话设计模式(十四 设计模式不能戏说!设计模式怎就不能戏说?)
(续上篇) 次日,小菜来到大鸟处. "大鸟,你在写什么东西?"小菜看到大鸟的电脑上开着记事本. "哦,我打算写篇博客,名字就叫<设计模式 ...
- android id设计模式,Android与设计模式话题
话题背景 随着移动互联网的快速发展,需求大量Android开发人员,很多程序开发者涌入Android应用开发领域.但是目前Android应用开发者技术水平良莠不齐,导致应用在使用时产生大量不必要的垃圾 ...
最新文章
- 使用 LSTM 进行多变量时间序列预测的保姆级教程
- Windows查看端口被占用的程序!
- 12月22日 find命令
- centos 5.4 x64 安装nagios 3.2.3
- windows SVN服务器软件
- vue中央事件总线eventBus的简单理解和使用
- Codeforces Round #673 (Div. 2)——待补 E
- pytorch —— 正则化之Dropout
- (32)FPGA面试技能提升篇(EMMC)
- 用doss进入mysql_一键连接给你省了多少事_DOSS 听吧_音频评测-中关村在线
- 行业报告:医疗数据泄露愈发严重,谁之过错?
- 【weiphp微信开发教程】留言板插件开发详解
- Apizza在线接口调试文档工具如何方便的设置线上线下环境变量
- 【单片机】数码管显示器仿真
- crc 校验错误_信道编码之循环冗余校验(CRC)
- “使用达芬奇软件实现Autosar架构:配置和注意事项“
- js实现人物移动(附有全部代码以及解析)
- typescript学习之函数
- Java中未加入修饰符_(整理)java修饰符
- 积分和微分电路结构原理带Multisim仿真