Anonymous
Глобальные обычно всякие константы
Dmitry
Константы не изменяемы. Речь о переменных, которые могут быть изменены
Евгений
название статьи - GlobalVariablesAreBad
Мерль
Что-то мне подсказывает, что это не для Go.
Это для любого языка. Это вообще не относится к языку
Anonymous
Типа вы хотите сказать, что http.DefaultClient - это неправильно?
Anonymous
Это ж, как я понимаю, глобальная переменная
Dmitry
Если её не мутируют то не могу сказать что наличие такой переменной это не правильно. Но в этом случае это уже не совсем переменная... я бы сказал что это идентификатор
Dmitry
Вобщем, коротко говоря - наличие глобальных переменных, которые могут меняться из разных частей программы - зло. Я полагаю что это и было изначальным поинтом этого разговора
Michael
readonly спасёт мир
Dmitry
ФП спасёт мир)))
Anatoly
fix: (ФП (спасет (мир)))
Zhenja
а подключение к базе, логгеры, конфиг? Передавать в функции параметром? Или в каждой функции поднимать свое?
Anonymous
readonly спасёт мир
Пишем проги на одних константах 😳
Michael
хм... я про шарповый ридонли
Michael
readonly инициализируется в init, а далее ведёт себя как константа
Anonymous
а подключение к базе, логгеры, конфиг? Передавать в функции параметром? Или в каждой функции поднимать свое?
Как я понял, под "глобальные переменные" коллеги предполагают просты типы (int, string и т.п.).
Zhenja
а, тогда статью надо переименовать в SimpleTypeGlobalVariablesAreBad
Michael
fix(Variables(Are(Bad)))
Anonymous
fix(Variables(Are(Bad)))
fix(Variables(Are(Bad(Only(Braces(Rock))))))
Dmitry
а подключение к базе, логгеры, конфиг? Передавать в функции параметром? Или в каждой функции поднимать свое?
Я передаю аргументом к функции, конструирующей нужный объект. И логгеры и коннекты к базе, даже конфигурацию
Anatoly
fix(Variables(Are(Bad(Only(Braces(Rock))))))
https://www.cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html
Anonymous
https://www.cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html
Соре, меня просто json покусал, там чёртовы braces ((
Dmitry
а если логгер нужен вообще везде?
Значит передам его в каждое место где он нужен, явно
Axm
во все функции проекта?
Igor
В других языках это решается через IoC контейнер
Igor
в Go сколько не гуглил, адекватного контейнера не нашёл
Dmitry
во все функции проекта?
Во все конструкторы. Я отношусь к логгеру как к данным
Dmitry
Вопрос по math/rand Как сделать, что бы он генерировал случайные числа? package main import ( "fmt" "math/rand" ) func main() { fmt.Println(rand.Intn(100)) } всегда выводит число 81...
Dmitry
точнее, при каждом запуске программы, одно и тоже число
bunin
https://golang.org/pkg/math/rand/#Rand.Seed
Aleksandr
точнее, при каждом запуске программы, одно и тоже число
да, оно генерится в момент компиляции. используйте сид - ссылка выше
Dmitry
ага, спасибо
Mike
Пишем проги на одних константах 😳
добро пожаловать в мир эрланга/кложура/лиспа/хаскеля/...?
Michael
просто immutable ?
Slava
ридонли и неизменяемые переменные действительно важны/удобны
Slava
надеюсь го в эту сторону придёт так или иначе
Евгений
> неизменяемые переменные константы?
Vladislav
На самом деле непонятно, что мешает просто не менять.
Vladislav
> неизменяемые переменные константы?
Константы формируются на этапе компиляции. Переменные в рантайме при инициализации.
Евгений
Пишите везде := и присваивайте по одной - компилятор сам начнет ругаться, что вы ее пытаетесь переопределить —- тут должен идти тролль-фейс ))
Slava
На самом деле непонятно, что мешает просто не менять.
То же, что мешает людям писать код без багов
Vladislav
То же, что мешает людям писать код без багов
Ну смотри. Не знаю как у всех, но на моем опыте баги возникают в основном из-за невнимательности или просчете в логике. Просчет иммутабельность не убирает. Невнимательно изменить переменную. Тут 2 варианта. 1: хотел изменить не ту переменную. Тут спасают грамотные названия этих самый переменных. Не должен был вообще ничего менять. Тут да. Но таких багов лично я давно не допускал.
Dmitry
Ну смотри. Не знаю как у всех, но на моем опыте баги возникают в основном из-за невнимательности или просчете в логике. Просчет иммутабельность не убирает. Невнимательно изменить переменную. Тут 2 варианта. 1: хотел изменить не ту переменную. Тут спасают грамотные названия этих самый переменных. Не должен был вообще ничего менять. Тут да. Но таких багов лично я давно не допускал.
Есть разные люди. Некоторые скажут "мне надо таск закрыть, хер с ним, вставлю костыль вот тут", через пару лет от таких умников проект идёт на выброс. И тут можно сколько угодно обкладывать кодовую базу различными процессами, но правда одна - компилятор не должен позволять делать то, что явно является не правильным
Mike
Ну смотри. Не знаю как у всех, но на моем опыте баги возникают в основном из-за невнимательности или просчете в логике. Просчет иммутабельность не убирает. Невнимательно изменить переменную. Тут 2 варианта. 1: хотел изменить не ту переменную. Тут спасают грамотные названия этих самый переменных. Не должен был вообще ничего менять. Тут да. Но таких багов лично я давно не допускал.
не, смотри в чем фишка. иммутабельность влечет за собой отказ от объектов, потому что они как раз принципиально мутабельны. тогда ты получаешь функции. когда ты пишешь функции с имутабельностью и без сайд эффектов, их легко тестировать, потому что вход однозначно мапится на выход и при этом внутри внешних объектов ничего не меняет. а тогда баги проще локализовать и соотвественно проще НАЙТИ, а не не создавать изначально. + юниттестирование чистых функций — это каеф, а объектов — жопная боль
Slava
Если код поддерживается в течении десятилетий - тем более, уже пять поколений людей его писало
Slava
я тут во всём согласен с Дейвом https://dave.cheney.net/2017/06/15/simplicity-debt
Vladislav
Тот же, по-моему, Дейв писал о том, что нужно отказаться от глобальных переменных.
Vladislav
И сразу уходит глобальное состояние, которое можно менять.
engelbart
ТО что все годами гонятт на глобальные переменные не новость
engelbart
Но иногда не понятно как иначе, у меня из за этих инъектиций состояния в функции, бывает голову уже сломаешь
Dmitry
Ну это дело привычки. Нужно принять что придётся не менять что-то во вселенной, а создавать новую вселенную, где уже есть нужное изменение :D
Aleksandr
ТО что все годами гонятт на глобальные переменные не новость
угу. в других языках "глобальные переменные - зло" на уровне аксиомы, не требующей доказательств. В го же по серьезке обсуждают хорошо это или плохо. Совсем другой язык. Совсем другой взгляд на программирование.
engelbart
Угу
Aleksandr
это все диктуется чрезмерной лаконичностью и низкоуровневостью языка.
engelbart
Как вот люди решают проблему большого конфига, у меня есть масштабный кофиг (на самом деле много, уровня приложения, уровня конкретного инстанса, уровня задачи) и читаю я в main и потом начинаю части его прокидывать в функции, но это уйма убогой писанины. И я постоянно думаю что сорвусь и дам пакетам своим или читать конфиг, или будут переменные глобальные
Michael
😂😂😂
Michael
Context
Michael
и в нём, что надо прокидывать
Michael
не?
engelbart
Ну да, типа того. Но вот толи всю эту уйму конфигов пизхать в один контекст, толи делать дробить их
Mike
заодно внутри пакета можешь норм организовать конфиг по файлам
engelbart
Пакет config есть, их как бы много. На уровне app , естьт конфиг где номер инстанса например и база, на уровне задачи например дургой конфиг , там какую таблицу процессить и тд
engelbart
Пакет viper
Спасибо гляну
engelbart
Т.е. в двух словах, или контексты или некий синглетон с методами getBlabla
engelbart
А потом, сделать синглотоном? или чего с ним
Dmitry
А потом использовать там где он нужен, например так: Пакет с конфигом может выглядеть так https://github.com/corpix/market-fetcher/blob/master/config/config.go#L162 Использование так https://github.com/corpix/market-fetcher/blob/master/cli/root.go#L39
engelbart
Спасибо!