设计函数签名 - 返回值或输出参数

时间:2010-12-10 10:43:09

标签: c# .net oop coding-style

亲爱的各位专家,

我正在设计一个必须处理文件夹中文件的函数。该函数必须说明它已经处理了多少文件以及是否有错误。设计此类功能的最佳方法是什么?我在三种选择中做出选择:

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

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

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

当然这个例子是对现实生活问题的一个例证。我只是想制定好的策略。

7 个答案:

答案 0 :(得分:7)

我会去:

int ProcessFiles() // returns count
{
   if(error)
   {
       throw new MyException();
   }
}

答案 1 :(得分:2)

我会去

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

答案 2 :(得分:2)

如果进程失败,为什么不抛出异常?

答案 3 :(得分:1)

就个人而言,对于单线程方法,我会选择第一个。

但是,我告诉你,将此作为后台操作会更好,因此拥有BeginProcessFilesEndProcessFiles或事件回调将是确定成功的更好方法。操作以及处理了多少文件。

答案 4 :(得分:1)

为什么不:

int ProcessFiles()
{ 

   int num_of_files_processed = 0;

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

   return num_of_files_processed;
} 

答案 5 :(得分:1)

我也会选择抛出异常的解决方案。有时,异常不是一种选择(例如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; }
}

答案 6 :(得分:1)

更复杂的事情怎么样?

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类以包含更多细节,例如每个失败项目的问题究竟是什么,或每个项目有多个问题,这可能比简单的“这一个失败”更有用