Myśląc o zwinnym tworzeniu oprogramowania i wszystkich zasadach (SRP, OCP, ...) zadaję sobie pytanie, jak traktować rejestrowanie.
Czy logowanie obok implementacji stanowi naruszenie zasad SRP?
Powiedziałbym, yes
ponieważ wdrożenie powinno być również w stanie działać bez logowania. Jak więc lepiej wdrożyć rejestrowanie? Sprawdziłem niektóre wzory i doszedłem do wniosku, że najlepszym sposobem, aby nie naruszać zasad w sposób zdefiniowany przez użytkownika, ale użyć dowolnego wzoru, o którym wiadomo, że narusza zasadę, jest użycie wzoru dekoratora.
Załóżmy, że mamy kilka komponentów całkowicie bez naruszenia SRP, a następnie chcemy dodać rejestrowanie.
- składnik A
- składnik B wykorzystuje A
Chcemy logowania dla A, więc tworzymy kolejny komponent D ozdobiony A, oba implementujące interfejs I.
- interfejs I
- komponent L (komponent rejestrujący systemu)
- składnik A implementuje I
- składnik D implementuje I, ozdabia / używa A, używa L do logowania
- składnik B wykorzystuje I
Zalety: - Mogę używać A bez logowania - testowanie A oznacza, że nie potrzebuję żadnych próbnych rejestrów - testy są prostsze
Wada: - więcej komponentów i więcej testów
Wiem, że to wydaje się być kolejnym otwartym pytaniem do dyskusji, ale tak naprawdę chcę wiedzieć, czy ktoś stosuje lepsze strategie rejestrowania niż naruszenie dekoratora lub SRP. Co z statycznym logowaniem singleton, które są domyślnie NullLogger, a jeśli potrzebne jest rejestrowanie syslog, należy zmienić obiekt implementacji w czasie wykonywania?