Алгоритм, который вы описали, должен оставаться в агрегированном корне, в противном случае вы получите модель анемичного домена , исключая распространение поля на другой агрегированный корень, где я опишу, что, по моему мнению, вы должны делатьпотом.
Что касается TDD, то метод с доступом "package" к корню агрегата (например, "Calculate ()") должен координировать все действие, которое обычно вызывается либо сервисом, либо объектом репозитория.Это то, что тесты должны выполнять в сочетании с установкой различных комбинаций переменных экземпляра. Совокупный корень должен предоставлять свои переменные экземпляра, коллекцию дочерних элементов, а каждый дочерний элемент должен предоставлять свои переменные экземпляра через геттеры - это позволяет тестам проверять их состояние.В случаях, когда вам необходимо скрыть информацию, создайте пакет этих геттеров или частный доступ и используйте свою платформу модульного тестирования, чтобы сделать их общедоступными для целей тестирования.
Для вашей среды тестирования рассмотрите mocking хранилищеобъекты (вы используете внедрение зависимостей , верно?) для возврата жестко закодированных значений. Если не считать этого, рассмотрите возможность использования чего-то вроде dbunit для работы с базой данных в известном состоянии.
НасколькоИзменения в логике связаны с созданием и изменением. Вы имеете в виду, как сохранить или существует реальный алгоритм для рассмотрения?Если первое, я бы сделал хранилище ответственным, а во втором я бы сделал два отдельных метода (например, "cellCreate () "и" calcUpdate () "), которые делегировать (при необходимости) делегировать ().
Кроме того, есть проблема параллелизма, о которой следует подумать, потому что звучит так, как будто вычисляемые значения зависят от изменяемых полей.Так что либо нужно иметь тщательную блокировку, либо объединять корни, которые могут использоваться клиентом только один раз за раз.Это также относится к распространению поля по агрегатам - я бы, вероятно, использовал репозиторий для этой цели - но вам нужно тщательно продумать, как это должно или не должно влиять на других клиентов, которые используют объект репозитория.