Про деструктуризацию пропсов
Давно заметил, что она стала де-факто стандартом в React-разработке: так учат на курсах, так показывают в видосах, даже линтеры часто на это настраивают. Мне это не нравится, и я попытался понять, почему так. Начнем с минусов.
Конфликты имен и затенение переменных Получил в пропсы name. Деструктурировал. Отфильтровал список имен — в .filter() еще одна локальная переменная name. Сделал запрос, деструктурировал ответ, получил еще одну локальную переменную name. Отфильтровал массив пользователей, в сложном фильтре деструктурировал пользователя — еще одна локальная переменная name. Продолжать можно долго, смысл понятен. Как предлагают решить эту проблему? В итераторах использовать однобуквенные имена, а если есть одноименный стейт или локальная переменная на уровне компонента — переименовывать пропсу: const { name: propName } = props;. Но так мы нарушаем консистентность имен либо вынуждены переименовывать все ключи в таком стиле и теряем всю экономию. Получается хуже чем с props. Однобуквенные переменные в простых итераторах — ок, но не все итераторы простые, решение не универсально.
Читаемость кода Есть мнение что повторение props. ухудшает читаемость, я думаю, что улучшает. Потому что так мы держим данные в своих пространствах имен и всегда сразу видим, откуда они читаются. Популярны примеры с длинными однострочными компонентами, которые сильно растягиваются с props., но так в реальности никто не пишет, пропсы всегда по строкам разбиты, автоформатирование вообще все упрощает.
А вот такие я нашел плюсы деструктуризации
Сокращение кода Один раз распечатали и больше не нужно писать props.. Не могу поверить, что это для кого-то является проблемой, но постараюсь без субъективности. Даже если принять этот аргумент, улучшение читаемости кода важнее, потому что когда мы пишем — мы в контексте, нам и так все понятно. А когда читаем чужой код — нужно разбираться какие данные откуда пришли. Если пропсы передаются в виде name={props.name}, мы сразу понимаем, что здесь prop drilling и name передается неизменным с верхнего уровня. Короче, структурирование данных важнее экономии на спичках.
Линтинг неиспользуемых пропсов Линтер плохо справляется с поиском неиспользуемых пропсов, если обращаться к ним через props.. На самом деле проблема только в динамическом чтении пропса вида props[propKey]. Если тем же линтером запретить такой код, то валидировать пропсы по их типу не представляет сложности.
Был еще странный аргумент, якобы мы все деструктурируем: ответы бэкенда, возвращаемые значения хуков и прочее. И нужно сохранять единый подход. Но хуки отдают объекты с ключами в своем пространстве имен. Та же data — очень популярное поле. Библиотечным хукам вообще плевать, что вы в своем проекте еще используете. Поэтому тема на самом деле шире и касается деструктуризации в целом, а не только пропсов.
Почему тогда это стало стандартом?
Так начали делать разработчики библиотек и всяких UI Kit. В их случае подход зачастую оправдан, потому что они редко активно оперируют данными и для них плюсы деструктуризации перевешивают. В продуктовом коде данных больше, и изменяется он чаще. Поэтому лучше предпочесть единый подход, который точно не вызовет проблем в будущем. Следом подтянулись авторы курсов, и в индустрию пришло много людей с уже сложившейся привычкой. Популярность подхода сделала популярным и соответствующее правило линтера, окончательно закрепив стандарт.
Какая мораль? Да никакой, пишите как хотите, мне похуй.
· 19.07
По поводу комфливтов имен и затенению: ты сам описал обычную цепочку, где помимо пропсов name может встретиться в коде 10 раз. Убрав деструктурицацию - 9 раз. И тут проблема явно не в пропсах - она более общая и на мой взляд давно решенная.
С читаемостью тоже спорный момент: это опять же культура нейминга: легко можно придумать коде-стайл, нивелирующий проблему, например: простые лаконичные имена - это пропсы, стейты должны содержать в себе слово state, временные переменные всегда именовать комбинацией из двух слов в камелкейсе. И все, тогда даже по названию переменной можно судить про ее назначение.
Я даже не буду углубляться в идею, что компоненты должны быть короткими и понятными и что вслучае сложных совсем не лишнее прочитать сигнатуру потратить 30 сек и запомнить входящие пропсы. Это вроде как база.
Но в целом мне тоже похуй, тут я абсолютно солидарен ))
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 19.07
Возможно, плохо передал свою мысль: я за отказ от деструктуризации в большинстве кейсов. А всякие итераторы как правило находятся внутри функций и друг с другом не конфликтуют, только с родительским скоупом. Поэтому чем выше уровень тем больше вреда от деструктуризации.
Конечно можно придумать систему нейминга, но разве это лучше, чем читать данные из соответствующих объектов? Выходит, что и короче не сделали и структуру данных испортили, сложив все в один неймспейс.
Даже если ты запомнишь все пропсы — нет гарантии, что name, который ты встретишь ниже — это name из пропсов, а не локальная переменная. Предвижу встречный аргумент, что это не сложно заметить, если клювом не щелкать — все так. Но это хоть и минимальные, а все таки накладные расходы в противовес их отсутствию.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён
· 19.07
Я на самом деле во всем с тобой полностью согласен. Но ты попросил срача и я попытался придумать контраргументы. Все что придумалось - написал )
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён