Методы именования сервисов данных

Когда вы работаете с ORM, который реализует шаблон UnitOfWork (сеанс NHibernate, ObjectContext Entity Framework и т. Д.), Существует два типа методов служб данных: те, которые сохраняют / фиксируют изменения, и те, которые просто изменяют свойства модели.

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

Как я могу решить эту проблему? Единственная идея, которую я имею, - это специальное наименование. Например, AddCustomer для метода сохранения и FillForAddCustomer для метода без сохранения. Есть другие идеи?

1 ответ

Решение

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

Первый способ - сделать что-то, как вы предлагаете, и обработать разницу между "постоянными" методами и "непостоянными" методами с помощью соглашения. Ruby использует аналогичный подход с методами, указывая "опасные" методы (т.е. те, которые изменяют объект, к которому они обращаются, или их аргументы), заканчивая имя метода восклицательным знаком (!). В зависимости от вашей культуры разработки, такое соглашение может работать очень хорошо, а может и нет. Проблема, с которой я сталкиваюсь с подобными соглашениями, заключается в том, что это еще одна вещь, которую я должен помнить, ее трудно проверить на согласованность, и для кого-то новичка в кодовой базе менее очевидно, что соглашение существует.

Еще один способ решения этой проблемы - использование шаблона разделения ответственности командного запроса (CQRS). Идея в том, что вместо Repository для объекта домена, который заботится как о получении постоянных объектов, так и о сохранении новых или обновленных, вы разделяете эти две обязанности. В дополнение к тому, что гораздо яснее относительно того, какие методы сохраняются (вы используете классы из совершенно разных пространств имен), вы также отделяете чтение от записи, что позволяет упростить настройку приложения для повышения производительности в будущем.

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

Другие вопросы по тегам