2010-04-08 5 views
5

Ich lese gerade den Artikel Programming by Coincidence. Am Ende der Seite gibt es Übungen. Ein paar Codefragmente, die Fälle von "Programmierung durch Zufall" sind. Aber ich kann nicht den Fehler in diesem Stück herausfinden:'Programmieren durch Zufall' Übung: Java File Writer

Dieser Code stammt aus einer universellen Java-Tracing-Suite. Die Funktion schreibt eine Zeichenfolge in eine Protokolldatei. Es besteht seinen Komponententest, schlägt aber fehl, wenn einer der Webentwickler es verwendet. Welchen Zufall ist es?

public static void debug(String s) throws IOException { 
    FileWriter fw = new FileWriter("debug.log", true); 
    fw.write(s); 
    fw.flush(); 
    fw.close(); 
    } 

Was ist das falsch ist?

+0

Ist es nicht der Fall, dass Komponententests keine hundertprozentige Unfehlbarkeit garantieren? Ich meine, es gibt so viele Zufälle, mit denen wir Entwickler konfrontiert sind, seit wir mit der Programmierung begonnen haben. – bragboy

+1

@Bragaadeesh: Dies ist ein schlechter Komponententest, weil er das ["single responsibility principle"] verletzt (http: //en.wikipedia .org/wiki/Single_verantwortung_prinzip). Wenn Sie testen, ob die Methode die Zeichenfolge korrekt protokolliert, sollten Sie die Datei-E/A daraus entfernen. Es sollte einen 'java.io.Writer' erhalten, der von woanders erstellt wurde und dorthin schreibt. –

Antwort

10

Dieser Code beruht auf der Tatsache, dass im ausführbaren Verzeichnis der Anwendung eine Datei namens debug.log beschreibbar ist. Wahrscheinlich ist die Anwendung des Webentwicklers nicht mit dieser Datei eingerichtet und die Methode schlägt fehl, wenn sie versucht, sie zu verwenden.

Ein Komponententest dieses Codes funktioniert, weil der ursprüngliche Entwickler die richtige Datei an der richtigen Stelle (und mit den richtigen Berechtigungen) hatte. Dies ist der Zufall, der den Erfolg des Komponententests ermöglichte.

+0

Ja, ich wollte etwas über Berechtigungen sagen. –

+0

Das macht in der Tat Sinn. Danke für die Klärung! –

0

Interessanter Leckerbissen. Im Idealfall müssen Ressourcen aus dem Klassenpfad abgerufen werden. Der menschlichen Stagpidität ist jedoch kein Ende gesetzt. Was würde passieren, wenn die Datei im Klassenpfad der Testumgebung (zB Eclipse) vorhanden wäre, aber in Produktionsbereitstellungen fehlte?

+0

Ressourcen (wenn Sie Dateien im Zusammenhang mit dieser Frage meinen) müssen nicht notwendigerweise aus dem Klassenpfad gezogen werden. Das Programm muss nicht wissen, welcher Klassenpfad ist. Classpath wird nur vom Klassenlader verwendet. Java gibt kein "Arbeitsverzeichnis" für Datei-IO an. Es liegt in der Verantwortung des Programmierers, ein Arbeitsverzeichnis über ein Befehlszeilenargument oder idealerweise einen Systemparameter zu übergeben und im Programm zu verwenden. –

+0

Das meinte ich im Idealfall. Dies wäre für die plattformübergreifende Migration einfach, anstatt es hart zu codieren. – Maddy