Result — шаблон проєктування функційного програмування.

Властивості

Функція є чистою так, як прототип описує усю поведінку. Дозволяє реалізувати спільний варіант обробки помилок.

Приклад

Нехай, необхідно реалізувати функціонал зняття готівки із рахунку. Наївна реалізація може мати такий вигляд:

public class BankAccount { public decimal Balance { get; private set; }

public bool Withdraw(decimal amount)

if (amount < 0)

throw new ArgumentOutOfRangeException(nameof(amount));

if (IsAccountFrozen())

return false;

if (Balance - amount >= 0)

Balance -= amount; return true;

return false;

Така реалізація погана із декількох причин: прототип методу приховує побічні ефекти (такі як винятки) тип повернення (false) не повідомляє про причину помилки

Введемо додатковий тип, який буде виражати результат операції public class Result { public bool IsSuccessful { get; private set; } public string Error { get; private set; }

public static Result Success()

return new Result

IsSuccessful = true, Error = "",

public static Result Failure(string error)

return new Result

IsSuccessful = false, Error = error,

Та змінимо реалізацію методу використовуючи новий тип:

public class BankAccount { public decimal Balance { get; private set; }

public Result Withdraw(decimal amount)

if (amount < 0)

return Result.Failure("Amount can not be less than zeno");

if (IsAccountFrozen())

return Result.Failure("Account is frozen");

if (Balance - amount >= 0)

Balance -= amount; return Result.Success();

return Result.Failure("Account has insufficient funds");

Див. також Функційне програмування Чисті функції Шаблони проєктування програмного забезпечення

Джерела The Operation Result Pattern Exceptions vs Result object