希望使用坚实的原则以简化的方式编写此代码。任何帮助都是高度appreciated.Can的--我实现了继承。
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;
}
}发布于 2017-08-30 09:08:10
我建议不要使用像SOLID这样的“酷”字来操作,只需要改进现有的代码。我不知道像TEXAS和OHIO这样的类型常量是什么类型的,所以我会用枚举来表示状态。您的代码可以简化为(使用C#7):
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名称即可。
发布于 2017-08-30 09:30:40
否则,您可以对现有代码进行如下改进:
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的话,它可以移到外面。从一个基本值开始,并将状态速率乘以。
发布于 2017-08-30 14:45:19
我会说这是“坚实的”。假设每个状态的计算是相同的。如果计算也不同,我会使用一个接口。
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;
}
}https://codereview.stackexchange.com/questions/174367
复制相似问题