亲爱的各位专家,
我正在设计一个必须处理文件夹中文件的函数。该函数必须说明它已经处理了多少文件以及是否有错误。设计此类功能的最佳方法是什么?我在三种选择中做出选择:
bool ProcessFiles(out int fileCount)
{
// return true or false
}
int ProcessFiles()
{
// return -1 when failed
}
int ProcessFiles(out bool success)
{
// return count
}
当然这个例子是对现实生活问题的一个例证。我只是想制定好的策略。
答案 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)
就个人而言,对于单线程方法,我会选择第一个。
但是,我告诉你,将此作为后台操作会更好,因此拥有BeginProcessFiles
和EndProcessFiles
或事件回调将是确定成功的更好方法。操作以及处理了多少文件。
答案 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
类以包含更多细节,例如每个失败项目的问题究竟是什么,或每个项目有多个问题,这可能比简单的“这一个失败”更有用