https://dburov.com/ru/research/go-ternary
Дмитрий Буров провёл большое исследование на эту старую добрую тему и попросил меня поделиться ей, чтобы собрать мнение сообщества — внизу статьи есть короткий опрос из 4 вопросов.
Вкратце, о чём материал:
- Позиция core-команды Go не менялась с 2009 года:
?: порождает непроницаемо сложные выражения, if-else «бесспорно яснее», языку нужна только одна конструкция управления потоком- Проблема в том, что эта позиция никогда не подкреплялась реальными данными — только мнением авторов языка. Каждый новый proposal с 2019 года закрывается ссылкой на FAQ без содержательного разбора
- Дмитрий написал статический анализатор и прогнал 4 крупных репозитория:
golang/go, kubernetes, terraform, traefik- Нашёл 22 000+ паттернов, которые однозначно заменяются плоским тернарником (условный return, условное присваивание, раздутый конструктор, inline-выражение)
- От 10% до 16% функций содержат хотя бы один такой паттерн. То есть каждая 6-9 функция
И главный аргумент автора: команда Go запрещает оператор целиком из-за того, что его можно использовать во вложенном виде и получить нечитаемую кашу. Но другие языки давно решили эту проблему иначе — оставили сам оператор, а запретили именно вложенность: в JS через ESLint-правило
no-nested-ternary, в C++ через clang-tidy, в PHP 8 вложенный ?: без скобок стал ошибкой компиляции. Go мог бы сделать то же самое через go vet, не лишая разработчиков плоских однострочников.————
Тема холиварная, поэтому Дмитрию особенно важно собрать мнения — как тех, кто «за», так и тех, кто «против».
Выборка заведомо смещена (сюда придут неравнодушные), но цель не в репрезентативности, а в том, чтобы проверить: совпадают ли представления команды Go о восприятии этих паттернов с тем, что говорят сами разработчики.
В общем, предлагаю ознакомиться и выразить своё мнение.
#article #research