применяю такой подход с множественные return после того, как где-то увидел пример "линеаризации кода" (кажется на хабре) . суть сводится к уменьшению вложенности кода за счёт выхода из метода после проверки условия, которое запрещает дальнейшее выполнение основной ветки алгоритма метода.
19:07 Этим занимается формальная верификация. Интересовался этим очень-очень поверхностно, но на сколько понимаю, она сейчас постепенно развивается и уже используется для доказания корректности небольших, но популярных алгоритмов/программ. Например уже доказали корректность криптографических алгоритмов в основе протокола TLS.
В том же Rust, например, используют Chalk как верификатор лайфтаймов и звучимости системы типов. Из популярных примеров теорем-пруверов есть ATS. Существуют также языки программирования, архитектура которых построена вокруг зависимых типов, что позволяет обуславливать императивный и декларативный код: например, Idris или Agda.
Видео суперактуально, недавно как раз на работе спорил с коллегами о том, что преждевременный return в начале функции - это не плохо, а наоборот помогает избежать вложенности и делает код последовательным что-ли, более плоским, оттого и более читабельным. А это, оказывается, даже термин имеет - guard expression. Основной аргумент против них был - наличие большого количества точек выхода. Не знаю, как это мешает, если функция или метод все равно возвращают или ошибку, или результат.
Да и если за всеми точками выхода сложно уследить, то проблема не в guard expression, а в большой функции. А вообще, современные IDE показывают точки выхода из функции (даже neovim), если навести на одну из них.
В целом об этом не надо спорить, всё зависит о размера функции. Если большая, то множественные ретерн зло. Хотя опять же, если в команде принято писать guard expression, то можно, в общем во всём ваден здравый смысл, а не карго культ.
не знаю насчёт фортрана, но несколько return в той же java могут стать проблемой если функция на три километра с if..else тройной вложенности, из которых можно неожиданно и непрозрачно выйти. Другой вопрос что множественные return в такой функции скорее всего не самая главная проблема))
Противникам множества точек возврата, если в их языке есть stack unwinding, можно напомнить, что они в любом случае должны при чтении кода мысленно раздваивать поток исполнения каждый раз, когда видят вызов функции (повезло еще, если нет перегрузки операторов). Если они этот факт игнорируют (даже легитимно, если, например, речь идет о каком-то обычном сервере, где, грубо говоря, все состояние лежит в базе данных), то им не составит труда игнорировать и сторожевые if'ы.
"предусловия, постусловия и инварианты" , чe ?? чем раньше перейдете на родной язык програмированния (английский) тем лучше , не надо будет потом кучу терминов переучивать
ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0) Инвариант - это математическое обозначение: из какого языка пришло, так и будет называться и писаться. Это не случай англицизмов - не надо гадости писать не по наитию.
применяю такой подход с множественные return после того, как где-то увидел пример "линеаризации кода" (кажется на хабре) . суть сводится к уменьшению вложенности кода за счёт выхода из метода после проверки условия, которое запрещает дальнейшее выполнение основной ветки алгоритма метода.
Точно! Забыл совсем про этот термин, он хорошо отражает суть
19:07 Этим занимается формальная верификация. Интересовался этим очень-очень поверхностно, но на сколько понимаю, она сейчас постепенно развивается и уже используется для доказания корректности небольших, но популярных алгоритмов/программ. Например уже доказали корректность криптографических алгоритмов в основе протокола TLS.
В том же Rust, например, используют Chalk как верификатор лайфтаймов и звучимости системы типов. Из популярных примеров теорем-пруверов есть ATS. Существуют также языки программирования, архитектура которых построена вокруг зависимых типов, что позволяет обуславливать императивный и декларативный код: например, Idris или Agda.
Видео суперактуально, недавно как раз на работе спорил с коллегами о том, что преждевременный return в начале функции - это не плохо, а наоборот помогает избежать вложенности и делает код последовательным что-ли, более плоским, оттого и более читабельным. А это, оказывается, даже термин имеет - guard expression. Основной аргумент против них был - наличие большого количества точек выхода. Не знаю, как это мешает, если функция или метод все равно возвращают или ошибку, или результат.
Да и если за всеми точками выхода сложно уследить, то проблема не в guard expression, а в большой функции.
А вообще, современные IDE показывают точки выхода из функции (даже neovim), если навести на одну из них.
В целом об этом не надо спорить, всё зависит о размера функции. Если большая, то множественные ретерн зло. Хотя опять же, если в команде принято писать guard expression, то можно, в общем во всём ваден здравый смысл, а не карго культ.
не знаю насчёт фортрана, но несколько return в той же java могут стать проблемой если функция на три километра с if..else тройной вложенности, из которых можно неожиданно и непрозрачно выйти.
Другой вопрос что множественные return в такой функции скорее всего не самая главная проблема))
Мне норм. Особенно зашла аналогия про выстрел в ногу с фейерверка
Познавательно! Лайк в поддержку!
Противникам множества точек возврата, если в их языке есть stack unwinding, можно напомнить, что они в любом случае должны при чтении кода мысленно раздваивать поток исполнения каждый раз, когда видят вызов функции (повезло еще, если нет перегрузки операторов). Если они этот факт игнорируют (даже легитимно, если, например, речь идет о каком-то обычном сервере, где, грубо говоря, все состояние лежит в базе данных), то им не составит труда игнорировать и сторожевые if'ы.
Пасиба за контент!
Как не делать багов? Не писать код)
Это слишком правда
"предусловия, постусловия и инварианты" , чe ?? чем раньше перейдете на родной язык програмированния (английский) тем лучше , не надо будет потом кучу терминов переучивать
ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)
Инвариант - это математическое обозначение: из какого языка пришло, так и будет называться и писаться. Это не случай англицизмов - не надо гадости писать не по наитию.