2009-08-03 15 views
3

Ich arbeite mit einem Code, den ich irgendwie seltsam finde. Der Code, an dem ich arbeite, ist Teil eines Importdienstprogramms, das eine CSV-Datei aufnimmt und die Daten in die Datenbank importiert.Ist es gut, System.out.println in eine separate Methode zu platzieren?

Innerhalb der Code, ich sehe:

ImportUtils.printf("Validation started"); 

Wenn ich in dieser Methode suchen, ist es einfach System.out.printin ruft:

public static void printf(String s) { 
    System.out.println(s); 
} 

Gibt es irgendeinen Vorteil zu diesem? Könnte das ein Problem auf der Straße sein?

+0

Ich habe gerade entdeckt, dass sie auch System.out.println im Code verwenden. So sehen Sie ImportUtils.printf und System.out.println etwa 40 Zeilen auseinander. Ich dachte nur, ich würde das hinzufügen ... – Ascalonian

Antwort

15

Anstatt einen einfachen System.out.println-Wrapper zu erstellen, sollten Sie auf eine vollständige Protokollierungs-API wechseln. Es gibt viele verfügbare (Commons Logging, Log4j, SLF4J und viele mehr). Diese können einfach als einfache Wrapper um die Konsole herum konfiguriert werden, die für die anfängliche Entwicklung nützlich sind. Auf der Straße können diese modifiziert werden, um in Dateien zu schreiben, E-Mails zu senden, in die Datenbank zu schreiben, ... Diese bieten auch kontextbezogene Informationen (wie die Klasse die Protokolle erzeugt), die sehr nützlich und mühsam sind.

+1

+1, ausgezeichnete Beratung. Die Verwendung von System.out bindet Sie sehr eng an die Verwendung der Konsole. Mit einem Logging-Framework können Sie super flexibel sein, wenn Sie es wünschen. –

5

Ich denke, das kann eine gute Sache sein - so können Sie frei in jeden Puffer schreiben, den Sie wünschen, indem Sie einfach die Implementierung der ImportUtils.printf Methode ändern.

Es ist notwendig? Ich weiß nicht, es könnte Overkill sein, aber diese Art der Kapselung kann sich in Zeiten der Not oft als Segen erweisen.

+0

Beat mich dazu. +1 – MitMaro

2

Der Name printf für das Verfahren ist schlecht, weil printf steht für Druck formatiert und diese Methode hat nichts von der Funktionalität der printf Programmierer wissen.

Auf der anderen Seite kann diese Indirektion sinnvoll sein, indem die Protokollierungsmethode in der Zukunft erweitert und aktualisiert wird, ohne den zugrunde liegenden Code zu ändern. Ich hätte es einfach nicht printf genannt.

+2

Ah, aber da alles diese Methode aufruft, ist es eine einfache Sache, stattdessen 'System.out.printf' aufzurufen (und Varargs hinzuzufügen). –

+1

@mmyers Schön, aber ich denke immer noch, dass es eine schlechte Idee ist, einer allgemeinen Methode einen sehr spezifischen Namen zu geben, der an eine Spezialisierung gebunden ist. –

1

keinen Java Kerl, aber das sieht aus wie ein klassischer Fall von mit diesem Fall „Sie Fortran in jeder Sprache schreiben können“ C. Seine

Der einzige Vorteil, den ich sehe, ist ein C-Programmierer gibt einen Vorsprung in deine API Wenn die Methode "DisplayText" oder etwas Relevantes genannt würde, könnte ich sehen, dass sie einen Wert hat.

6

Ein typisches Beispiel für obsessive Entkopplung. Ganz sinnlos, denn wenn Sie wirklich wollen, dass System.out woanders schreibt, können Sie System.setOut() verwenden. Wenn Sie mehr Flexibilität benötigen, gibt es nicht gerade einen Mangel an Logging-Frameworks zur Auswahl.

+0

Ja, nur jemand, der versucht, zu clever zu sein und potentielle Bugs zu erzeugen. Zuerst ist der Methodenname falsch - printf() anstelle von println(). Auch wenn zwei Versionen zusammen verwendet werden, könnte jemand versucht sein, die Implementierung zu ändern, was dazu führt, dass sich einige Codes ändern, aber nicht die andere. –

1

Ich denke, jemand versucht, clever zu sein und es einfach zu machen, zu einer Protokollierung Frame Arbeit oder etwas später im Entwicklungszyklus zu ändern.

Das Problem dabei ist, dass Sie im Moment den Aufruf von system.out ändern. Bei einem Logging-Framework stammen alle Logging-Aufrufe von derselben Klasse und derselben Funktion, und alle haben die gleiche Priorität. Das bedeutet, dass Sie viele nützliche Funktionen verlieren, die ein Logger automatisch bereitstellt. Zum Beispiel, welche Klasse die Log-Nachricht geschrieben hat. Setzen Sie den Debugger auf eine höhere Log-Ebene, um nur die wichtigsten Nachrichten usw. zu erhalten.

Also würde ich davon abraten. Es scheint eine gute Idee zu sein, schnell von system.out zu wechseln.zu einem Logger oder etwas anspruchsvoller, aber es hilft auf lange Sicht nicht.

Verwandte Themen