gpt4 book ai didi

c# - 重构 if-else if - else

转载 作者:可可西里 更新时间:2023-11-01 08:01:20 26 4
gpt4 key购买 nike

我有以下代码示例

if(object.Time > 0 && <= 499)
{
rate = .75m
}
else if(object.Time >= 500 && <= 999)
{
rate = .85m
}
else if(object.Time >= 1000)
{
rate = 1.00m
}
else
{
rate = 0m;
}

我的问题是我可以使用什么设计模式来让它变得更好?

编辑:为了澄清一点,您在此处看到的代码是当前存在于策略模式实现中的代码。我们有 3 种计算类型,其中 2 种具有 3 种不同的“比率”,可以根据您在下面看到的时间使用这些计算。我考虑过为每个比率创建一个策略实现,但随后我会移动确定要使用的策略的逻辑,并使它变得一团糟。

谢谢!

最佳答案

如果您真的在寻找一种设计模式,我会选择责任链模式。

基本上您的“链接”会尝试处理输入。如果它无法处理它,它就会沿着链向下传递,直到另一个链接可以处理它。如果有的话,您还可以定义一个接口(interface)以便在单元测试中轻松模拟。

所以你有这个抽象类,每个链接都会继承:

public abstract class Link
{
private Link nextLink;

public void SetSuccessor(Link next)
{
nextLink = next;
}

public virtual decimal Execute(int time)
{
if (nextLink != null)
{
return nextLink.Execute(time);
}
return 0;
}
}

然后你用你的规则创建每个链接:

public class FirstLink : Link
{
public override decimal Execute(int time)
{
if (time > 0 && time <= 499)
{
return .75m;
}

return base.Execute(time);
}
}

public class SecondLink : Link
{
public override decimal Execute(int time)
{
if (time > 500 && time <= 999)
{
return .85m;
}

return base.Execute(time);
}
}

public class ThirdLink : Link
{
public override decimal Execute(int time)
{
if (time >= 1000)
{
return 1.00m;
}

return base.Execute(time);
}
}

最后,要使用它,只需设置每个后继并调用它:

Link chain = new FirstLink();
Link secondLink = new SecondLink();
Link thirdLink = new ThirdLink();


chain.SetSuccessor(secondLink);
secondLink.SetSuccessor(thirdLink);

你所要做的就是用一个干净的调用来调用链:

var result = chain.Execute(object.Time);

关于c# - 重构 if-else if - else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18748433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com