Macie pomysły, jak uprościć ten kod? Muszę wykonać kilka operacji, które zwracają Result
, a następnie, jeśli wszystko jest OK, przekazać wartości z tych resultów do pewnej metody. Jakbym miał kilka operacji do wykonania po sobie, z których każda by zwracała Result
, to bym sobie zrobił łańcuszek z jakimś FlatMap
, ale w sytuacji takiej jak poniżej nie widzę, jak to zrobić.
Result<Discount> discountResult = Discount.Of(request.Discount);
if (!discountResult.HasValue)
return NotValid("Discount not valid.");
Result<CustomerId> customerIdResult = CustomerId.Of(request.CustomerId);
if (!customerIdResult.HasValue)
return NotValid("Customer ID not valid.");
Result<PriceListId> priceListIdResult = PriceListId.Of(request.PriceListId);
if (!priceListIdResult.HasValue)
return NotValid("Price list ID not valid.");
Result<Order> orderResult = Order.Create(discount.Value, customerId.Value, priceListId.Value);
if (!orderResult.HasValue)
{
return Result.Failure(orderResult.Code, orderResult.Message);
}
_orderRepository.Add(orderResult.Value);
return Result.Ok();
I tak w ogóle się zastanawiam, czy na poziomie warstwy aplikacji powinienem używać API zwracającego resulty przy tworzeniu value objectów. Z jednej strony, jesteśmy już po wstępnej walidacji danych w modelu (requeście), więc utworzenie value objectu musi się powieść (jak się nie powiedzie, to jest sytuacja wyjątkowa). Z drugiej strony, ktoś może wywołać tę metodę z pominięciem walidacji (no, handlerów raczej nikt nie wykona z pominięciem walidacji, jeśli walidacja będzie w pipeline, ale jakby to był jakiś serwis aplikacyjny, a nie handler, to taka sytuacja byłaby możliwa). Z trzeciej strony, takie wywołanie w ogóle nie powinno mieć miejsca, jeśli każdy use case ma własny niezależny handler/metodę serwisową.