Могут ли типы заменить валидацию?

Могут ли типы заменить валидацию?

Ахметзянов Динар
Перевод статьи Марка Симана.
Ссылка на оригинал: https://blog.ploeh.dk/2022/08/22/can-types-replace-validation/

С некоторыми примерами на C#

В комментариях к моей статье Маруси Джонсон спросил:

Мне стало интересно, а можно ли использовать систему типов вместо валидации?
Что я под этим подразумеваю. Например, сделать все поля ReservationDto типами с валидацией в конструкторе (к примеру, отдельный класс для электронный почты, наименования и т.д.). Обычно, когда фреймворк создает ReservationDto, он пытается создать создать поля, используя конструктор типов. И если в процессе инициализации возникнет какое-либо исключение, фреймворк предоставит нам ошибку с сообщением об этом.
Вдобавок, я считаю, что подобные типы были бы переиспользуемыми. И я чувствую, что таким способом у нас будет куда больше возможностей в валидации, нежели при использовании валидации при помощи атрибутов.

Я начал писать ответ под вопросом, но ответ становился таким большим, что я решил превратить его в отдельную статью. Думаю, что данный вопрос представляет общий интерес.

Проблема остановки

Я всецело выступаю за то, чтобы использовать систему типов для инкапсуляции, но у этого инструмента имеются ограничения. Ограничения эти связаны с проблемой остановки.

Мое понимание проблемы остановки основывается на книге "Читаем Тьюринга" Чарльза Петцольда. Вкратце, если имеется компьютерная программа, написанная на Тьюринг полном языке программирования, то не существует общего алгоритма, который бы определял, завершит ли программа выполнение или нет.

Компилятор, производящий проверку типов - это программа. Но системы типов, как правило, не являются Тьюринг полными.

Report Page