Длинные селекторы в Go
Нередко встречаю такой паттерн:
Функционально всё корректно, но цепочка
Я предпочитаю предварительно закэшировать конечный объект, создав локальный псевдоним (alias binding):
Почему это выглядит чище:
* Уменьшение числа селекторов (Number of Selectors, NOC): глубина доступа падает с 3 до 1, чтение ускоряется линейно
* Семантическая прозрачность (semantic transparency): конечный объект (
* Нулевая стоимость абстракции (zero-cost abstraction): компилятор Go инлайнит псевдоним, нет лишних аллокаций и нагрузки на GC
* Снижение синтаксического шума (syntactic noise), анализаторы IDE реже ошибаются (поверил гуглу — сам не встречал)
P.S. ChatGPT конечно неплохо поработал с моим сумбурным текстом, добавил терминов, которые я и не слышал даже. Выглядит интересно
А вы боретесь с длинными селекторами (selector hell)?
Нередко встречаю такой паттерн:
x := k.c.y.SetX()
// ...
if k.c.y.Exists() {
// ...
Функционально всё корректно, но цепочка
k.c.y
дважды нагружает зрение и увеличивает когнитивную нагрузку (cognitive load) — мозг вынужден каждый раз «проходить» всю селекторную цепочку (dot/point-chasing).Я предпочитаю предварительно закэшировать конечный объект, создав локальный псевдоним (alias binding):
y := k.c.y
x := y.SetX()
// ...
if y.Exists() {
// ...
Почему это выглядит чище:
* Уменьшение числа селекторов (Number of Selectors, NOC): глубина доступа падает с 3 до 1, чтение ускоряется линейно
* Семантическая прозрачность (semantic transparency): конечный объект (
y
) получает собственный идентификатор, сразу видно его роль* Нулевая стоимость абстракции (zero-cost abstraction): компилятор Go инлайнит псевдоним, нет лишних аллокаций и нагрузки на GC
* Снижение синтаксического шума (syntactic noise), анализаторы IDE реже ошибаются (поверил гуглу — сам не встречал)
P.S. ChatGPT конечно неплохо поработал с моим сумбурным текстом, добавил терминов, которые я и не слышал даже. Выглядит интересно
А вы боретесь с длинными селекторами (selector hell)?
👍6
Путь Golang
Длинные селекторы в Go Нередко встречаю такой паттерн: x := k.c.y.SetX() // ... if k.c.y.Exists() { // ... Функционально всё корректно, но цепочка k.c.y дважды нагружает зрение и увеличивает когнитивную нагрузку (cognitive load) — мозг вынужден каждый…
И я тут же словил это в своём собственном VPN-боте. Ай я молодец
😁1
🔥🔥🔥 У меня пригорает от jira. Это уже 6-ой круг объяснения, что не так
А НАТЫКАЙТЕ МНЕ ТАМ СПРАВА ВВЕРХУ ГОЛОСОВ ЗА ТИКЕТ!!!!!! ПОЖАЛУЙСТА
https://jira.atlassian.com/browse/JSDCLOUD-16830
А НАТЫКАЙТЕ МНЕ ТАМ СПРАВА ВВЕРХУ ГОЛОСОВ ЗА ТИКЕТ!!!!!! ПОЖАЛУЙСТА
https://jira.atlassian.com/browse/JSDCLOUD-16830
👻 На собеседованиях мешается «много языков». Только что «облажался», зависнув на условном
m["key1"]++
. Потому что оно в разных языках по-разному и я забыл в каком что😁3🤯2
😮 Ой. А вы знали о такой ссылке?
https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/modernize
☝️ Вкратце — это тулза (и описание) для замены устаревших конструкций более модными. Из этой новости я узнал про
https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/modernize
☝️ Вкратце — это тулза (и описание) для замены устаревших конструкций более модными. Из этой новости я узнал про
min()
/ max()
pkg.go.dev
modernize package - golang.org/x/tools/gopls/internal/analysis/modernize - Go Packages
Package modernize providers the modernizer analyzer.
👍7
👻 Ухожу в монастырь. Пропустил
👍 Кстати, очень хороший пример уместности дженериков
slices.Contains()
. Я не просто так пишу сюда, если что. Может не один я такой не слежу👍 Кстати, очень хороший пример уместности дженериков
👍5👏2
For the foreseeable future, the Go team will stop pursuing syntactic language changes for error handling. We will also close all open and incoming proposals that concern themselves primarily with the syntax of error handling, without further investigation
https://go.dev/blog/error-syntax
😅 Уф, пронесло
P.S. Взял отсюда: https://t.iss.one/HowToGoWrong/233
go.dev
[ On | No ] syntactic support for error handling - The Go Programming Language
Go team plans around error handling support
🥰3👍2👎1🤔1
Forwarded from 🏳️Filipp Kulin
Я помню как-то решил в 2014 году таки ознакомиться с Ansible. Ну такое открываю, пытаюсь через шелл с судо ад хок сделать и сосу тунца.
Мучаюсь дня два. Лезу в код.
1. Паттерн "отлова" приглашения ввести пароль сделан только на linux. Делаю багрепорт с предложением поправить
Мучаюсь ещё два дня. Лезу в код.
2. Вызывается
Делаю багрепорт с предложением поправить.
Запускаю две каманды ад хок и радостно забываю про такой способ навсегда, перейдя на ключи
Мучаюсь дня два. Лезу в код.
1. Паттерн "отлова" приглашения ввести пароль сделан только на linux. Делаю багрепорт с предложением поправить
Мучаюсь ещё два дня. Лезу в код.
2. Вызывается
sh
с гнушной либой разбора параметров и неверный параметр -c
, если другие либы. Во freebsd не работает. Делаю багрепорт с предложением поправить.
Запускаю две каманды ад хок и радостно забываю про такой способ навсегда, перейдя на ключи
В jira есть два формата именования кастомных полей (или даже три). И есть язык JQL для поиска. Так вот для разных операторов условий нужно применять свой формат имени поля ("=" и "IS EMPTY" работают каждый только со своим форматом). А для установки значения поля - тоже только один из них. И главное — не перепутать
🔥1