LINUX.ORG.RU

История изменений

Исправление wandrien, (текущая версия) :

Тип должен быть контрактом, тип должен быть гарантией от использование неправильных значений. А по факту проверяется не то, что нужно пользователю, а то, что проще проверить. Нужно: «номер порта из правильного диапазона» или «корректный адрес», а проверяют «число» или «строка».

Какому еще «пользователю»? Тип проверят то, что описал в нём программист. Это инструмент для разработчика, чтобы структурировать кисель в чёткую архитектуру.

Покажете как? На случай если беседа примет оборот «а вот мы сделаем класс и в конструкторе всё проверим», сразу контртезис: а) это проверяется на этапе работы, т.е. в динамике; б) в случае позднего связывания мы узнаём какой метод вызываем только в процессе работы, снова динамика; в) а вот, что мы гарантированно не забудем сделать проверку, признаю, полезное свойство.

Смысл типа ровно в том, что после того как граница типа пройдена, дальнейшее гарантируется компилятором.

В условном «питоне» (или php, ruby, не важно) у тебя в любом месте, где написано def foo(ip_port), дальше придётся ставить assert, который проверяет что: 1) ip_port вообще число; 2) ip_port число в корректном диапазоне. И это всё равно никак не спасёт от того, что foo() вместо номера порта в рандомный момент времени получит сводку с прогнозом погоды под Хабаровском.

Аналогично и для случая ip_port = bar().

Если же у нас есть foo(ip_port: IpPort), то вызывающая сторона заведомо передаёт число в нужном диапазоне.

Точки, где IpPort создаётся и проверяется, чётко локализованы и могут быть малой кровью исследованы. Все места, где «случайное число из входных данных» трансформируется в однозначный IpPort могут быть изучены на предмет того, что программа корректно обрабатывает ошибку и возвращает информацию о ней пользователю.

Исправление wandrien, :

Тип должен быть контрактом, тип должен быть гарантией от использование неправильных значений. А по факту проверяется не то, что нужно пользователю, а то, что проще проверить. Нужно: «номер порта из правильного диапазона» или «корректный адрес», а проверяют «число» или «строка».

Какому еще «пользователю»? Тип проверят то, что описал в нём программист. Это инструмент для разработчика, чтобы структурировать кисель в чёткую архитектуру.

Покажете как? На случай если беседа примет оборот «а вот мы сделаем класс и в конструкторе всё проверим», сразу контртезис: а) это проверяется на этапе работы, т.е. в динамике; б) в случае позднего связывания мы узнаём какой метод вызываем только в процессе работы, снова динамика; в) а вот, что мы гарантированно не забудем сделать проверку, признаю, полезное свойство.

Смысл типа ровно в том, что после того как граница типа пройдена, дальнейшее гарантируется компилятором.

В условном «питоне» (или php, ruby, не важно) у тебя в любом месте, где написано def foo(ip_port), дальше придётся ставить assert, который проверяет что: 1) ip_port вообще число; 2) ip_port число в корректном диапазоне. И это всё равно никак не спасёт от того, что foo() вместо номера порта в рандомный момент времени получит сводку с прогнозом погоды под Хабаровском.

Если же у нас есть foo(ip_port: IpPort), то вызывающая сторона заведомо передаёт число в нужном диапазоне.

Точки, где IpPort создаётся и проверяется, чётко локализованы и могут быть малой кровью исследованы. Все места, где «случайное число из входных данных» трансформируется в однозначный IpPort могут быть изучены на предмет того, что программа корректно обрабатывает ошибку и возвращает информацию о ней пользователю.

Исходная версия wandrien, :

Тип должен быть контрактом, тип должен быть гарантией от использование неправильных значений. А по факту проверяется не то, что нужно пользователю, а то, что проще проверить. Нужно: «номер порта из правильного диапазона» или «корректный адрес», а проверяют «число» или «строка».

Какому еще «пользователю»? Тип проверят то, что описал в нём программист. Это инструмент для разработчика, чтобы структурировать кисель в чёткую архитектуру.

Покажете как? На случай если беседа примет оборот «а вот мы сделаем класс и в конструкторе всё проверим», сразу контртезис: а) это проверяется на этапе работы, т.е. в динамике; б) в случае позднего связывания мы узнаём какой метод вызываем только в процессе работы, снова динамика; в) а вот, что мы гарантированно не забудем сделать проверку, признаю, полезное свойство.

Смысл типа ровно в том, что после того как граница типа пройдена, дальнейшее гарантируется компилятором.

В условном «питоне» (или php, ruby, не важно) у тебя в любом месте, где написано def foo(ip_port), дальше придётся ставить идти assert, который проверяет что: 1) ip_port вообще число; 2) ip_port число в корректном диапазоне. И это всё равно никак не спасёт от того, что foo() вместо номера порта в рандомный момент времени получит сводку с прогнозом погоды под Хабаровском.

Если же у нас есть foo(ip_port: IpPort), то вызывающая сторона заведомо передаёт число в нужном диапазоне.

Точки, где IpPort создаётся и проверяется, чётко локализованы и могут быть малой кровью исследованы. Все места, где «случайное число из входных данных» трансформируется в однозначный IpPort могут быть изучены на предмет того, что программа корректно обрабатывает ошибку и возвращает информацию о ней пользователю.