2010-12-10 6 views
2

Hallo meine lieben Kollegen,Entwerfen der Funktionssignatur - Rückgabewert oder Ausgangsparameter

Ich entwerfe eine Funktion, die Dateien im Ordner verarbeiten muss. Die Funktion muss angeben, wie viele Dateien verarbeitet wurden und auch, wenn ein Fehler aufgetreten ist. Was ist der beste Weg, um solche Funktionen zu entwerfen? Ich wähle zwischen drei Möglichkeiten:

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

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

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

Natürlich ist dieses Beispiel eher eine Darstellung zum realen Leben Probleme. Ich möchte nur eine gute Strategie ausarbeiten.

Antwort

7

würde ich gehen für:

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

Aber dann muss ich Catch-Block bereitstellen. Mehr Codierung. –

+1

@captain: Nun, sonst müssten Sie Code haben, der den Rückgabewert überprüft, so dass Sie immer noch etwas Code haben müssen. –

2

i für

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

persönlich für einen Single-Threaded-Ansatz gehen würde, würde ich die ersten wählen.

Aber ich habe es Ihnen gesagt, dass dies eine Hintergrundoperation wäre vorzuziehen und daher eine BeginProcessFiles und entweder EndProcessFiles oder ein Event-Callback wäre eine bessere Möglichkeit, den Erfolg der Operation zu bestimmen und wie viele Dateien verarbeitet wurden .

2

Warum eine Ausnahme nicht ausgelöst, wenn der Vorgang fehlschlägt?

1

Warum nicht:

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

ich auch die Lösung werfen eine Ausnahme choise würde. Manchmal ist eine Ausnahme keine Option (z. B. API). Warum nicht eine Klasse erstellen?

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

Wie wäre es mit etwas anspruchsvolleren?

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; } 
} 

Dazu Methode wird:

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; 
} 

Sie sagen können, ob es irgendwelche Ausfälle waren von result.Failures.Any() zu fragen. Die Klasse kann einfach erweitert werden, um mehr Details zu enthalten, z. B. genau, was das Problem mit jedem fehlgeschlagenen Element war, oder mehrere Probleme pro Element, die mehr nutzen können als ein einfaches "dieses fehlgeschlagene".

Verwandte Themen