最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • php教程:php设计模式之编程惯用法

    请先阅读上一篇文章

    重构

    即使最有思想性且最熟练的程序员也不能预见一个软件项目中的任何细微之处。问题总是出乎意外的出现,需求也可能在变化,结果是代码被优化,共享然后代替。

    重构是一个惯用的方法:检查你所有的代码,找出其中能统一化和简单化的共同或者类似之处,使得你的代码更加容易维护和扩展。重构也包括探索一个设计模式是否能够应用到这个具体的问题上——这也能使解决方案简单化。

    重构,简单点说是重命名一个属性或者方法,复杂点说是压缩一个已有的类。改变你的代码使得它符合一个或者更多的设计模式是另外一种重构——读完这本书后,你可能会去实现的。

    没有什么能比例子来更好的解释重构了!

    让我们考虑两个简单的类:CartLine和Cart。CartLine记录了购物车里面每个项目的单件价格和数量。比如CartLine可能记录着“四见红色的polo衬衣,每件19.99$”。Cart 是一个容器,用来装载一个或者更多的CartLine对象并执行一些相关的计算工作,比如购物车里面的所有商品的总花费。

    下面是CartLine和Cart的简单实现: 

    // PHP5
    class CartLine {
    public $price = 0;
    public $qty = 0;
    }
    class Cart {
    protected $lines = array();
    public function addLine($line) {
    $this->lines[] = $line;
    }
    public function calcTotal() {
    $total = 0;
    // add totals for each line
    foreach($this->lines as $line) {
    $total += $line->price * $line->qty;
    }
    // add sales tax
    $total *= 1.07;
    return $total;
    }
    }

    重构的第一步必须有足够的测试来覆盖你所有的代码。这样才能保证你修改的代码不能产生和你原来代码不同的结果。顺便提一下,除非你改变了需求(你代码期望的结果)或者在测试实例中发现了错误,你的测试代码是是不能改变的。

    下面是一个测试CartLine和Cart的例子,它在重构的过程中是不会改变的。

    function TestCart() {
    $line1 = new CartLine;
    $line1->price = 12; $line1->qty = 2;
    $line2 = new CartLine;
    $line2->price = 7.5; $line2->qty = 3;
    $line3 = new CartLine;
    $line3->price = 8.25; $line3->qty = 1;
    $cart = new Cart;
    $cart->addLine($line1);
    $cart->addLine($line2);
    $cart->addLine($line3);
    $this->assertEqual(
    (12*2 + 7.5*3 + 8.25) * 1.07,
    $cart->calcTotal());
    }
     
    看着上面的代码,你可能会发现它们有一些“code smells”(代码臭味)——有着古怪的样子而且看起来好像是有问题的代码——它们就像重构的候选项。(更多关于code smells的资料请看http://c2.com/cgi/wiki?codesmell)。两个最直接的重构候选者是注释和计算(与销售税等相关的计算)。重构的一种形式:析取函数(Extract Method)将把这些难看的代码从cart::calcTotal()中提取出来,然后用一个合适的方法来替代它,从而使得代码更加简洁。

    比如,你可以增加两个计算方法:lineTotal()和calcSalesTax():

    protected function lineTotal($line) {
    return $line->price * $line->qty;
    }
    protected function calcSalesTax($amount) {
    return $amount * 0.07;
    }
     
    现在你可以重写calcTotal()函数:

    public function calcTotal() {
    $total = 0;
    foreach($this->lines as $line) {
    $total += $this->lineTotal($line);
    }
    $total += $this->calcSalesTax($total);
    return $total;
    }
     
    到目前为止的改动都是有意义的(至少在这个例子的上下文中),它对于再次暂停和运行这些代码来验证结果依然正确是很有帮助的。记得,一个绿色的成功条的显示出来了!(译者注:本章开始时,作者提及到:绿色的条意味着测试都通过了。)

    然而,目前的代码依然有一些可以挑剔的地方。其中一个就是在新方法lineTotal()中存取公共属性。很明显计算每行的之和的责任不应该属于Cart类,而应该在类CartLine里面实现。

    再次重构,在CartLine中增加一个新的方法total()用来计算订单里面的每个项目的长期价钱。

    public function total() {
    return $this->price * $this->qty;
    }
     
    然后从类Cart中移除方法lineTotal(),并改变calcTotal()方法来使用新的cartLine::Total()方法。重新运行这个测试,你依然会发现结果是绿色条。 

    全新重构后的代码就是这样:

    class CartLine {
    public $price = 0;
    public $qty = 0;
    public function total() {
    return $this->price * $this->qty;
    }
    }
    class Cart {
    protected $lines = array();
    public function addLine($line) {
    $this->lines[] = $line;
    }
    public function calcTotal() {
    $total = 0;
    foreach($this->lines as $line) {
    $total += $line->total();
    }
    $total += $this->calcSalesTax($total);
    return $total;
    }
    protected function calcSalesTax($amount) {
    return $amount * 0.07;
    }
    }
     
    现在这代码不再需要每行注释了,因为代码本身更好的说明了每行的功能。这些新的方法,更好的封装了计算这个功能,也更加容易适应将来的变化。(比如说,考虑不同大的销售税率)。另外,这些类也更加平衡,更容易维护。

    这个例子显然是微不足道的,但是希望你能从中推断并预想出如何重构你自己的代码。

    在编码的时候,你应该有出于两种模式中的一种:增加新的特征或者重构代码。当在增加特征的时候,你要写测试和增加代码。在重构的时候,你要改变你原有的代码,并确保所有相关的测试依然能正确运行。 
    关于重构的主要参考资料有Martin Fowler著作的《重构:改进原有代码的设计》(Refactoring:Improving the Design of Existing Code)。用一些精简点来总结Fowler的书,重构的步骤如下所示: 

    定义需要重构的代码
    有覆盖所有代码的测试
    小步骤的工作
    每步之后都运行你的测试。编码和测试都是相当重复的——和编译型语言相比,解释型语言,比如PHP是容易很多的。
    使用重构来使你的代码有更好的可读性和可修改性。 

    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » php教程:php设计模式之编程惯用法

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级