Это загадка Spreadsheet : , набирает ли телефон номер телефона, или телефон набирает номер на телефоне ?
Возможно, вам будет интересно прочитать Double Dispatch , хотя излишне в вашей ситуации, я считаю .
* Единственный принцип ответственности часто противоречит принципу OO из Скажите, не спрашивайте . Мои чувства по поводу предмета колебались, и я остановился на следующих условиях, когда логика должна входить в предметный объект:
В вашей ситуации я бы предпочел не помещать вызов в службу внутри объекта-сущности, главным образом потому, что служба, похоже, не связана с вашим доменом, а больше связана с постоянством. Доменные объекты должны быть связаны с концепциями домена, и я не думаю, что предоставленная вами услуга соответствует требованиям.
Примером, когда я думаю, что вызов службы в объекте может быть приемлемым, может быть, если ваше приложение использует сторонний сервер рабочего процесса для управления частями его состояния. По сути, это шаблон состояний с состояниями, определенными во время выполнения.
Я думаю, что допустимо, чтобы domainObject.moveToNextState () (предполагая, что этот код «имеет смысл» на вашем вездесущем языке) вызывал службу, которая общается с вашим сервером, поскольку сервер рабочих процессов управляет частью модели домена.
Я добавлю, что DDD очень заинтересован в следовании языку домена. Слышите ли вы, что эксперты домена говорят: «Пользовательское изображение находит, совпадает ли его отпечаток с изображением в службе поставщиков XYZ»? Или они говорят: «Служба поставщика XYZ, учитывая отпечаток большого пальца, указывает, существует ли этот отпечаток большого пальца»? Выберите тот, который больше всего подходит для вашего домена.
Еще несколько мыслей (я много думал об этой проблеме, потому что она занимает центральное место в дизайне):
В книге DDD Эванса есть учетная запись
сущность имеет такие методы, как
кредит (Сумма), дебет (Сумма), перевод на (Счет, Сумма) и
accrue (), но у FundsTransferService есть метод переноса (Account, Account, Amount). Метод TransferTo не вызывает никакой службы, а просто обрабатывает логику, которая включает в себя учетные записи, такие как зачисление и списание правильных сумм.
FundsTransferService, помимо координации, имеет свои собственные правила для проверки, правила, которые не вписываются в Учетные записи. Точная сумма кредита или дебета может быть связана с внешними сторонами. Это усложняет для TransferTo вызов службы.
- Для простых объектов, таких как UserImage, существенная доменная логика, которая может вписаться в сам объект, может быть недостаточной, потому что это, насколько я могу сказать, Агрегат. Я думаю, что агрегаты предоставляют больше возможностей для размещения логики предметной области. Пример учетной записи, вероятно, является совокупным.