Лучше шаблон, чем вложенный, если операторы для управления потоком - PullRequest
0 голосов
/ 09 сентября 2011

Может кто-нибудь предложить лучший шаблон для обработки ряда шагов, подобных этому?

Единственный другой способ, о котором я могу думать сейчас, - это использовать исключения для управления потоком, но я читал, что это не рекомендуется, потому чтоэто в основном заявление goto.

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

Ответы [ 4 ]

2 голосов
/ 09 сентября 2011

Вы можете довольно легко создать свободный интерфейс, который делает это:

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 голосов
/ 09 сентября 2011

Используйте &&

if (FileHandler.CheckIfNewFilesExist(sourceFolderPath)
    && FileHandler.MoveFolder(sourceFolderPath, temporyFolderPath)
    && CSVHandler.AppendUniqueIdToCSV(temporyFolderPath, filesToBeAppended))            
{
    FileHandler.CopyFolder(temporyFolderPath, finalFolderPath);
}
1 голос
/ 09 сентября 2011

В вашем случае все условия можно объединить в один if с помощью оператора &&, но если бы в каждом блоке if был какой-то дополнительный код, вы могли бы инвертировать 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);

Вы, очевидно, должны извлечь свой код в метод, чтобы иметь возможность использовать return.

1 голос
/ 09 сентября 2011

Хорошую статью о сглаживании этих структур можно найти в Coding Horror. Нет смысла вставлять это здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...