metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-07-26 06:30 am

ООП-пуристский вопрос

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

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

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

[identity profile] lionet.livejournal.com 2009-07-26 03:49 am (UTC)(link)
Нет, нельзя. Необходимо сделать из этого класса монаду и параметризовать её моноидом трассировки.

[identity profile] zamotivator.livejournal.com 2009-07-26 09:28 am (UTC)(link)
Странный какой-то вопрос. Решений как обычно два:
1) Синглтон
2) Ссылка на логгер
Дальше начинаются вопросы "как это всё оформить красиво". Т.е. дизайн.

Есть подозрение, что ты не описал задачу, которую решаешь.
Что тебя смущает?

[identity profile] pete-by.livejournal.com 2009-07-26 02:46 pm (UTC)(link)
AOP специально для таких случаев придумали.

[identity profile] blackyblack.livejournal.com 2009-07-26 06:28 pm (UTC)(link)
lionet всё здорово и правильно описал.
Единственное что можно поправить - это сильно сложное описание статического поля для экземпляра логгера. Если представить, что кому-то в руки попал твой класс, а логгер он ещё не скачал, то придётся не только создавать заглушку на ILog, но и приделывать таинственный неймпспейс log4net.
К тому же неясно, зачем тут рефлекшн. Точнее ясно, но неясно как логгер оторвать от класса с наличием этого рефлекшена.