Разработка сигнатуры функции - возвращаемое значение или выходной параметр - PullRequest
2 голосов
/ 10 декабря 2010

Привет, дорогие мои коллеги-эксперты,

Я разрабатываю одну функцию, которая должна обрабатывать файлы в папке.Функция должна сказать, сколько файлов она обработала, а также, если есть ошибка.Каков наилучший способ разработать такую ​​функцию?Я выбираю один из трех вариантов:

bool ProcessFiles(out int fileCount)
{
  // return true or false
}

int ProcessFiles()
{
  // return -1 when failed
}

int ProcessFiles(out bool success)
{
  // return count
}

Конечно, этот пример - скорее иллюстрация реальных проблем.Я просто хочу разработать хорошую стратегию.

Ответы [ 7 ]

7 голосов
/ 10 декабря 2010

Я бы пошел на:

int ProcessFiles() // returns count
{
   if(error)
   {
       throw new MyException();
   }
}
2 голосов
/ 10 декабря 2010

Почему бы не выдать исключение в случае сбоя процесса?

2 голосов
/ 10 декабря 2010

я бы пошел на

 bool ProcessFiles(out int fileCount)
{
  // return true or false
}
1 голос
/ 10 декабря 2010

Как насчет чего-то более сложного?

class ProcessingResult
{
    public ProcessingResult(IEnumerable<Foo> processedFiles, IEnumerable<Foo> failures)
    {
        this.ProcessedFiles = processedFiles;
        this.Failures = failures ;
    }

    public IEnumerable<Foo> ProcessedFiles { get; private set; }
    public IEnumerable<Foo> Failures { get; private set; }
}

Тогда ваш метод становится:

ProcessingResult ProcessFiles(IEnumerable<Foo> files)
{
    List<Foo> failures = new List<Foo>();
    ProcessingResult result = new ProcessingResult(files, failures);

    foreach (var foo in files)
    {
        // voodoo

        if (error)
            failures.Add(foo);
    }

    return result;
}

Вы можете определить наличие ошибок, спросив result.Failures.Any().

Класс ProcessingResult можно легко расширить, чтобы он содержал больше деталей, таких как, в частности, проблема, связанная с каждым неисправным элементом, или несколько проблем на элемент, которые могут быть более полезными, чем простое «эта ошибка». 1011 *

1 голос
/ 10 декабря 2010

Я бы также выбрал решение, выбрасывающее исключение.Иногда исключение не является опцией (например, API).Почему бы не создать класс?

public class RetrnClass
{
    public int AmountOfFiles { get; set; }
    public int ErrorCode { get; set; }
    public String ErrorMessage { get; set; }
    public Exception ExceptionObject { get; set; }
    public bool IsValid { get { return ExceptionObject == null; } }
    public static implicit operator bool(RetrnClass cls) { return cls.IsValid; }
}
1 голос
/ 10 декабря 2010

Почему бы и нет:

int ProcessFiles()
{ 

   int num_of_files_processed = 0;

   if(error) 
   { 
       throw new MyException(num_of_files_processed, error_code); 

   return num_of_files_processed;
} 
1 голос
/ 10 декабря 2010

Лично для однопоточного подхода я бы выбрал первый.

Тем не менее, я заявляю вам, что выполнение этой фоновой операции было бы предпочтительнее, и поэтому наличие BeginProcessFiles и либо EndProcessFiles, либо обратный вызов события было бы лучшим способом определения успеха операции и количества. файлы были обработаны.

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