может ли быть приемлемо следующее?
класс Person {
Person (IStorageService) {} ...
void Save () {} ...
}
Эта зависимость не имеет смысла.
Хотя он не сильно связывает Person
с Storage
, поскольку он не связывает их с специфической реализацией хранилища, я утверждаю, что любая такая зависимость не имеет смысла.
Методы как глаголы
Думайте о методах класса как о глаголах, которые будут выполняться этим типом. Вы говорите экземпляру этого типа «сделать что-то» в отношении его локального домена.
Что это значит, когда я, как человек, Save
?
- Я сменил поставщика страховых услуг и сократил свои расходы на 15%?
- Я искупительное божество?
- Я загрузил свою душу в автомат?
Служба хранения может и должна Save
. Люди не могут Save
, и не должны рекламировать, что они могут.
Попытка поднять это в
SaveTo
может иметь больше смысла - то есть public void SaveTo(IStorageService storage)
.
Но тогда вы говорите, что человек отвечает за знание того, как сохранить себя в хранилище. На мой взгляд, это нарушение SRP . Он также показывает отсутствующий фрагмент анализа домена .
Домен для Person
не будет содержать ничего о сохранении, хранении и т. Д. Он будет содержать взаимодействия между людьми и другими вещами на этом уровне домена. Область сохранения данных - лучшее место для метода Save
.
Если Person
находится в проблемной области (на этом уровне абстракции), то Storage
находится в области решения.
Как вы должны отделить свою логику
У вас есть три элемента логики:
Person
- знает о "вещах человека"
Storage
- знает о конкретном типе хранилища и о том, как получить к нему доступ
Storage of Person
- знает о том, как человек должен посвятить себя хранению
Следуя моему совету выше, я бы оставил Person
стоять самостоятельно. Однако вы можете либо разделить логику для Storage
и Storage of Person
, либо объединить их.
Подход, который использует ORM , заключается в разделении всех трех концепций. «Отображение» в «Объектно-реляционном отображении» - это то, где «Хранение личности» инкапсулировано.
Этот подход позволяет вашей логике Storage
сосредоточиться на потенциально сложной задаче чтения конфигурации хранилища, подключения к хранилищу, обеспечения быстрого хранения, выбора альтернативных методов хранения и т. Д. Он также удаляет любую зависимость от модели вашего основного домена, поэтому код хранилища может быть использован любой другой моделью домена.