Powinienem rejestrować niektóre zdarzenia w programie, ale o ile wiem, lepiej byłoby przechowywać kod logowania poza programem, ponieważ nie chodzi o prawdziwą funkcjonalność programu. Czy możesz mi powiedzieć, czy powinienem całkowicie trzymać się z dala od kodu i używać tylko obserwatorów i słuchaczy do rejestrowania zdarzeń? Lub mogę dodać wiersz kodu, taki jak poniżej, gdziekolwiek muszę coś zalogować:
MyGloriousLogger.getXXXLogger().Log(LogPlace, new LogObject(z1, z2, z3, z4, ..., z99));
Czy popełniam błąd przy użyciu wzorca projektowego Observer? Potrzebuję innego wzoru? Czy powinienem przestać myśleć o wzorach projektowych?
PS1. Jeśli chcę się logować przy użyciu samych detektorów i obserwatorów, z pewnością będę musiał dodać i ulepszyć obserwatorów i detektory programu.
PS2. Z pewnością wiem, że istnieją różne biblioteki do logowania w Javie i używam java.utils.logging, ale muszę mieć opakowanie, aby logować moje obiekty specjalne.
źródło
Odpowiedzi:
Logging
jest zwykle wdrażany za pomocą wzorca łańcucha odpowiedzialności . Oczywiście możesz (i ja bym) połączyć to z fasadą . Naprawdę nie używałbym samodzielnie Listener (s) lub Observer (s).źródło
Użyj programowania zorientowanego na aspekty, w którym stosuje się porady After, Before i Around dotyczące metod. Tam, zgodnie z potrzebami, możesz dodać dzienniki przed uruchomieniem interfejsu API, po lub pod pewnymi warunkami, a także oddzielić kod główny od kodu logowania.
źródło
Cóż, Observer wydaje mi się nieodpowiedni. Ponadto podrzucanie wywołań rejestratora „gdziekolwiek potrzebujesz” rozbije kod i naruszy SRP.
Możesz być na przykład zainteresowany AOP, aby móc dołączać wywołania rejestratora za pomocą adnotacji metod.
źródło
Łańcuch odpowiedzialności wydaje się dobrym wzorcem, gdy twoja produkcja może dotrzeć do wielu miejsc. W UML masz inny rejestrator, który kieruje do konsoli, inny do errorFile i trzeci po prostu rejestrator informacji.
Zwykle widziałem, że logLevels są różne, ale plik rejestrowania jest taki sam.
Nie widzę wzorca obserwatora tak złego przy logowaniu, ponieważ oddziela on kod logowania od kodu aplikacji. Co jest dobrą praktyką, migracja do różnych mechanizmów rejestrowania jest w ten sposób łatwa. Za każdym razem, gdy chcesz się zalogować, uruchom zdarzenie, a odpowiedni słuchacz otrzyma zdarzenie i je zarejestruje. Powinien istnieć pośredni obiekt singletonu, który przechowuje listę wszystkich rejestrów.
W ten sposób widzę, że możemy oddzielić nasz kod logowania od kodu aplikacji.
źródło