zoukankan      html  css  js  c++  java
  • 《重构-改善既有代码的设计》学习笔记---Replace Temp with Query(以查询取代临时变量)

    临时变量的问题在于:

    它们是暂时的,而且只能在所属函数内使用。由于临时变量只在所属函数内可见,所以,如果很多地方都在用这个临时变量,就会驱使你写出更长的函数。如果把临时变量替换为一个查询,那么其他函数中都可以获得这份信息。

    以查询取代临时变量是提炼函数之前必不可少的一个步骤。局部变量会使代码难以被提炼,所以应该尽可能把他们替换为查询式。

    这个重构手法较为简单的情况是:临时变量只被赋值一次或者赋值给临时变量的表达式不受其他条件影响。

    示例:

    初始代码为(2个临时变量):

    function getPrice () {
        var basePrice = _quantity * _itemPrice;
        var discountFactor;
        if(basePrice > 100){
            discountFactor = 0.95;
        } else {
           iscountFactor = 0.98;
        }
        return basePrice * discountFactor;
    }        

    1、把赋值动作的右侧表达式提炼出来

    function getPrice () {
        var basePrice = basePrice();
        var discountFactor;
        if(basePrice > 100){
            discountFactor = 0.95;
        } else {
           iscountFactor = 0.98;
        }
        return basePrice * discountFactor;
    } 
    
    function basePrice () {
        return  _quantity * _itemPrice;
    }

    2、替换临时变量的引用点,,并删除临时变量的声明。

    function getPrice () {
        var discountFactor;
        if(basePrice() > 100){
            discountFactor = 0.95;
        } else {
           iscountFactor = 0.98;
        }
        return basePrice() * discountFactor;
    } 
    
    function basePrice () {
        return  _quantity * _itemPrice;
    }

    3、用类似的办法,提炼另外一个临时变量

    function getPrice () {
        return basePrice() * discountFactor();
    } 
    
    function basePrice () {
        return  _quantity * _itemPrice;
    }
    
    function discountFactor () {
         if(basePrice() > 100){
            return 0.95;
        } else {
          return 0.98;
        }
    }

    如果没有把basePrice替换为一个查询式,很难提炼discountFactor(),需要手动传入basePrice作为参数。

    个人感悟:

    以一个临时变量保存某一表达式的运算结果,如果这个临时变量在多个地方用到,可以考虑用此方法,将表达式提炼到一个独立函数中。

  • 相关阅读:
    Vim直接打开Tampermonkey网址的方法。
    利用 Tampermonkey 和 Surfingkeys 效率操作网页
    tampermonkey利用@require调用本地脚本的方法
    用AutoHotkey一键完成Xmind插入图片等功能
    用AutoHotkey调整Windows音量
    用AutoHotkey重置Excel的Ctrl+Alt+方向键选择的范围
    远程终端协议TELNET
    文件传送协议
    域名系统DNS
    计算机网络运输层习题5-38
  • 原文地址:https://www.cnblogs.com/happypayne/p/8384477.html
Copyright © 2011-2022 走看看