Проти захисних випадків

Захисний випадок (guard case) є популярним патерном у багатьох мовах програмування, як то: Ruby, Golang, Erlang та багато інших. Суть цього патерну полягає у додаванні перевірок безпосередньо перед виконанням основної роботи, аби негайно припинити виконання функції, якщо деякі умови порушені.

Як виглядає захисний випадок:

func div(x, y int) int {
  If y == 0 { return 0 } // guard case or exception
  return x / y
}

Чи доцільно у цьому випадку повертати 0 – це вже інше питання.

За цього підходу ми ускладнюємо реалізацію функції та порушуємо Single Responsibility Principle через неможливість задати у її сигнатурі справжні межі.

Нам необхідно мати не тільки складати типи (створювати sum-типи), а й віднімати. Якщо при складанні типів ми маємо нову множину значень (тип), яка складається із суми множин значень, то різницею типів (множин значень) буде виключення однієї множини значень із іншої. Прикладом більш надійної сигнутури на псевдомові для функціі ділення буде:

int -> int-{0} -> int

Яка означає, що функція приймає два аргументи, один типу int, а другий – int-{0} та повертає результат типу int. Тип int-{0} означає, що віднімаємо від множини значень типу int множину {0}, тобто 0 і в результаті маємо тип, який означає будь який int, окрім 0.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *