Devo registrar alguns eventos em um programa, mas, tanto quanto sei, seria melhor manter o código de log fora do programa, porque não se trata da funcionalidade real do programa. Então, você pode me dizer se devo mantê-lo completamente fora de código e usar apenas Observadores e Ouvintes para registrar os eventos? Ou posso adicionar uma linha de código como a seguinte sempre que precisar registrar algo:
MyGloriousLogger.getXXXLogger().Log(LogPlace, new LogObject(z1, z2, z3, z4, ..., z99));
Cometo um erro ao usar o padrão de design do Observer? Preciso de outro padrão de design? Ou devo parar de pensar em padrões de design?
PS1. Se eu quiser registrar usando apenas ouvintes e observadores, certamente precisarei adicionar e melhorar os observadores e ouvintes do programa.
PS2. Eu certamente sei que existem bibliotecas diferentes para efetuar login em Java e estou usando java.utils.logging, mas preciso ter um wrapper para registrar meus objetos especiais.
fonte
Respostas:
Logging
geralmente é implementado com o padrão da Cadeia de responsabilidade . Claro que você pode (e eu combinaria) isso com uma fachada . Eu realmente não usaria ouvintes ou observadores.fonte
Use a Programação Orientada a Aspectos, que usa conselhos Após, Antes e Ao redor sobre os métodos. Lá, conforme sua necessidade, você pode adicionar logs antes do início da API, após ou em algumas condições e também separar seu código principal do código de log.
fonte
Bem, o Observer parece impróprio para mim. Além disso, lançar chamadas de logger "onde você precisar" quebrará seu código e violará o SRP.
Você pode, por exemplo, estar interessado em AOP para isso, para poder anexar chamadas do criador de logs por meio de anotações de método.
fonte
A cadeia de responsabilidade parece ser um bom padrão quando sua saída pode chegar a vários locais. Na UML, você tem um agente de log diferente, que direciona para o console, outro para errorFile e o terceiro simplesmente para registrar informações.
Normalmente, vi que os níveis de log são diferentes, mas o arquivo de log é o mesmo.
Não vejo um padrão de observador tão ruim para o registro, pois desacopla seu código de registro do código do aplicativo. Qual é uma boa prática, migrar para diferentes mecanismos de registro é fácil dessa maneira. Toda vez que você desejar registrar, inicie um evento e o ouvinte apropriado receberá e registrará o evento. Deve haver um objeto singleton intermediário que contém a lista de todos os registros.
Dessa forma, vejo que podemos separar nosso código de log do código do aplicativo.
fonte