metaclass: (Default)
[personal profile] metaclass
Может ли класс, являющийся моделью для данных предметной области, содержать в себе ссылку на логгер(log4net,log4j) и выводить данные в лог? :)

Вот представьте себе, есть у вас описание какой-нибудь хреновины, например карточка клиента. И эта карточка при попытках сделать с ней что-нибудь нехорошее, записывает это дело и отсылает "куда нужно" :)

Если бы это был Haskell, такого вопроса не возникло бы вообще, т.к. данные они и есть данные, а в лог без таскания за собой IO или unsafePerformIO и не запишешь ничего.

Date: 2009-07-26 03:52 am (UTC)
From: [identity profile] metaclass.livejournal.com
Хм, забавненько. Это так же означает, что остальные взаимодействия с внешним миром или хотя бы с другими частями системы можно оформить в таком же стиле.

Date: 2009-07-26 03:56 am (UTC)
From: [identity profile] lionet.livejournal.com
Шутка это. На самом деле, с практической точки зрения логгинг — достаточно небольшое зло, чтобы его пихать в класс. Да, слишком сильный каплинг, но если это не библиотека а свой продукт, то хрен бы с ним.

Если это библиотека, то было бы неплохо использовать шаблон функциональности, параметризованный трассировочным классом (функцией?), соответствующей какому-то условному стандарту, и описать этот стандарт концептом (если бы он был зааппрувлен). Если это не C++ (по виду — Java), то тогда не очень знаю, как там такое замутить. Наверное при инстанциации класса передавать логгер, с известным интерфейсом, в параметре.

Date: 2009-07-26 04:01 am (UTC)
From: [identity profile] metaclass.livejournal.com
В жаба-дотнетах подобные общие вещи обычно не через конструктор передают, а в IoC контейнер пихают, который в свою очередь их объектам создаваемым раздает - иначе слишком много придется одинаковых/похожих конструкторов писать.

Но у меня конкретно, в дотнете, это вообще статик поле, как принято их инициализировать:
static log4net.ILog mLog = log4net.LogManager.GetLogger(System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType);

Date: 2009-07-26 04:05 am (UTC)
From: [identity profile] lionet.livejournal.com
А этому интерфейсу ещё какая-то независимая имплементация логгера соответствует, или это log4net специфичный интерфейс?

Date: 2009-07-26 04:07 am (UTC)
From: [identity profile] metaclass.livejournal.com
Он-то специфичный, но я не вижу особой проблемы реализовать какой-то другой логгер. Для log4net в принципе этого и не нужно - он и сам во всех вариантах конфигурируемый, но вроде можно и свой логгер сделать.

Date: 2009-07-26 06:43 am (UTC)
From: [identity profile] feorex.livejournal.com
Юзаю log4net. Добавляю его в классы, ничего страшного в это не вижу.
Можно, конечно, сделать логирование заюзав AOP, но как-то не прижилась эта идея в продакшене.

Date: 2009-07-26 04:00 am (UTC)
From: [identity profile] lionet.livejournal.com
Это так же означает, что остальные взаимодействия с внешним миром или хотя бы с другими частями системы можно оформить в таком же стиле.

Для целей тестирования, как минимум, важно иметь возможность извлечь функциональность и потыкать её с разных сторон. Логгинг этому будет мешать в какой-то степени, но остальные взаимодействия с внешним миром как пить дать мешать этому будут гораздо больше. Например, чтение конфига, отдача ответов по SNMP, etc — это всё пристёгиваемые сверху (методом взятия на себя ответственности за ведение обсуждаемой функциональности) или сбоку (методом [опциональной] параметризации функциональности объектами со стандартным интерфейсом) активности.

Тогда можно добыть голый функционал и даже отдать его кому-то без исходников.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 31st, 2025 12:53 pm
Powered by Dreamwidth Studios