Moin,ich stecke in einem Dilemma bezüglich der Do's und Don'ts im Standardwerk.Dort heißt es, das Prüfen der Rückgabewerte sei zu vermeiden. Die damit einhergehenden IF-Prüfungen seien ein Zeichen für schlechten Code, da die Methode zumindest eine Sache mehr tut als sie soll: etwas überprüfen.Nun habe ich die große Ehre in der Hauptsache in einer Programmiersprache zu entwickeln, in der Exceptions getreu ihres Namens Ausnahmeerscheinungen bilden und gemäß Sprachdesign nahezu alles über Rückgabewerte oder Fehlerobjektreferenzen gelöst wird.Persönlich finde ich diese Lösung prima, denn FileNotFound ist eine Möglichkeit und kein schwerer Ausnahmefehler. Eine simple Prüfung auf die Existenz der Datei umgeht diese Exception bereits.
Doch wie passen die CCD-Prinzipien auf diesen Sonderfall?
Fragende GrüßeMarco
Und das ist meiner Meinung nach falsch. Es müsste eine Exception kommen.
"Instead of exceptions, error objects (NSError
) and the Cocoa error-delivery mechanism are the recommended way to communicate expected errors in Cocoa applications. For further information, see Error Handling Programming Guide."
Bei dem Ansatz haben alle beteiligten Methoden genau eine Aufgabe:
FileExist : Test, ob eine Datei vorhanden ist
die aufrufende Methode : Verarbeitung der Antwort von FileExist
appendTextToFile : Anhängen von Text
Welche CCD Prinzipien könnten denn passen?SRP zum Beispiel. Oder PoLA.
Ist es überraschend, wenn eine Datei nicht existiert? Ja. Dann sollte solche Ausnahme mit einer Ausnahme angezeigt werden. Das ist dann wiederum nicht überraschend ;-) Also least astonishment.Ist die Nichtexistenz hingegen quasi ein Normalfall, dann keine Ausnahme. Dann ein anderer Weg der Anzeige, zum Beispiel:
if (!TryAppendToFile(filename, text)) { ... }
Jetzt die Frage, wer feststellt, ob die Datei vorhanden ist. Bleiben wir beim Beispiel "Anhängen an Datei".Das ist eine single responsibility. Nach außen.Aber innen? Da gibt es zwei responsibilities: Prüfung der Existenz der Datei und das tatsächliche Anhängen.bool TryAppendToFile(string filename, string text) {If (File.Exists(filename)) {AppendToFile(filename, text);return true;}elsereturn false;}
Und die sollten klar getrennt sein. Wie oben sähe es normal aus. Aber da ist für mich noch das Integration Operation Separation Principle verletzt :-) (nein, das gehört nicht zu CCD)
Die Methode tut nämlich zweierlei: sie enthält Logik und sie integriert andere Methoden. Darüber könnte man nachdenken, ob noch aufgelöst werden könnte. Auf der Granularitätsebene würd ich das nicht machen in der Praxis. Aber es könnte theoretisch so aussehen:bool TryAppendToFile(string filename, string text) {var result = false;Check_file_existence(filename, () => {AppendToFile(filename, text);result = true;});return result;}
Jetzt integriert die Methode nur noch. Sie enthält keine Logik mehr, also keine Kontrollstrukturen und keine Ausdrücke. Sie fügt nur noch Teilfunktionalität (Operationen) zu einem neuen Größeren zusammen (Integration).
- (void) appendString:(NSString*)string toFileWithPath:(NSString*)filePath {NSError *error = nil;
BOOL writingSuccessful = [string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if( !writingSuccessful )
@throw [NSException exceptionWithName:@"IOException" reason:@"Problem writing to file" userInfo:@{@"error": error}];
}
Und damit ist die Frage beantwortet, wohin was gehört.