比用于流控制的嵌套if语句更好的模式

时间:2011-09-09 10:01:34

标签: c# asp.net design-patterns

有人能建议一个更好的模式来处理这样的一些步骤吗?

我现在能想到的唯一另一种方法是使用流控制的异常,但我读过它是不可取的,因为它基本上是一个goto语句。

if (FileHandler.CheckIfNewFilesExist(sourceFolderPath))
            {
                if (FileHandler.MoveFolder(sourceFolderPath, temporyFolderPath))
                {
                    if (CSVHandler.AppendUniqueIdToCSV(temporyFolderPath, filesToBeAppended))
                    {
                        FileHandler.CopyFolder(temporyFolderPath, finalFolderPath);
                    }
                }
            }

4 个答案:

答案 0 :(得分:2)

使用&&

if (FileHandler.CheckIfNewFilesExist(sourceFolderPath)
    && FileHandler.MoveFolder(sourceFolderPath, temporyFolderPath)
    && CSVHandler.AppendUniqueIdToCSV(temporyFolderPath, filesToBeAppended))            
{
    FileHandler.CopyFolder(temporyFolderPath, finalFolderPath);
}

答案 1 :(得分:2)

你可以很容易地创建一个流畅的界面:

FileHandler.CheckIfNewFilesExist(sourceFolderPath)
    .ThenIf(() => FileHandler.MoveFolder(sourceFolderPath, temporyFolderPath))
    .ThenIf(() =>
        CSVHandler.AppendUniqueIdToCSV(temporyFolderPath, filesToBeAppended))
    .ThenDo(() => FileHandler.CopyFolder(temporyFolderPath, finalFolderPath));

他们是:

public static class BooleanEx
{
    public static bool ThenIf(this bool @this, Func<bool> that)
    {
        return @this ? that() : false;
    }

    public static void ThenDo(this bool @this, Action action)
    {
        if (@this)
        {
            action();
        }
    }
}

答案 2 :(得分:1)

关于展平这些结构的好文章可以在Coding Horror.找到 我没有必要在这里粘贴它。

答案 3 :(得分:1)

在您的情况下,可以使用if运算符将所有条件合并为一个&&但如果每个if块中有一些额外的代码,则可以反转{{1 }}的:

if

您显然必须将代码提取到方法中才能使用if (!FileHandler.CheckIfNewFilesExist(sourceFolderPath)) return; // Perhaps some more code ... if (!FileHandler.MoveFolder(sourceFolderPath, temporyFolderPath)) return; // Perhaps some more code ... if (!CSVHandler.AppendUniqueIdToCSV(temporyFolderPath, filesToBeAppended)) return; FileHandler.CopyFolder(temporyFolderPath, finalFolderPath);