首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现SOLID - C#

实现SOLID - C#
EN

Code Review用户
提问于 2017-08-30 08:39:13
回答 3查看 1.4K关注 0票数 -3

希望使用坚实的原则以简化的方式编写此代码。任何帮助都是高度appreciated.Can的--我实现了继承。

代码语言:javascript
复制
void CalculateTaxAndRewardPoints()
        {
            if (state == TEXAS)
            {
                rate = TX_RATE;
                amt = baseRate * TX_RATE;
                calc = 2 * basis(amt) + extra(amt) * 1.05;
            }
            else if ((state == OHIO) || (state == MAINE))
            {
                if (state == OHIO)
                    rate = OH_RATE;
                else
                    rate = MN_RATE;
                amt = baseRate * rate;
                calc = 2 * basis(amt) + extra(amt) * 1.05;
                if (state == OHIO)
                    points = 2;
            }
            else
            {
                rate = 1;
                amt = baseRate;
                calc = 2 * basis(amt) + extra(amt) * 1.05;
            }
        }
EN

回答 3

Code Review用户

发布于 2017-08-30 09:08:10

我建议不要使用像SOLID这样的“酷”字来操作,只需要改进现有的代码。我不知道像TEXASOHIO这样的类型常量是什么类型的,所以我会用枚举来表示状态。您的代码可以简化为(使用C#7):

代码语言:javascript
复制
private static readonly Dictionary<State, double> Rates =
    new Dictionary<State, double>
    {
        [State.Texas] = TexasRate,
        [State.Ohio] = OhioRate,
        [State.Maine] = MaineRate
    };

public void CalculateTaxAndRewardPoints()
{
    rate = Rates.TryGetValue(state, out var r) ? r : 1;
    amt = baseRate * rate;
    calc = 2 * basis(amt) + extra(amt) * 1.05;

    if (state == State.Ohio)
        points = 2;
}

使用UPPERCASE_CONSTANTS_WITH_UNDERSCORES违反了C#中使用的命名准则。只需使用PascalCased名称即可。

票数 10
EN

Code Review用户

发布于 2017-08-30 09:30:40

否则,您可以对现有代码进行如下改进:

代码语言:javascript
复制
void CalculateTaxAndRewardPoints()
{
    amt = baseRate;

    if (state == TEXAS)
        amt *= TX_RATE;
    else if (state == OHIO)
        amt *= OH_RATE;
    else if (state == MAINE)
        amt *= MN_RATE;

    calc = 2 * basis(amt) + extra(amt) * 1.05;
}

计算总是相同的,所以如果是if的话,它可以移到外面。从一个基本值开始,并将状态速率乘以。

票数 1
EN

Code Review用户

发布于 2017-08-30 14:45:19

我会说这是“坚实的”。假设每个状态的计算是相同的。如果计算也不同,我会使用一个接口。

代码语言:javascript
复制
class TexasCalculateTaxAndRewardPoints : CalculateTaxAndRewardPoints {  
    protected override decimal Rate { get { return 1.00; } }
}

class OhioCalculateTaxAndRewardPoints : CalculateTaxAndRewardPoints {

    protected override decimal Rate { get { return 1.01; } }

}

class MaineCalculateTaxAndRewardPoints : CalculateTaxAndRewardPoints {  
    protected override decimal Rate { get { return 1.02; } }
}

abstract class CalculateTaxAndRewardPoints 
{
    protected abstract decimal Rate { get; }

    public decimal Calculate() {
        return  2 * basis(Rate) + extra(Rate) * 1.05;
    }
}
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/174367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档