菜单

重构手法之简化条件表明式【一】

2019年5月9日 - 金沙编程资讯

一Decompose Conditional(分解条件表达式)

概要

你有三个繁杂的标准化(if-else
if-else)语句。

从if、else
if、else七个段落中分头提炼出独立函数。

表率:使用逻辑与

class Rate
{
    public double GetRate()
    {
        if (OnVacation())
        {
            if (LengthOfService() > 10)
            {
                return 1;
            }
        }
        return 0.5;
    }
    private bool OnVacation()
    {
        return true;
    }
    private int LengthOfService()
    {
        return 9;
    }
}

这段代码能够成为那样:

class Rate
{
    public double GetRate()
    {
        if (OnVacation() && LengthOfService() > 10)
        {
            return 1;
        }
        return 0.5;
    }
    private bool OnVacation()
    {
        return true;
    }
    private int LengthOfService()
    {
        return 9;
    }
}

假使所观看的1部分只是对规则进行反省并回到一个值,就能够动用安慕希操作符将这一部分改为一条return语句。由此,下列代码:

if (OnVacation() && LengthOfService() > 10)
{
    return 1;
}
return 0.5;

就改成了:

return (OnVacation() && LengthOfService() > 1) ? 1 : 0.5;

范例

要是要总结购买某样商品的总价,而以此商品在九冬和三夏的单价是见仁见智的:

class Order
{
    public double Quantity { get; set; }

    public double WinterRate { get; set; }

    public double SummerRate { get; set; }

    public double WinterServiceCharge { get; set; }

    public double GetCharge(DateTime date)
    {
        double result;
        if (date.Month < 3 || date.Month > 6)
        {
            result = Quantity * WinterRate + WinterServiceCharge;
        }
        else
        {
            result = Quantity * SummerRate;
        }
        return result;
    }

}

目前把各样分支的剖断标准都提炼到1个单独函数中:

class Order
{
    public double Quantity { get; set; }

    public double WinterRate { get; set; }

    public double SummerRate { get; set; }

    public double WinterServiceCharge { get; set; }


    public double GetCharge(DateTime date)
    {
        double result;
        if (NotSummer(date))
        {
            result = WinterCharge(Quantity);
        }
        else
        {
            result = SummerCharge(Quantity);
        }
        return result;
    }

    private bool NotSummer(DateTime date)
    {
        return date.Month < 3 || date.Month > 6;
    }
    private double SummerCharge(double quantity)
    {
        return quantity * SummerRate;
    }

    private double WinterCharge(double quantity)
    {
        return quantity * WinterRate + WinterServiceCharge;
    }
}

通过这段代码可看到整个重构带来的清晰性。

小结

澳门金沙js55 ,像上边那样的意况,很四人都不会去提炼分支条件。因为这个分支条件往往十分长,看上去仿佛并没有提炼的必不可缺。可是,就算这个原则往往极短,在代码意图和代码自己之间数十二次存在非常的大的不一致。就像上边那样,NotSummer(date)这么些语句比原来的代码更加好地发挥友好的盘算。原来的代码,作者无法不看看,想1想,才干揭破其成效。当然了,这里看起来就如很轻便。固然是如此,提炼出来的函数可读性也越来越高级中学一年级些。

金沙线上娱乐官网 ,轨范:使用逻辑或

class Amount
{
    public int Seniority { get; set; }

    public int MonthsDisabled { get; set; }

    public bool IsPartTime { get; set; }

    double DisablilityAmount()
    {
        if (Seniority < 2)
        {
            return 0;
        }
        if (MonthsDisabled > 12)
        {
            return 0;
        }
        if (IsPartTime)
        {
            return 0;
        }
        //compute the disability amount
        //your code here
        return 1;
    }
}

这段代码中,一种类的基准检查都在做同一件工作。对于这么的代码,上述检查等价于三个以逻辑或连接起来的言辞:

class Amount
{
    public int Seniority { get; set; }

    public int MonthsDisabled { get; set; }

    public bool IsPartTime { get; set; }

    double DisablilityAmount()
    {
        if (Seniority < 2 || MonthsDisabled > 12 || IsPartTime)
        {
            return 0;
        }
        //compute the disability amount
        //your code here
        return 1;
    }
}

近些日子,大家入眼那些新的原则表明式,并选拔Extract
Method将它提炼成3个独立函数,以函数名称表达该语句所检查的规格:

class Amount
{
    public int Seniority { get; set; }

    public int MonthsDisabled { get; set; }

    public bool IsPartTime { get; set; }

    double DisablilityAmount()
    {
        if (IsNotEligibleForDisability())
        {
            return 0;
        }
        //compute the disability amount
        //your code here
        return 1;
    }

    bool IsNotEligibleForDisability()
    {
        return Seniority < 2 || MonthsDisabled > 12 || IsPartTime;
    }
}

动机

代码里平时有如此的自己争辨:检查标准各差别样,最后表现却同样。借使开掘这种场地,应该利用“逻辑与”和“逻辑或”将它们统1为3个口径表明式。

故此合并条件代码,有七个原因。(一)合并后的规格代码会报告您“实际上唯有二遍口径检查,只可是有八个并列条件亟待检讨而已”,从而使这一遍检查的盘算更明显。(贰)那项重构往往是为着利用金沙线上 ,Extract
Method抓实希图。

回到总目录

动机

复杂的条件逻辑往往会导致程序复杂度回涨。编写代码来检查差别的规格分支、根据分裂的分支做不相同的事往往又会促成函数过长。

将典型表达式分解为多个独立函数,依据种种小块代码的用途,为表达而得的新函数命名,并将原函数中对应的代码改为调用新建函数,从而更领悟地球表面明友好的用意。对于条件逻辑,将各类分支条件分解成新函数还足以优良条件逻辑,更明了地方统一标准明各类分支的效用,并且杰出每一个分支的来头。

概要

你有1层层条件测试,都拿走平等结果。

将那么些测试合并为三个规则表明式,并将以此规则表达式提炼成为四个单独函数。

本小节目录

2Consolidate Conditional Expression(合并条件表达式)

小结

那我们如什么日期候无需统一表明式呢?

即大家感到那几个检查确实相互独立,的确不应有被视为等同次检查,那就不选拔本项重构。

 

 

To Be Continued…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图