История изменений
Исправление 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 могут быть изучены на предмет того, что программа корректно обрабатывает ошибку и возвращает информацию о ней пользователю.