[Moscow.pm] Mouse хочу странного
Ivan Petrov
i.petro.77.00 на gmail.com
Чт Окт 17 04:00:47 PDT 2013
> Действительно странного хотите.
> По-моему более очевидно для каждой сущности (игрушка, заказ, пользователь)
> сделать отдельный класс (не роль), в котором прописать, в какой таблице
> хранятся записи для этого класса, а в роль вынести как раз работу с БД.
для каждой сущности (игрушка, заказ, пользователь) уже есть классы
но далее есть запросы вида:
- а какие игрушки у пользователя?
- а какие заказы у пользователя
и подобные
то есть это как раз то что находится между классами.
> Примерно так мы делаем в нашем проекте на работе. При этом никто не мешает
> добавить в класс User метод orders(), который будет возвращать список заказов
> данного пользователя.
именно этой дорогой и шли.
но когда появляется несколько видов построения списка orders,
то получается что все виды выносим в отдельную роль (или надкласс).
а функции начинают получать префиксы и (или) суффиксы
list_orders_processing
list_orders_done
я может суррогатный пример привел, вы на пример смотрите именно как на
пример.
и вот когда функций в одной роли плодится много, то вот хочется неких
неймспейсов чтобы эти функции разделять
> Кусок кода, который иллюстрирует вышесказанное, приведен ниже (я в нём
> использую более привычный мне Moose, но код на Mouse должен выглядеть похоже,
> если не идентично).
это все понятно. именно от этого и идем.
просто возьмем любой большой проект.
в нем всегда есть сущности имеющие отношения на много чего
например юзер:
- может иметь заказы, игрушки, итп итд - другие сущности.
соответственно построение списков, ответы на вопросы чего он имет
итп
- имеет какие-то привелегии
- имеет какие-то отношения с другими пользователями
и так далее
в большом проекте такой список постоянно растет
и вот роли (или надклассы - в зависимости от ситуации) помогают
раскидать методы по разным пакетам по крайней мере.
но все методы в итоге лежат в одном пакете сколько бы ролей/надклассов
мы не сделали.
далее возникают коллизии:
два разных человека сделали одинаковое имя у какого-то has в разных
ветвях иерархии
поскольку данные коллизии иногда выявляются сложно (в том числе и
тестами), то в итоге в большом проекте вводятся ручные полиси, типа
если у нас пакет Package::Name, а имеет роль Package::Thing, то все
методы в Package::Thing обязаны иметь префикс thing_
ну а раз так то почему бы не преобразовать thing_ в thing-> и убрать
из полиси разработки пункт :)
Подробная информация о списке рассылки Moscow-pm