gpt4 book ai didi

c# - 用普通对象重构 long if - else if - else

转载 作者:太空狗 更新时间:2023-10-29 21:33:59 24 4
gpt4 key购买 nike

我正在寻找一种方法来重构日志 if/else if/else 语句,该语句也有一些嵌套。这些 block 还使用了很多常见的对象。我的目标是将代码分解为可管理的单元,并提取到不同的类中,并使其可插入,以防我需要处理新情况。

这里有一些虚拟代码来说明:

List<ValidationResult> validationResults = new ...;
Inspector inspector = commonInspector;
bool additionalOp = commonFlag;
HashSet<Thing> thingsToCheck = theThings;
foreach (var thing in thingsToCheck)
{
if (IsCandy(thing) && thing.IsWrapped && thing.IsHard)
{
var inspected = inspector.Inspect(thing.Value);
if (inspected != thing.Value)
{
validationResults.Add(new ...);
if (additionalOp)
{
thing.Taste();
}
}
}
else if (IsChocolate(thing))
{
var sweet = (Sweet)thing;
List<BadCalories> badCalories;
while (var calorie in sweet.Calories)
{
if (calorie.IsGood)
continue;
badCalories.Add(calorie);
}

foreach (var badCal in badCalories)
{
var inspected = inspector.Inspect(badCal.Value);
if (inspected != badCal.Value)
{
validationResults.Add(new ...);
if (additionalOp)
{
badCal.Taste();
}
}
}
}
else
{
if(thing ...)
else if (thing ...)
}

我阅读了很多可能适用的各种模式/实践的文章/SO 帖子,但代码的依赖性使我应用这些概念有点复杂。一段时间以来,我一直在过于仔细地查看代码,这无济于事,因此很难从微观管理跳出鸟瞰图。

最佳答案

您可以将大作用域 block 分解为单独的函数。

if(IsHardWrappedCandy(thing))
ValidateHardWrappedCandy(thing);
else if (IsChocolateCandy(thing))
ValidateChocolateCandy(thing);

还有中间性,您可以在其中创建糖果类并封装行为:

public abstract class CandyBase
{
public abstract void Validate();
}
public class HardWrappedCandy : CandyBase
{
public override void Validate()
{
// TODO: Validation logic
}
}

那么你的代码将是:

foreach(var candy in candies)
candy.Validate();

当然,您需要标准化参数等,但您明白了。

阅读 Clean Code 这本书,它有很多关于如何重构的好主意。 http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

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

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