Size: a a a

2020 April 13

МП

Мимо Проходящий... in Go-go!
x-foby
В реальности же сами по себе глобальные переменные не являются злом, и все это прекрасно понимают.
Мы, скажем вынуждены использовать все вот эти var ErrSome = errors.New(...).
Было бы лучше без них (но не потому что это глобальные переменные), но, тем не менее, все мы (ну или большинство) это используем.

Есть глобальные переменные для конфигов.
Не все их используют, есть способы более удобные, но те, кто используют тот же go-swagger, знают, что конфиги (опции запуска) там задаются через глобальную переменную.

Всё это есть.
Никто не пытался сказать, что глобальные переменные — суть зло.

Но когда мы говорим о каких-то зависимостях, когда мы говорим о тестировании, о стабильности разработки и поддержки в хоть сколько-нибудь архитектурно серьёзных продуктах, мы сталкиваемся с тем, что объявленные глобальными переменными зависимости типа коннекта к БД могут создать неудобства.
Могут и не создать. А может для кого-то невозможность замокать тестируемый объект и не является неудобством.

Каждый имеет право на своё независимое мнение. И вы тоже. Странно только, что вы так любите спорить с теми, кто так же как и вы имеет право на мнение, при этом требуя каких-то доказательств и не предоставляя их со своей стороны.

Ваше "за всё время не было проблем" — это же не доказательство. Какое время?
Что за проекты?

Вот мой пример раскритиковали, предложив использовать интерфейс и вообще вынести всё это дело в контроллер. И правильно раскритиковали, потому что в большинстве случаев так действительно будет проще в дальнейшем. Я правда этот пример приводил не как пример окончательного решения, а как пример того, как можно без глобальной переменной. Но это уже моя проблема — нужно было сразу уточнять этот момент.

Видите, всегда можно разговаривать конструктивно, а не гадить на стол в ресторане, выкрикивая "я прав, докажите обратное".
Мимо
Мой аргумент был в самом начале - меньше кода. Точка. "зависимости типа коннекта к БД могут создать неудобства." - это извините не аргумент. Всё что угодно может создавать неудобство. Что неудобно для вас, то вполне норм для других. А меньше букв - это как бы объективная реальность данная нам в ощущениях.

"за всё время не было проблем" - это как раз таки мнение, а не аргумент. У меня много проектов, и все они они имеют для меня и не только для меня кардинальное значение, и финансовое в том числе. Как и у всех. Мы тут делимся оптом в чате, а не обсуждаем у кого проекты показательны, у кого нет. Я же не требую от вас доказать полезность и ценность ваших проетов даже если с чем то у вас не согласен. С чего бы мне вам доказывать ценность и полезность своих?
источник

а

а кто это in Go-go!
Soul
есть даже серверы)
ну так telnet это просто текст передаваемый через TCP(на самом деле не только)
источник

x

x-foby in Go-go!
santiago s
а почему в го нельзя ошибку задать константой?
Константы вычисляются на этапе компиляции
источник

ss

santiago s in Go-go!
x-foby
Константы вычисляются на этапе компиляции
все равно пока не понимаю

у нас есть либо переменные-псевдо-константы ошибки, либо свои типы ошибок
так вот почему бы вместо переменных псевдо-констант не использовать реальные константы?
источник

x

x-foby in Go-go!
Daniel Podolsky
все-таки, это не проблема глобальных переменных. квазиконстанты не содержат стейта, соответственно, о них можно не беспокоиться
Всё так, я же как раз об этом и написал:
> Было бы лучше без них (но не потому что это глобальные переменные)
источник

ГП

Георгий Папаскири... in Go-go!
это я видел, а как туда передать команду? получить результат?
источник

DP

Daniel Podolsky in Go-go!
santiago s
все равно пока не понимаю

у нас есть либо переменные-псевдо-константы ошибки, либо свои типы ошибок
так вот почему бы вместо переменных псевдо-констант не использовать реальные константы?
Хороший тон - делать ошибки с помощью errors.New()
источник

ss

santiago s in Go-go!
Daniel Podolsky
Хороший тон - делать ошибки с помощью errors.New()
ну то есть причина только в "хороший тон"?
источник

S

Soul in Go-go!
Георгий Папаскири
это я видел, а как туда передать команду? получить результат?
источник

ss

santiago s in Go-go!
и хороший тон выработали до появления errors.Is errors.As
источник

S

Soul in Go-go!
тот, который ты передаешь в DialToAndCall
источник

S

Soul in Go-go!
То есть тебе надо создать свою структуру с интерфейсом от Caller, там всего одну функцию реализовать
источник

DP

Daniel Podolsky in Go-go!
santiago s
и хороший тон выработали до появления errors.Is errors.As
все так
источник

ss

santiago s in Go-go!
Daniel Podolsky
все так
ну так это устаревший хороший тон
источник

S

Soul in Go-go!
Обновления этикета это что-то новое)
источник

ss

santiago s in Go-go!
времена меняются, язык развивается, и хороший тон нужно под это адамтировать

и я вот пока не понимаю почему константы это плохо
источник

x

x-foby in Go-go!
santiago s
все равно пока не понимаю

у нас есть либо переменные-псевдо-константы ошибки, либо свои типы ошибок
так вот почему бы вместо переменных псевдо-констант не использовать реальные константы?
Когда вы заводите константу, например числовую (или любую другую примитивную), то компилятор в процессе компиляции просто подставляет в те места, где вы константу использовали, её примитивное значение. То есть в рантайме константы как таковой не существует. В этом и особенность констант (не только в Go).
А если вы хотите использовать ошибку, то вы должны определить тип, реализовать у него метод Error() string, чтоб он удовлетворял интерфейсу error, и потом создать что-то этого типа. И вот это что-то нельзя вычислить на этапе компиляции. Реальное вычисление значений возможно только в рантайме, а значит это уже по определению переменная.

Возможно, не совсем понятно объяснил, конечно, но в общих чертах как-то так.
источник

DP

Daniel Podolsky in Go-go!
Soul
Обновления этикета это что-то новое)
происходят постоянно
источник

DP

Daniel Podolsky in Go-go!
santiago s
времена меняются, язык развивается, и хороший тон нужно под это адамтировать

и я вот пока не понимаю почему константы это плохо
ну я тоже так думаю :)
источник

ss

santiago s in Go-go!
x-foby
Когда вы заводите константу, например числовую (или любую другую примитивную), то компилятор в процессе компиляции просто подставляет в те места, где вы константу использовали, её примитивное значение. То есть в рантайме константы как таковой не существует. В этом и особенность констант (не только в Go).
А если вы хотите использовать ошибку, то вы должны определить тип, реализовать у него метод Error() string, чтоб он удовлетворял интерфейсу error, и потом создать что-то этого типа. И вот это что-то нельзя вычислить на этапе компиляции. Реальное вычисление значений возможно только в рантайме, а значит это уже по определению переменная.

Возможно, не совсем понятно объяснил, конечно, но в общих чертах как-то так.
источник