Пытаясь понять ваш вопрос
У вас есть сущность ... когда сущность меняется, вы хотите создать версию изменения для вашей сущности.Что мне не ясно, так это то, почему это изменение необходимо отслеживать как для варианта, так и для категории?
Давайте предположим, что ваша сущность car
, а категории для этой сущности: Toyota
, BMW
и Nissan
.Теперь ваша сущность, скажем, «Toyota Corona с id = 123», изменилась.Зачем вам нужно отслеживать изменения в категории?Разве вы не можете просто сказать, что сущность с id = 123 изменилась?
Нарушение SRP
Как я уже упоминал в комментарии, поскольку вы упустили часть своей логики, трудно понять, нарушает ли ваш код SRP или нет, но я могу дать вамнекоторые общие предложения:
У вас есть класс с именем AggregateCalculator
, я предполагаю, что основная ответственность этого класса заключается в вычислении агрегации, которая происходит в методе Transform()
.Теперь вам нужно выполнить 2 шага внутри Transform()
.Это не обязательно является нарушением SRP ... потому что на более высоком уровне ваш калькулятор совокупности делает одну вещь: вычисляет агрегацию.
Вы можете искать общие признаки нарушения SRP:
Согласно 2-му закону Маловича Николы Маловича :
Любой класс, имеющий более 3 зависимостей, должен быть допрошен за нарушение SRP
Если размер вашего класса слишком велик, вам нужно расспросить его о нарушении SRP.
Нарушение СУХОГО
Оба ваших класса: AggregateCalculator
и AdditionCalculator
выполняют свои вычисления в 2 этапа, step-1 и step-2 ... и у вас есть общий метод: DeleteStep1Data()
в обоих классах для удаления step-1 , если step-2 не удается ...Я предполагаю, что реализация DeleteStep1Data()
отличается для каждого из этих классов, но я чувствую, что он все еще содержит дублированный код (не DRY).Можно утверждать, что это также нарушает SRP, потому что AggregateCalculator
отвечает как за: вычисление агрегации, так и за «зеркалирование транзакции с БД» (это трудно сказать, не видя ваш полный код).
Похоже, что оба step-1 и step-2 являются транзакциями БД, поэтому другой подход заключался бы в том, чтобы поместить оба шага в одну транзакцию БД ... например, вы можете написать хранимую процедуру, напримерэто:
CREATE PROCEDURE AggregateCalculationSP
AS
BEGIN
BEGIN TRANSACTION t1
BEGIN TRY
-- do step 1
-- do step 2
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION t1
END CATCH
COMMIT TRANSATION t1
END
Теперь вы можете взять DeleteStep1Data()
из вашего класса.