Ввод в эксплуатацию и зависимость

Я пытаюсь создать и приложение на основе Java.

Для инъекций зависимостей я использую Google Guice.

Теперь я столкнулся с проблемой регистрации некоторой информации во время приложения. Я не говорю об общем протоколировании способом вызова методов и т.д. Я знаю о AOP, и что я могу делать как трассировку вызова метода и т.д. С что.

То, что я ищу, - это ручное ведение журнала. Мне нужно как-то войти в почти каждый класс в моем приложении. Поэтому я подумал о двух вариантах:

  • Получение регистратора с помощью фреймворка Guice, выполняющего это для меня через конструктор (или сеттер или частный...), но похоже, что добавление заботы о журнале действительно для каждого класса и загрязняет мой конструктор.
  • с помощью глобального локатора служб в методе, где я хочу вызвать журнал. Uhh, но все поклонники DI будут ненавидеть меня за это.

Итак, что является лучшим способом с практической точки зрения?

Ответ 1

Мне нужно как-то войти в почти каждый класс в моем приложении.

Подумайте еще раз. Если вы считаете, что вам нужно вести журнал почти в каждом классе, в вашем дизайне что-то не так. fooobar.com/info/57584/... говорит о том, что может быть неправильным в вашем дизайне. Он ответил в контексте .NET, но ответ применим и к Java.

Этот ответ в основном говорит о регистрации исключений, для ведомости без исключения я бы сказал: Предотвращение регистрации слишком большого количества информации в слишком многих местах. Для каждой информации или предупреждения, которое вы хотите зарегистрировать, задайте вопрос, не должно ли это быть исключением в первую очередь. Например, не записывайте такие вещи, как "мы не должны быть в этой ветке", но генерируем исключение!

И даже если вы хотите регистрировать отладочную информацию, кто-нибудь когда-нибудь собирается это прочитать? Вы получите файлы журналов с тысячами и тысячами строк, которые никто не будет читать. И если они читают его, они должны пробираться по всем этим строкам текста и выполнять сложные поисковые запросы, чтобы получить информацию, которую они искали.

Другая причина, по которой я вижу разработчиков, заключается в том, чтобы скрыть свой плохой код. Так же, как комментарии используются таким образом. Я вижу, что разработчики записывают такие вещи, как "мы выполнили этот блок" или "это, если ветка пропущена". Таким образом, они могут отслеживать код и большие методы.

Однако, вместо того, чтобы писать большие методы, мы все знаем, что методы должны быть небольшими. Нет, еще меньше. Кроме того, если вы unit test ваш код тщательно, нет причин для отладки кода, и вы подтвердили, что он делает то, что он должен делать.

И снова хороший дизайн может помочь здесь. Когда вы используете проект, описанный в этом ответе Stackoverflow (с обработчиками команд), вы можете снова создать один декоратор, который может сериализовать любое произвольное командное сообщение и записать его на диск до начала выполнения. Это дает вам удивительно точный журнал. Просто добавьте в журнал некоторую контекстную информацию (например, время выполнения и имя пользователя), и у вас есть контрольный журнал, который можно даже использовать для воспроизведения команд во время отладки или даже тестирования нагрузки.

Я использую этот тип дизайна приложения уже пару лет, и с тех пор у меня почти нет причин делать дополнительные записи в бизнес-логике. Это нужно время от времени, но эти случаи довольно редки.

но похоже, что добавление проблемы ведения журнала каждый класс и загрязняет мой конструктор

Он делает, и вы получите конструкторы со слишком большим количеством параметров. Но не вините регистратора, обвините свой код. Вы нарушаете принцип единой ответственности. Вы можете "скрыть" эту зависимость, вызвав ее через статический фасад, но это не уменьшает количество зависимостей и общую сложность класса.

используя глобальный локатор службы в методе, где я хочу вызвать журнал. Uhh, но все поклонники DI ненавидят меня за это.

В конце концов, вы будете ненавидеть себя за это, потому что у каждого класса все еще есть дополнительная зависимость (в этом случае хорошо скрытая зависимость). Это делает каждый класс более сложным и заставит вас иметь больше кода: больше кода для тестирования, больше кода, чтобы иметь ошибки, больше кода для поддержки.