#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()
функция повторяет установленные вами правила. Эта структура позволила бы вводить определенный набор правил.