"TryParse / Parse like" -Muster: Was ist der beste Weg, um es zu implementieren

8

Diese Frage ist ein Follow-up von Wie Sie darauf hinweisen, dass a Methode war erfolglos . Das xxx () Tryxxx () -Muster ist etwas, das in vielen Bibliotheken sehr nützlich sein kann. Ich frage mich, was der beste Weg ist, beide Implementierungen anzubieten, ohne meinen Code zu duplizieren.

Was ist das Beste?

%Vor%

oder

%Vor%

Ich würde instinktiv annehmen, dass das erste Beispiel korrekter ist (Sie wissen genau, welche Ausnahme passiert ist), aber könnte der Versuch / Fang nicht zu teuer sein? Gibt es eine Möglichkeit, die Ausnahme im zweiten Beispiel zu fangen?

    
Luk 08.10.2008, 12:18
quelle

4 Antworten

13

Making TrySomething nur fangen und schlucken die Ausnahme ist eine wirklich schlechte Idee. Der halbe Punkt des TryXXX-Musters ist, den Leistungseinbruch von Ausnahmen zu vermeiden.

Wenn Sie in der Ausnahme nicht viele Informationen benötigen, können Sie die DoSomething-Methode einfach TrySomething aufrufen und bei einem Fehler eine Ausnahme auslösen. Wenn Sie Details in der Ausnahme benötigen, benötigen Sie möglicherweise etwas aufwendiger. Ich habe nicht getimt, wo der Hauptteil der Leistungseinbußen von Ausnahmen liegt - wenn es das Werfen und nicht das Erschaffen ist, könnten Sie eine private Methode schreiben, die eine ähnliche Signatur wie TrySomething hat, aber eine Ausnahme oder null zurückgibt:

%Vor%

Zeit dies, bevor Sie sich dazu verpflichten!

    
Jon Skeet 08.10.2008, 12:37
quelle
3

Normalerweise benutze ich dieses Muster. Abhängig davon, wie die interne Methode implementiert wird, ob dies sinnvoll ist oder nicht. Wenn Sie bedingte Catch-Blöcke verwenden müssen, kann es etwas unangenehm werden ...

%Vor%     
Will 08.10.2008 12:34
quelle
2

Das erste Beispiel ist korrekt, wenn Sie nur die Ausnahme abfangen und nichts tun, sondern falsch zurückgeben.

Sie können TrySomething so ändern, dass er wie folgt aussieht.

%Vor%

So würde DoSomething aussehen

%Vor%

Wenn Sie TrySomething mit throwException nicht öffentlich zugänglich machen wollten, können Sie es zu einem privaten Mitglied machen.

Ausnahmen könnten teuer werden, und Sie könnten eine RegEx-Überprüfung der Zeichenfolge durchführen, um zu verhindern, dass einer ausgelöst wird. Es hängt davon ab, was Sie versuchen zu tun.

    
David Basarab 08.10.2008 12:27
quelle
1

Angenommen, das ist C #, würde ich das zweite Beispiel sagen

%Vor%

Es imitiert die eingebaute int.TryParse(string s, out int result) und meiner Meinung nach ist es am besten konsistent mit der Sprache / Umgebung zu bleiben.

    
Ben 08.10.2008 12:30
quelle