Как я могу отделить методы от класса, для работы которого все еще требуется некоторое состояние

#kotlin #oop #design-patterns #axon-framework

#котлин #ООП #дизайн-шаблоны #аксон-каркас

Вопрос:

Предположим, у меня есть класс ресторана(aggregate), который отвечает за управление заказами и деталями питания. Это может выглядеть так

 data class Food(  val foodId: String,  val total: Int )  data class Order(  val orderId: String )  class RestaurantAggregate {  // aggregate identifier  val restaurantId: String  val foodLimit = 10  val orderLimit = 30   val foodList = listOflt;Foodgt;()  val orderList = listOflt;Ordergt;()   fun handle(cmd: CreateOrder){  if (orderList.size gt;= 30) throw error  if (!foodList.exist(cmd.foodId)) throw error  // total of food gt; 0  if (!foodList.isAvaible(cmd.foodId)) throw error  // .. do  }  // .. too many commands managing order   fun handle(cmd: CreateFood){  if (foodList.size gt;= 10) throw error  // .. do  }  // .. too many commands managing food }  

Через некоторое время разработки в классе появилось много команд, и он выглядит как класс бога, поэтому я хочу разделить эти методы на свой собственный класс, но для того, чтобы он работал, ему все равно требуется некоторое состояние от aggregate root в любом случае.

 // I want to separate management to antoher class class Restaurant {  // aggregate identifier  val restaurantId: String  val foodLimit = 10  val orderLimit = 30   val foodList = listOflt;Foodgt;()  val orderList = listOflt;Ordergt;()  // this will be aggregate member so it can handle commands/events  val orderMgmt = OrderManagement()  val foodMgmt = FoodManagement() }  class OrderManagement {  fun handle(cmd: CreateOrder){  // but it will require some state from the aggregate root anyway  if (orderList.size gt;= 30) throw error  if (!foodList.exist(cmd.foodId)) throw error  // .. do  }  // .. many of commands }  class FoodManagement {  // same as above }  

поэтому я подумал, что мог бы использовать инъекцию зависимости и ввести состояние совокупному ребенку, но есть ли лучший способ сделать это?. кстати, я использую axonframework версии 4.4.7

Комментарии:

1. Я не вижу, как класс OrderManagement помогает сделать ваш код более управляемым. По сути, это просто перемещение длинной функции из одного места в другое. Другая стратегия может заключаться в создании интерфейса OrderRule/FoodRule, а затем в создании экземпляров каждого правила, которое вам нужно обработать. Затем ваша handle() функция повторяет установленные вами правила. Эта структура позволила бы вводить определенный набор правил.