И? Вы попросили отнести к категории, я отнес к категории.
Так какое из них?
Любое из этих определений является определением. Вы же попросили привести определение, я привел.
Но для сложных понятий, процессов и явлений такой метод не подходит: нужно выделить существенный признак и обобщить по нему.
Для последовательности букв последовательность букв это существенный признак. Он является определяющим.
Чего вы в своём определении не сделали
Поэтому сделал. Но вы же говорили, что для определения надо задать категорию. Я отвечал на это утверждение.
ибо индивидуальный язык невозможен
Мой язык не индивидуальный, любой может прочитать это определение и использовать его. Более того, так сформированы примерно все определения в любых областях науки. Пример - термин "аромат кварка". Люди просто договорились называть это явление словом "аромат", которое в других областях имеет другое значение.
С точки зрения удобства в коде нам конечно было бы лучше всего сделать так: // Инвариант: нельзя получить скидку по неактивной карте return null;
А потом приходит менеджер и говорит "У меня в админке для неактивных карт не показывается какая там была скидка, сделайте чтобы показывалось".
Минусы такого решения очевидны: Существует возможность изменить валюту накопления, забыв сбросить уровни лояльности.
Такая возможность существует даже с логикой в сущностях. Пример есть прямо у вас в статье, только наоборот. Вы в LoyaltyProgram::changeCurrency() пропустили установку newCurrency.
За транзакцию отвечает сервис, а значит, нужно следить и за тем, чтобы никто не забывал оборачивать весь код с бизнес-логикой в транзакции по всей кодовой базе.
Это аналогично утверждению "нужно следить за тем, чтобы никто не забывал проверять инварианты / делать валидацию входных данных / писать логику в правильной сущности". Никакой проблемы в этом нет. Ваш подход содержит гораздо больше вариантов за чем надо следить, и потому требует гораздо больше усилий.
$this->levels->resetRequiredAmounts(); //внутри foreach по уровням
Сама необходимость такого коммента говорит о том, что ваш код менее понятный, чем был в сервисе.
Теперь изменение валюты невозможно без обнуления настроек уровней
Да ну как это невозможно. Вы сказали, что с сервисом можно написать новый метод, в котором не будет обнуления настроек уровней. C логикой в сущностях будет точно так же.
class LoyaltyProgram
{
public function changeCurrency(LoyaltyCurrency $newCurrency): void
{
...
}
public function changeCurrencyNew(LoyaltyCurrency $newCurrency): void
{
if ($newCurrency === $this->currency) {
return;
}
$this->currency = $newCurrency;
// не сбрасываем уровни
}
}
а сохранение всего агрегата происходит атомарно
Ну то есть в проекте появилось больше магии. К тому же транзакция теперь запускается всегда, а не только когда нужно, что влияет на производительность.
и мы при написании кода об этом можем больше не задумываться
Зато должны задумываться о куче других вещей. Например искать где находится foreach по уровням. А также: писать доменный сервис или не писать, как не загружать историю всех событий, как изменить свойства вложенного объекта LoyaltyCard, и т.д.
не может быть ни микросекунды времени, когда ваш агрегат содержит неправильные с точки зрения бизнес-логики данные в приведенном выше примере объект класса LoyaltyProgram всегда содержит в себе консистентные данные
Это ложь. В середине вызова changeCurrency, после установки newCurrency (которой у вас нет) и до вызова resetRequiredAmounts объект класса LoyaltyProgram содержит неконсистентные данные. А если оценивать только после завершения метода с логикой, то и с сервисом надо так же делать.
Когда вся логика сосредоточена в агрегатах, сделать это сложнее.
Да нисколько не сложнее. Точно так же берем и пишем новый метод с любой логикой.
При сохранении агрегата в репозитории мы обеспечим атомарное сохранение и того и другого. $changesObserver = DoctrineEntityChangesObserver::instance(); foreach ($changesObserver->getNewMaterials() as $material)
А чего это у вас репозиторий сохраняет данные, не относящиеся к агрегату? Вы же только что доказывали, что они должны быть частью агрегата. Кроме того, теперь бизнес-логика действия находится не только в сущности, а еще и в неком MaterialAddedSubscriber. Глобальные переменные, синглтоны. И на это вы предлагаете заменять простой тестируемый сервис с зависимостями в конструкторе?
Угу, добавим еще больше магии. Убрали event subscriber, и всё перестало работать. Где тут простота поддержки, для которой мы хотели использовать DDD?
и вы возлагаете на слой Application ответственность вытащить карту из репозитория и обернуть в транзакцию сохранение ПЛ и карты
Ну то есть фактически пишете сервис.
как проектировать доменный агрегат, чтобы он не стал безразмерным К сожалению, тут нет четких универсальных рецептов. И здесь нет однозначно правильных вариантов.
Философы и учёные в курсе, что апелляция к авторитету является логической ошибкой.
можете попробовать
Как и аргумент к личности. Я не смогу дать многие определения понятий из квантовой физики, но это не значит, что их не существует или не может существовать.
начав с того, что отнести это понятие к какой-то категории
Ок. Отношу это понятие к категории номер 1. Как люди используют понятия, не относя их к какой-то категории, и как понятия вообще появились, обсуждать не будем. Раз у вас аргументы уровня "Ну вот тот чувак так сказал, не знаю почему".
можете попробовать дать определение понятию "пространство"
https://slovarozhegova.ru/word.php?wordid=24901 Пространство 1. Одна из форм существования бесконечно развивающейся материи, характеризующаяся протяженностью и объемом. 2. Протяженность, место, не ограниченное видимыми пределами. 3. Промежуток между чем-н., место, где что-н. вмещается.
потому что только так можно дать корректное определение
Определение: В рамках этой ветки комментариев словом "абырвалг" будем называть последовательность букв ABCD.
Пример использования: Как называется последовательность ABCD? В соответствии с приведенным выше определением она называется "абырвалг".
Это корректное определение, при этом ни к какой категории я его не относил. Значит ваше утверждение неверно.
Представьте, как будет выглядеть этот if для 10 обязательных полей
Так же, как и с логикой в сущности. Если вам надо проверить 10 полей, значит вам надо проверить 10 полей.
часто в такие сервисы с логикой тащат инфраструктурные зависимости, такие как доктриновский EntityManager При таком подходе код становится существенно грязнее
При таком подходе единственная разница будет в том, что вместо $this->transactionalSession будет $this->entityManager.
Код какого из вариантов чище и лаконичнее, судите сами
Угу, в одном из вариантов молча заменили проверки на один вызов $client->profileComplete(), код которого не привели, и предлагаете сравнивать. С конструкторами тоже, логика в сервисах не запрещает делать конструктор с параметрами.
Последовательная логика из бизнес-требований теперь разбросана по разным местам. Что за "accountActivated", какой части бизнес-требований он соответствует? Открываем метод "BonusAccount::activate()", где там сохранение в истории факта активации бонусной программы? А-а, это оказывается одно и то же. Потратили много времени просто чтобы найти где что. А в сервисе это написано прямым текстом. Особенно если вынести эти шаги в private-методы с понятными названиями.
Первый минус, который из этого вытекает, состоит в том, что вам придется аккумулировать и контролировать знания о том, а какие в проекте есть сервисы с логикой.
А с логикой в сущностях вам придется аккумулировать и контролировать знания о том, какие в проекте есть сущности с логикой.
то легко возникнет ситуация, когда в рамках новой логики бонусный счет может быть активирован без соблюдения уже существующих правил: обязательного заполнения профиля и записи события активации в историю.
Если разработчик, взявший новую задачу в работу, не узнал про метод BonusAccount::activate() (например потому что их там несколько десятков) или не увидел его в структуре проекта, то легко возникнет ситуация, когда в рамках новой логики бонусный счет может быть активирован без соблюдения уже существующих правил: обязательного заполнения профиля и записи события активации в историю.
Чтобы включить старую бизнес-логику в новую, вам придется сделать одно из двух: либо продублировать код со всеми вытекающими, либо запутать код, притащив BonusAccountService в зависимости нового сервиса, и вызывая его там.
Ни то ни другое. Во-первых, новый метод активации скорее всего надо будет добавить в BonusAccountService. Точно так же, как вы будете их добавлять в BonusAccount, из-за чего она постепенно превратится в God-object. Во-вторых, у вас есть новые бизнес-требования, они могут содержать совершенно другую логику активации. С одним сервисом общие части можно вынести в private-методы, с разными в отдельный общий сервис, и вызывать их в нужном порядке. Вызывать один сервис верхнего уровня из другого неправильно.
Проблема в том, что нет такого паттерна как Service. Возможно стоит именовать предложенный подход как то иначе?
Ну как это нет. Он называется "Бизнес-логика в сервисах". Только это не паттерн, а архитектурный подход.
Необязательно делать отдельный сервис на каждое действие, тогда можно переиспользовать зависимости и private-методы в реализации разных связанных бизнес-действий.
При чем тут показать пальцем? Я сказал "Определение того, что такое молния". Показывание пальцем никоим образом не является определением.
Но вы попробуйте объяснить это человеку без примера и объективно. для "здравого смысла"
Не понял эту логику. То есть для термина "молния" можно считать нормальным, если его без примера и объективно объяснить нельзя, а для другого термина нет?
Вы можете дать такого определение?
Я не смогу дать многие определения понятий из квантовой физики, но это не значит, что их не существует или не может существовать.
Разговор был про принципиальную возможность определения. Она идет из того факта, что люди хотя бы для себя отличают "тут можно назвать здравым смыслом, тут нет". Это можно изучать, и в результате определить критерии, как человек это отличает. Потом собрать данные по разным людям и попытаться найти общее.
Ок. И? Я нигде не подразумевал критерий "должно существовать в словаре".
Если слово в каком-то контексте имеет смысл, то оно существует.
Я нигде не говорил, что какого-то слова не существует.
которые буквально так же и говорят, что если слова нет в словаре, то его не существует
Я такого не говорил ни буквально, ни не буквально.
Существует ли в реальном мире "два"?
А это тут при чем? Это оффтоп, мне неинтересно это обсуждать.
Вы сделали утверждение "Определения "сепулек" не существует без рекурсивности к изначальному определению".
Я сказал, что то определение, которое ссылается на изначальное, существует только в книге и начинается с "важный элемент цивилизации ардритов с планеты Энтеропия". В реальности нет никаких ардритов и планеты Энтеропия. Когда вы мне сказали это слово, вы не подразумевали цивилизацию ардритов. А что вы подразумевали? Вот это и будет определением этого слова в реальности, или по крайней мере его частью. И оно не рекурсивное. Пример выше на скриншоте.
Книга ничем не отличается от разговора в практическом смысле.
В данном случае отличается. В книге описан сюжет, который задает контекст, и который не существует в реальности. В разговоре при использовании этого слова никто не подразумевает цивилизацию ардритов.
Определения "сепулек" не существует без рекурсивности к изначальному определению.
В сюжете книги да. Там есть словарь с определениями. В реальности этого словаря нет, и это слово в разговорах используется не так, как его могли бы использовать персонажи сюжета. В реальности люди знают, что это шутка из книги, и обозначают схожие ситуации. Как это сделали и вы.
Это подмена тезиса. Мы не говорили о том, что знаю я. Я не смогу дать многие определения понятий из квантовой физики, но это не значит, что их не существует.
Понятие существует, это факт. Люди им что-то называют, это тоже факт. Значит каждый отдельный человек имеет какие-то критерии что им называть, пусть даже не может их сформулировать. Можно сравнить много примеров и найти в них общие черты. Просто формализовать их можно будет только после изобретения ИИ или прибора для чтения мыслей.
Я не говорил, что определение уже существует, и что оно качественное.
Вы уклонились от прямого ответа. Сначала вы сказали, что у понятия "сепульки" есть нюансы, а теперь говорите про "какое-то понятие". Вот если бы вы описали нюансы конкретно понятия "сепульки", то это и было бы практически определение. Не того, что в книге, а того, что люди им обозначают в разговорах.
Вопрос был "Можно ли определить это понятие". Я говорю о том, что раз люди им что-то называют, значит можно определить. В книге этим понятием ничего не называют. В реальности он используется как "пример самозависимого определения, которое неизвестно что означает". Вот то, что в кавычках, вполне можно считать определением понятия "сепульки" в реальности (не в книге). То есть это ответ на вопрос "Что обычно называют словом "сепульки"?". Аналогично с понятием "здравый смысл". Люди им что-то называют, у этого можно найти общие черты.
Не слежу ни за какими личными блогами, не получаю информацию по RSS, ни на кого не подписываюсь. Читаю только Хабр, статьи в ленте по выбранным хабам, независимо от автора, открываю те, которые кажутся интересными по названию, описанию или рейтингу. Предполагаю, что таких людей много.
Я об этом и говорю. В вашем примере каждая карта останавливает понемногу, никакой магии тут нет. Но это свойство есть даже у отдельной карты. А вот чтобы 2 карты стояли треугольником, их надо наклонить друг на друга. Это именно эмерджентное свойство системы из 2 карт, но оно не появляется из ниоткуда, все распределения сил можно отследить. А если вы будете карты ложить горизонтально друг на друга, треугольник из них не сложится, даже если вы их положите миллион.
обладающие эмерджентным эффектом Эмерджентные свойства - это способность системы проявлять новое свойство во время общей работы отдельных частей. эмерджентные свойства сами переступят определённый порог
Ну хватит уже использовать слово "эмерджентный" как синоним "магический". Само по себе ничего не появляется, всё обусловлено свойствами элементов системы. Все зависимости можно отследить и описать. Это не значит, что каждый элемент обладает всеми свойствами системы.
Карты в карточном домике поддерживают друг друга. Это не значит, что одна карта может стоять в наклонном состоянии или висеть в воздухе.
Логическая ошибка
"апелляция к авторитету"
И? Вы попросили отнести к категории, я отнес к категории.
Любое из этих определений является определением. Вы же попросили привести определение, я привел.
Для последовательности букв последовательность букв это существенный признак. Он является определяющим.
Поэтому сделал. Но вы же говорили, что для определения надо задать категорию. Я отвечал на это утверждение.
Мой язык не индивидуальный, любой может прочитать это определение и использовать его. Более того, так сформированы примерно все определения в любых областях науки. Пример - термин "аромат кварка". Люди просто договорились называть это явление словом "аромат", которое в других областях имеет другое значение.
А потом приходит менеджер и говорит "У меня в админке для неактивных карт не показывается какая там была скидка, сделайте чтобы показывалось".
Такая возможность существует даже с логикой в сущностях.
Пример есть прямо у вас в статье, только наоборот. Вы в LoyaltyProgram::changeCurrency() пропустили установку newCurrency.
Это аналогично утверждению "нужно следить за тем, чтобы никто не забывал проверять инварианты / делать валидацию входных данных / писать логику в правильной сущности".
Никакой проблемы в этом нет. Ваш подход содержит гораздо больше вариантов за чем надо следить, и потому требует гораздо больше усилий.
Сама необходимость такого коммента говорит о том, что ваш код менее понятный, чем был в сервисе.
Да ну как это невозможно.
Вы сказали, что с сервисом можно написать новый метод, в котором не будет обнуления настроек уровней.
C логикой в сущностях будет точно так же.
Ну то есть в проекте появилось больше магии. К тому же транзакция теперь запускается всегда, а не только когда нужно, что влияет на производительность.
Зато должны задумываться о куче других вещей. Например искать где находится foreach по уровням.
А также: писать доменный сервис или не писать, как не загружать историю всех событий, как изменить свойства вложенного объекта LoyaltyCard, и т.д.
Это ложь. В середине вызова changeCurrency, после установки newCurrency (которой у вас нет) и до вызова resetRequiredAmounts объект класса LoyaltyProgram содержит неконсистентные данные.
А если оценивать только после завершения метода с логикой, то и с сервисом надо так же делать.
Да нисколько не сложнее. Точно так же берем и пишем новый метод с любой логикой.
А чего это у вас репозиторий сохраняет данные, не относящиеся к агрегату? Вы же только что доказывали, что они должны быть частью агрегата. Кроме того, теперь бизнес-логика действия находится не только в сущности, а еще и в неком MaterialAddedSubscriber.
Глобальные переменные, синглтоны. И на это вы предлагаете заменять простой тестируемый сервис с зависимостями в конструкторе?
Угу, добавим еще больше магии. Убрали event subscriber, и всё перестало работать. Где тут простота поддержки, для которой мы хотели использовать DDD?
Ну то есть фактически пишете сервис.
Ну то есть ответа у вас нет.
Философы и учёные в курсе, что апелляция к авторитету является логической ошибкой.
Как и аргумент к личности. Я не смогу дать многие определения понятий из квантовой физики, но это не значит, что их не существует или не может существовать.
Ок. Отношу это понятие к категории номер 1.
Как люди используют понятия, не относя их к какой-то категории, и как понятия вообще появились, обсуждать не будем. Раз у вас аргументы уровня "Ну вот тот чувак так сказал, не знаю почему".
https://slovarozhegova.ru/word.php?wordid=24901
Пространство
1. Одна из форм существования бесконечно развивающейся материи, характеризующаяся протяженностью и объемом.
2. Протяженность, место, не ограниченное видимыми пределами.
3. Промежуток между чем-н., место, где что-н. вмещается.
Определение:
В рамках этой ветки комментариев словом "абырвалг" будем называть последовательность букв ABCD.
Пример использования:
Как называется последовательность ABCD? В соответствии с приведенным выше определением она называется "абырвалг".
Это корректное определение, при этом ни к какой категории я его не относил. Значит ваше утверждение неверно.
Понятия и их определения существуют независимо от того, что говорил Аристотель. Раз люди их используют, значит что-то ими обозначают.
Так же, как и с логикой в сущности. Если вам надо проверить 10 полей, значит вам надо проверить 10 полей.
При таком подходе единственная разница будет в том, что вместо
$this->transactionalSession
будет$this->entityManager
.Угу, в одном из вариантов молча заменили проверки на один вызов
$client->profileComplete()
, код которого не привели, и предлагаете сравнивать.С конструкторами тоже, логика в сервисах не запрещает делать конструктор с параметрами.
Последовательная логика из бизнес-требований теперь разбросана по разным местам.
Что за "accountActivated", какой части бизнес-требований он соответствует?
Открываем метод "BonusAccount::activate()", где там сохранение в истории факта активации бонусной программы?
А-а, это оказывается одно и то же. Потратили много времени просто чтобы найти где что. А в сервисе это написано прямым текстом. Особенно если вынести эти шаги в private-методы с понятными названиями.
А с логикой в сущностях вам придется аккумулировать и контролировать знания о том, какие в проекте есть сущности с логикой.
Если разработчик, взявший новую задачу в работу, не узнал про метод BonusAccount::activate() (например потому что их там несколько десятков) или не увидел его в структуре проекта, то легко возникнет ситуация, когда в рамках новой логики бонусный счет может быть активирован без соблюдения уже существующих правил: обязательного заполнения профиля и записи события активации в историю.
Ни то ни другое. Во-первых, новый метод активации скорее всего надо будет добавить в BonusAccountService. Точно так же, как вы будете их добавлять в BonusAccount, из-за чего она постепенно превратится в God-object.
Во-вторых, у вас есть новые бизнес-требования, они могут содержать совершенно другую логику активации. С одним сервисом общие части можно вынести в private-методы, с разными в отдельный общий сервис, и вызывать их в нужном порядке. Вызывать один сервис верхнего уровня из другого неправильно.
А, это все минусы? Ну ок.
Ну как это нет. Он называется "Бизнес-логика в сервисах". Только это не паттерн, а архитектурный подход.
Необязательно делать отдельный сервис на каждое действие, тогда можно переиспользовать зависимости и private-методы в реализации разных связанных бизнес-действий.
ИИ, как следует из названия, должен быть интеллектом, и понимать такие загадки без подсказок.
При чем тут показать пальцем? Я сказал "Определение того, что такое молния". Показывание пальцем никоим образом не является определением.
Не понял эту логику. То есть для термина "молния" можно считать нормальным, если его без примера и объективно объяснить нельзя, а для другого термина нет?
Я не смогу дать многие определения понятий из квантовой физики, но это не значит, что их не существует или не может существовать.
Разговор был про принципиальную возможность определения. Она идет из того факта, что люди хотя бы для себя отличают "тут можно назвать здравым смыслом, тут нет". Это можно изучать, и в результате определить критерии, как человек это отличает. Потом собрать данные по разным людям и попытаться найти общее.
Ок. И?
Я нигде не подразумевал критерий "должно существовать в словаре".
Я нигде не говорил, что какого-то слова не существует.
Я такого не говорил ни буквально, ни не буквально.
А это тут при чем? Это оффтоп, мне неинтересно это обсуждать.
Вы сделали утверждение "Определения "сепулек" не существует без рекурсивности к изначальному определению".
Я сказал, что то определение, которое ссылается на изначальное, существует только в книге и начинается с "важный элемент цивилизации ардритов с планеты Энтеропия". В реальности нет никаких ардритов и планеты Энтеропия. Когда вы мне сказали это слово, вы не подразумевали цивилизацию ардритов. А что вы подразумевали? Вот это и будет определением этого слова в реальности, или по крайней мере его частью. И оно не рекурсивное. Пример выше на скриншоте.
Определение того, что такое молния, тоже не сразу появилось.
Ну через какое-то время возможно и появится. Разговор был можно ли его определить в принципе. В принципе можно.
В данном случае отличается. В книге описан сюжет, который задает контекст, и который не существует в реальности. В разговоре при использовании этого слова никто не подразумевает цивилизацию ардритов.
В сюжете книги да. Там есть словарь с определениями. В реальности этого словаря нет, и это слово в разговорах используется не так, как его могли бы использовать персонажи сюжета. В реальности люди знают, что это шутка из книги, и обозначают схожие ситуации. Как это сделали и вы.
Это подмена тезиса. Мы не говорили о том, что знаю я. Я не смогу дать многие определения понятий из квантовой физики, но это не значит, что их не существует.
Понятие существует, это факт. Люди им что-то называют, это тоже факт. Значит каждый отдельный человек имеет какие-то критерии что им называть, пусть даже не может их сформулировать. Можно сравнить много примеров и найти в них общие черты. Просто формализовать их можно будет только после изобретения ИИ или прибора для чтения мыслей.
Я не говорил, что определение уже существует, и что оно качественное.
Вы уклонились от прямого ответа. Сначала вы сказали, что у понятия "сепульки" есть нюансы, а теперь говорите про "какое-то понятие". Вот если бы вы описали нюансы конкретно понятия "сепульки", то это и было бы практически определение. Не того, что в книге, а того, что люди им обозначают в разговорах.
Вопрос был "Можно ли определить это понятие". Я говорю о том, что раз люди им что-то называют, значит можно определить. В книге этим понятием ничего не называют. В реальности он используется как "пример самозависимого определения, которое неизвестно что означает". Вот то, что в кавычках, вполне можно считать определением понятия "сепульки" в реальности (не в книге). То есть это ответ на вопрос "Что обычно называют словом "сепульки"?".
Аналогично с понятием "здравый смысл". Люди им что-то называют, у этого можно найти общие черты.
Я в курсе, что это за слово и откуда. Я не просто так попросил вас сформулировать явно.
Это какие же? Попробуйте их сформулировать.
Раз оно существует, значит можно.
Если это решение, значит оно подходит для достижения цели, значит входит в рациональное поведение.
Не слежу ни за какими личными блогами, не получаю информацию по RSS, ни на кого не подписываюсь. Читаю только Хабр, статьи в ленте по выбранным хабам, независимо от автора, открываю те, которые кажутся интересными по названию, описанию или рейтингу. Предполагаю, что таких людей много.
Я об этом и говорю. В вашем примере каждая карта останавливает понемногу, никакой магии тут нет. Но это свойство есть даже у отдельной карты. А вот чтобы 2 карты стояли треугольником, их надо наклонить друг на друга. Это именно эмерджентное свойство системы из 2 карт, но оно не появляется из ниоткуда, все распределения сил можно отследить. А если вы будете карты ложить горизонтально друг на друга, треугольник из них не сложится, даже если вы их положите миллион.
Ну хватит уже использовать слово "эмерджентный" как синоним "магический". Само по себе ничего не появляется, всё обусловлено свойствами элементов системы. Все зависимости можно отследить и описать. Это не значит, что каждый элемент обладает всеми свойствами системы.
Карты в карточном домике поддерживают друг друга. Это не значит, что одна карта может стоять в наклонном состоянии или висеть в воздухе.