php教程:php设计模式之编程惯用法(2)_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

php教程:php设计模式之编程惯用法(2)

作者:黑客防线网安PHP教程基地 来源:黑客防线网安PHP教程基地 浏览次数:0

本篇关键词:用法编程教程代码
黑客防线网安网讯:  WebjxCom提示:php教程:php设计模式之编程惯用法.    重构    即使最有思想性且最熟练的程序员也不能预见一个软件项目中的任何细微之处。问题总是出乎意外的出现,需求也可能在...
  WebjxCom提示:php教程:php设计模式之编程惯用法.
  
  重构
  
  即使最有思想性且最熟练的程序员也不能预见一个软件项目中的任何细微之处问题总是出乎意外的出现需求也可能在变化结果是代码被优化,共享然后代替
  
  重构是一个惯用的方法:检查你所有的代码,找出其中能统一化和简单化的共同或者类似之处,使得你的代码更加容易维护和扩展。重构也包括探索一个设计模式是否能够应用到这个具体的问题上——这也能使解决方案简单化。
  
  重构,简单点说是重命名一个属性或者方法,复杂点说是压缩一个已有的类。改变你的代码使得它符合一个或者更多的设计模式是另外一种重构——读完这本书后,你可能会去实现的。
  
  没有什么能比例子来更好的解释重构了!
  
  让我们考虑两个简单的类:CartLine和Cart。CartLine记录了购物车里面每个项目的单件价格和数量。比如CartLine可能记录着“四见红色的polo衬衣,每件19.99$”。Cart是一个容器,用来装载一个或者更多的CartLine对象并执行一些相关的计算工作,比如购物车里面的所有商品的总花费。
  
  下面是CartLine和Cart的简单实现:
  
  //PHP5
  
  classCartLine{
  
  public$price=0;
  
  public$qty=0;
  
  }
  
  classCart{
  
  protected$lines=array();
  
  publicfunctionaddLine($line){
  
  $this->lines[]=$line;
  
  }
  
  publicfunctioncalcTotal(){
  
  $total=0;
  
  //addtotalsforeachline
  
  foreach($this->linesas$line){
  
  $total+=$line->price*$line->qty;
  
  }
  
  //addsalestax
  
  $total*=1.07;
  
  return$total;
  
  }
  
  }
  
  重构的第一步必须有足够的测试来覆盖你所有的代码。这样才能保证你修改的代码不能产生和你原来代码不同的结果。顺便提一下,除非你改变了需求(你代码期望的结果)或者在测试实例中发现了错误,你的测试代码是是不能改变的。
  
  下面是一个测试CartLine和Cart的例子,它在重构的过程中是不会改变的。
  
  functionTestCart(){
  
  $line1=newCartLine;
  
  $line1->price=12;$line1->qty=2;
  
  $line2=newCartLine;
  
  $line2->price=7.5;$line2->qty=3;
  
  $line3=newCartLine;
  
  $line3->price=8.25;$line3->qty=1;
  
  $cart=newCart;
  
  $cart->addLine($line1);
  
  $cart->addLine($line2);
  
  $cart->addLine($line3);
  
  $this->assertEqual(
  
  (12*2+7.5*3+8.25)*1.07,
  
  $cart->calcTotal());
  
  }
  
  看着上面的代码,你可能会发现它们有一些“codesmells”(代码臭味)——有着古怪的样子而且看起来好像是有问题的代码——它们就像重构的候选项。(更多关于codesmells的资料请看cgi/wiki?codesmell">http://c2.com/cgi/wiki?codesmell)。两个最直接的重构候选者是注释和计算(与销售税等相关的计算)。重构的一种形式:析取函数(ExtractMethod)将把这些难看的代码从cart::calcTotal()中提取出来,然后用一个合适的方法来替代它,从而使得代码更加简洁。
  
  比如,你可以增加两个计算方法:lineTotal()和calcSalesTax():
  
  protectedfunctionlineTotal($line){
  
  return$line->price*$line->qty;
  
  }
  
  protectedfunctioncalcSalesTax($amount){
  
  return$amount*0.07;
  
  }
  
  现在你可以重写calcTotal()函数:
  
  publicfunctioncalcTotal(){
  
  $total=0;
  
  foreach($this->linesas$line){
  
  $total+=$this->lineTotal($line);
  
  }
  
  $total+=$this->calcSalesTax($total);
  
  return$total;
  
  }
  
  到目前为止的改动都是有意义的(至少在这个例子的上下文中),它对于再次暂停和运行这些代码来验证结果依然正确是很有帮助的。记得,一个绿色的成功条的显示出来了!(译者注:本章开始时,作者提及到:绿色的条意味着测试都通过了。)
  
  然而,目前的代码依然有一些可以挑剔的地方。其中一个就是在新方法lineTotal()中存取公共属性。很明显计算每行的之和的责任不应该属于Cart类,而应该在类CartLine里面实现。
  
  再次重构,在CartLine中增加一个新的方法total()用来计算订单里面的每个项目的长期价钱。
  
  publicfunctiontotal(){
  
  return$this->price*$this->qty;
  
  }
  
  然后从类Cart中移除方法lineTotal(),并改变calcTotal()方法来使用新的cartLine::Total()方法。重新运行这个测试,你依然会发现结果是绿色条。
  
  全新重构后的代码就是这样:
  
  classCartLine{
  
  public$price=0;
  
  public$qty=0;
  
  publicfunctiontotal(){
  
  return$this->price*$this->qty;
  
  }
  
  }
  
  classCart{
  
  protected$lines=array();
  
  publicfunctionaddLine($line){
  
  $this->lines[]=$line;
  
  }
  
  publicfunctioncalcTotal(){
  
  $total=0;
  
  foreach($this->linesas$line){
  
  $total+=$line->total();
  
  }
  
  $total+=$this->calcSalesTax($total);
  
  return$total;
  
  }
  
  protectedfunctioncalcSalesTax($amount){
  
  return$amount*0.07;
  
  }
  
  }
  
  现在这代码不再需要每行注释了,因为代码本身更好的说明了每行的功能。这些新的方法,更好的封装了计算这个功能,也更加容易适应将来的变化。(比如说,考虑不同大的销售税率)。另外,这些类也更加平衡,更容易维护。
  
  这个例子显然是微不足道的,但是希望你能从中推断并预想出如何重构你自己的代码。
  
  在编码的时候,你应该有出于两种模式中的一种:增加新的特征或者重构代码。当在增加特征的时候,你要写测试和增加代码。在重构的时候,你要改变你原有的代码,并确保所有相关的测试依然能正确运行。
  
  关于重构的主要参考资料有MartinFowler著作的《重构:改进原有代码的设计》(Refactoring:ImprovingtheDesignofExistingCode)。用一些精简点来总结Fowler的书,重构的步骤如下所示:
  
  定义需要重构的代码
  
  有覆盖所有代码的测试
  
  小步骤的工作
  
  每步之后都运行你的测试。编码和测试都是相当重复的——和编译型语言相比,解释型语言,比如PHP是容易很多的。
  
  使用重构来使你的代码有更好的可读性和可修改性。
  
  
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-17385-1.html
网站维护教程更新时间:2012-09-21 05:17:51  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer