Продолжаю рассматривать данную тему. Она правда крайне интересна в практическом применении.
Слышали рекомендации "ослабляй предусловия и усиливай постусловия"?
1) Предусловия (Preconditions): Будьте либеральны на входе
- Какими должны быть: Максимально слабыми (широкими).
- Пример: Вместо "принимаю только массив строк", скажите "принимаю массив, одиночную строку или даже null".
- Почему это важно: Это делает ваш код удобным. Другим разработчикам (и вам через месяц) не нужно обкладывать вызов вашей функции кучей проверок
if (x !== null && Array.isArray(x)). Вы берете эту рутину на себя, делая систему устойчивой к "грязным" данным.2) Постусловия (Postconditions): Будьте строги на выходе
- Какими должны быть: Максимально сильными (узкими и точными).
- Пример: Вместо "возвращаю объект и null", гарантируйте "возвращаю валидный объект".
- Почему это важно: Это дает уверенность. Вызывающий код точно знает, чего ожидать. Ему не нужно гадать "а что, если вернется undefined?". Это снижает когнитивную нагрузку и количество багов.
Оказывается есть золотое правило:
"Будь строг к тому, что производишь, и либерален к тому, что принимаешь."
(Закон Постела)
Советую почитать об этом законе подробнее.
Этот принцип работает не только в протоколах интернета, но и в архитектуре любой надежной программы.
Но есть один нюанс.
Всегда ли нужно быть "либеральным" и принимать любые данные? Где именно нужно ослаблять предусловия? Неужели во всех функциях проекта?
В следующем посте разберем, где нужно ослаблять предусловия, а где этого делать не следует.