Рефакторинг этого кода для лучшего использования библиотеки CSharpFunctionalExtensions - PullRequest
2 голосов
/ 19 марта 2020

У меня есть следующий метод с использованием библиотеки CSharpFunctionalExtensions от Владимир Хориков :

public static Result<SomeObject> Create(string value) =>
    value.Length > 10
        ? Result.Fail<SomeObject>($"{nameof(value)} must be less than 10 characters long.")
        : int.TryParse(value, out int result)
            ? Result.Ok(new SomeObject(result))
            : Result.Fail<SomeObject>($"{nameof(value)} must be a number.");

Он делает то, что я хочу, но я не доволен моя реализация. Не похоже, что я наилучшим образом использую библиотеку и ее возможности - но, несмотря на свои исследования, я не могу лучше обернуть голову. Я чувствую, что должен как-то обернуть проверочные вызовы в Result.OnSuccess(), но они не возвращают Result, они возвращают bool значений.

Я пытаюсь сделать что-то вроде этого псевдокода:

public static Result<SomeObject> Create(string value) =>
    Result
      .Is(
         () => !(value.Length > 10, // success criteria
         value, // success value
         $"{nameof(value)} must be less than 10 characters long." // Result.Fail
     ).Is( 
          () => int.TryParse(value, out int result),
          result, // changing the success value to an int
          $"{nameof(value)} must be a number."
     );

Я почти уверен, что библиотека уже поддерживает то, что я пытаюсь сделать, но я борюсь с "как". Любая помощь очень ценится.

1 Ответ

1 голос
/ 12 апреля 2020

Как насчет использования обеспечения и карты. Вот так

public static Result<SomeObject> Create(string value)
{
    int result = 0;

    return Result.Ok()
        .Ensure(() => value.Length <= 10,
                errorMessage: $"{nameof(value)} must be less than 10 characters long.")
        .Ensure(() => int.TryParse(value, out result),
                errorMessage: $"{nameof(value)} must be a number.")
        .Map(() => new SomeObject(result));
}

Убедитесь, что здесь есть 2 аргумента. Первый это Func<bool>. Если при вызове Fun c возвращается false, то возвращается ошибочный результат с ошибкой, принимающей значение второго аргумента, errorMessage.

Карта ведет себя так же, как OnSuccess, я думаю, было бы справедливо сказать, что вы можете думать об этом как о короткой руке для OnSuccessThenMapTo. Если оба критерия, указанных в вышеупомянутых 2, гарантируют, что результат будет достигнут, то возвращается результат Ok, и карта заполняет его обновленным объектом SomeObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...