Ich sollte einige Ereignisse in einem Programm protokollieren, aber soweit ich weiß, ist es besser, den Protokollierungscode außerhalb des Programms zu belassen, da es nicht um die tatsächliche Funktionalität des Programms geht. Können Sie mir also sagen, ob ich es vollständig aus dem Code heraushalten und nur Beobachter und Zuhörer verwenden soll, um die Ereignisse zu protokollieren? Oder ich kann eine Codezeile wie die folgende hinzufügen, wo immer ich etwas protokollieren muss:
MyGloriousLogger.getXXXLogger().Log(LogPlace, new LogObject(z1, z2, z3, z4, ..., z99));
Mache ich einen Fehler bei der Verwendung des Observer-Entwurfsmusters? Ich brauche ein anderes Designmuster? Oder sollte ich aufhören, über Designmuster nachzudenken?
PS1. Wenn ich mich nur mit Zuhörern und Beobachtern anmelden möchte, muss ich die Beobachter und Zuhörer des Programms hinzufügen und verbessern.
PS2. Ich weiß sicherlich, dass es verschiedene Bibliotheken für die Protokollierung in Java gibt und ich java.utils.logging verwende, aber ich benötige einen Wrapper, um meine speziellen Objekte zu protokollieren.
quelle
Antworten:
Logging
wird normalerweise mit dem Muster der Verantwortungskette implementiert . Natürlich können (und ich würde) das mit einer Fassade kombinieren . Ich würde Listener (s) oder Observer (s) wirklich nicht selbst verwenden.quelle
Verwenden Sie die aspektorientierte Programmierung, bei der After-, Before- und Around-Ratschläge zu Methoden verwendet werden. Dort können Sie je nach Bedarf Protokolle vor dem Start der API, nach oder unter bestimmten Bedingungen hinzufügen und Ihren Hauptcode vom Protokollcode trennen.
quelle
Nun, Observer klingt für mich ungeeignet. Wenn Sie Logger-Aufrufe "wo immer Sie brauchen" werfen, wird Ihr Code zerstört und die SRP verletzt.
Sie könnten beispielsweise an AOP interessiert sein, sodass Sie Logger-Aufrufe über Methodenanmerkungen anhängen können.
quelle
Die Verantwortungskette scheint ein gutes Muster zu sein, wenn Ihre Ausgabe an mehreren Stellen landen kann. In der UML haben Sie einen anderen Logger, der zur Konsole, zum anderen zu errorFile und zum dritten einfach zum Info-Logger führt.
Normalerweise habe ich gesehen, dass logLevels unterschiedlich sind, aber die Protokolldatei dieselbe ist.
Ich sehe das Beobachtermuster für die Protokollierung nicht so schlecht, da es Ihren Protokollierungscode vom Anwendungscode entkoppelt. Auf diese Weise ist die Migration auf verschiedene Protokollierungsmechanismen einfach. Jedes Mal, wenn Sie ein Ereignis protokollieren möchten, wird ein Ereignis ausgelöst, und der entsprechende Listener empfängt das Ereignis und protokolliert es. Es sollte ein Zwischen-Singleton-Objekt geben, das die Liste aller Register enthält.
Auf diese Weise sehe ich, dass wir unseren Protokollierungscode vom Anwendungscode entkoppeln können.
quelle