У меня есть класс, созданный с помощью Moose, который по сути является контейнером данных для списка статей. Все атрибуты - такие как name
, number
, price
, quantity
- являются данными. «Ну, что еще?», Я слышу, как вы говорите. И что еще?
Злой заговор несчастных обстоятельств теперь вынуждает внешнюю функциональность в этот пакет: расчет налога данных в этом классе должен выполняться внешним компонентом. Этот внешний компонент тесно связан со всем приложением, включая базу данных и зависимости, которые разрушают тестируемость компонента, перетаскивая его в рагу из всех соединений. (Даже мысль о рефакторинге налогового компонента из рагу совершенно исключена.)
Так что моя идея состоит в том, чтобы класс принял кодовую ссылку, заключающую в себе компонент расчета налога. В этом случае класс останется независимым от реализации расчета налога (и его возможного кошмара зависимостей), и в то же время позволит интегрироваться со средой приложения.
имеет 'tax_calculator', is => 'ro', isa => 'CodeRef';
Но тогда я бы добавил компонент без данных в свой класс. Почему это проблема? Потому что я (ab) использую $self->meta->get_attribute_list
для сборки экспорта данных для моего класса:
my %data; # need a plain hash, no objects
my @attrs = $self->meta->get_attribute_list;
$data{ $_ } = $self->$_ for @attrs;
return %data;
Теперь кодовая ссылка является частью списка атрибутов. Я мог бы отфильтровать это, конечно. Но я не уверен, что то, что я делаю здесь, является разумным способом продолжить. Так как бы вы справились с этой проблемой, воспринимаемой как необходимость разделения атрибутов данных и атрибутов поведения?