【问题标题】:How to refactor sequential ifs?如何重构顺序 ifs?
【发布时间】:2011-09-05 08:39:46
【问题描述】:

我写了这段代码。真的很丑。我想重构它。我必须返回一个object[]。我在想也许可以使用bool 值来检查我是否必须继续调用其他方法,并且只创建最终的object[]

private object[] TrasferisciSingoloFile(some parameters...)
{
    Result result = new Result;

    result = FTPRename(some parameters...);
    if (result.error)
    {
        result.SetError("Some Problem 1");
        object tip = new object[] { par as ThreadCounterManager, result };
        return (object[])tip;
    }

    result = FTPDownloadAndCopy(some parameters...);
    if (result.error)
    {
        result.SetError("Some Problem 2");
        object tip = new object[] { par as ThreadCounterManager, result };
        return (object[])tip;
    }

    result = FTPMove(some parameters...);
    if (result.error)
    {
        result.SetError("Some Problem 3");
        object tip = new object[] { par as ThreadCounterManager, result };
        return (object[])tip;
    }

    result = FTPDelete(some parameters...);
    if (result.error)
    {
        result.SetError("Some Problem 4");
        object tip = new object[] { par as ThreadCounterManager, result };
        return (object[])tip;
    }

    object tip1 = new object[] { par as ThreadCounterManager, result };

    return (object[])tip1;
}

【问题讨论】:

  • 根据代码,在任何时间点,如果或没有成功,则为 1。可能是,对所有这些方法进行委托调用,从而从所有方法中获取结果 [](假设所有参数都相同)。然后数组中的至少 1 个项目应该是 true w.r.t result.error。所以生病调用其他方法并返回[]。这会将您的代码从许多 if 减少到可能是 1 或 2。
  • 但是在方法调用中会发生异常,并且分配永远不会发生,因此结果将为空,或前一个方法的结果。
  • 是的,但是即使在 OPs 代码异常也没有处理,所以没想到。
  • 对于初学者,在任何情况下都不需要投小费。它已经是一个对象[];你可以简单地return tip

标签: c# refactoring


【解决方案1】:

让 FTPXXXX 套件的所有函数在发现错误时抛出异常,这样您就可以在 catch(){} 块中捕获并返回一次错误。 “一些问题 xxxx 消息”可以用您在引发异常时提供的消息进行修饰。

【讨论】:

  • +1 表示想法,但我无法编辑 FTPXXXX,这些方法不是我的。基本上异常是在 FTPXXX 内部处理的,当我遇到异常时,变量结果的错误字段不为空
  • 但是异常解决问题的方法好吗?我的意思是我们必须支付绩效工资,对吗?
  • @Dierre 所以将所有这些方法包装在一个类中并在包装函数中引发异常
  • @zenwalker 当您遇到阻塞错误时,性能不再是问题。是的,提出异常需要花费大量时间,但不能影响整体性能。
  • 您可以创建包装函数来调用不属于您的 FTP 函数。你可以控制这些:)
【解决方案2】:

假设您的 FTP 函数位于代码中的其他位置,请考虑让它们抛出异常,并在此函数中使用 try/catch 子句。

Result result = new Result();
try
{
    result = FTPRename(some parameters...);
    result = FTPDownloadAndCopy(some parameters...);
    result = FTPMove(some parameters...);
    result = FTPDelete(some parameters...);
}
catch (SomeException e)
{
    return (object[])new object[] { par as ThreadCounterManager, result.SetError(e.Message) };
}

return return (object[])new object[] { par as ThreadCounterManager, result };

【讨论】:

  • 但是在方法调用中会发生异常,并且分配永远不会发生,因此结果将为空,或前一个方法的结果。
  • 同意,作业将被跳过,因此您将获得最新的“有效”结果,以及出错的错误消息。
【解决方案3】:

如果您可以修改 FTP 方法,您也许可以让它们各自分配错误消息,并创建一个帮助方法来创建提示对象。这样,您无需担心任何事情,只需检查是否发生错误。

类似

private Object[] makeTip(arg1, arg2) {
    return Object[] {arg1, arg2};

}

Result result = new Result;

result = FTPRename(some parameters...);
if(result.error)
    return makeTip(par as ThreadCounterManager, result);

result = FTPDownloadAndCopy(some parameters...);
if(result.error)
    return makeTip(par as ThreadCounterManager, result);
...
return makeTip(par as ThreadCounterManager, result);

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 2013-10-25
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2018-12-05
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多