条件减少

Conditions reduction

我正在计算订单收据显示的付款金额,我想将这些条件减少到最大值:

private double CalculateFinalTotal(bool hasPrommoCode, 
                                   double promoCodeValue, 
                                   double finalTotal, 
                                   double? tip)
{
    if (!hasPrommoCode) return finalTotal;
    if (promoCodeValue > finalTotal && tip.HasValue) return tip.Value;
    else if (promoCodeValue > finalTotal) return 0;
    else if (tip.HasValue)
    {
        var totalWithoutTip = finalTotal - tip.Value;
        return (totalWithoutTip > promoCodeValue ? totalWithoutTip - promoCodeValue : 0) + tip.Value;
    }
    else return finalTotal - promoCodeValue;
}

首先,never use double for money-related code, always use decimal.

除此之外,您可以使用 GetValueOrDefault() 省略检查 tip 是否有值。并且,遵循 c# 约定(如果您真的关心可读性),始终在 if 语句周围使用方括号。

你应该得到这样的结果:

private decimal CalculateFinalTotal(bool hasPrommoCode, decimal promoCodeValue, 
                                   decimal finalTotal, decimal? tip)
{
    if (!hasPrommoCode) 
    {
        return finalTotal;
    }

    if (promoCodeValue > finalTotal) 
    {
        // if .HasValue == true => return .Value; otherwise return 0
        return tip.GetValueOrDefault();
    }

    if (tip.HasValue)
    {
        var totalWithoutTip = finalTotal - tip.Value;
        return (totalWithoutTip > promoCodeValue ? totalWithoutTip - promoCodeValue : 0) + tip.Value;
    }

    return finalTotal - promoCodeValue;
}