Anonymous
Anonymous
Глобальные обычно всякие константы
Dmitry
Константы не изменяемы. Речь о переменных, которые могут быть изменены
Евгений
название статьи - GlobalVariablesAreBad
Anonymous
Типа вы хотите сказать, что http.DefaultClient - это неправильно?
Anonymous
Это ж, как я понимаю, глобальная переменная
Dmitry
Если её не мутируют то не могу сказать что наличие такой переменной это не правильно. Но в этом случае это уже не совсем переменная... я бы сказал что это идентификатор
Мерль
Dmitry
Вобщем, коротко говоря - наличие глобальных переменных, которые могут меняться из разных частей программы - зло. Я полагаю что это и было изначальным поинтом этого разговора
Michael
readonly спасёт мир
Dmitry
ФП спасёт мир)))
Anatoly
fix: (ФП (спасет (мир)))
Zhenja
а подключение к базе, логгеры, конфиг? Передавать в функции параметром? Или в каждой функции поднимать свое?
Michael
хм... я про шарповый ридонли
Michael
readonly инициализируется в init, а далее ведёт себя как константа
Anonymous
Zhenja
а, тогда статью надо переименовать в SimpleTypeGlobalVariablesAreBad
Michael
fix(Variables(Are(Bad)))
Anonymous
Axm
Axm
во все функции проекта?
Igor
В других языках это решается через IoC контейнер
Igor
в Go сколько не гуглил, адекватного контейнера не нашёл
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
Dmitry
ага, спасибо
Michael
просто immutable ?
Slava
ридонли и неизменяемые переменные действительно важны/удобны
Slava
надеюсь го в эту сторону придёт так или иначе
Евгений
> неизменяемые переменные
константы?
Vladislav
На самом деле непонятно, что мешает просто не менять.
Michael
Евгений
Пишите везде := и присваивайте по одной - компилятор сам начнет ругаться, что вы ее пытаетесь переопределить —- тут должен идти тролль-фейс ))
Slava
Slava
Vladislav
То же, что мешает людям писать код без багов
Ну смотри. Не знаю как у всех, но на моем опыте баги возникают в основном из-за невнимательности или просчете в логике. Просчет иммутабельность не убирает. Невнимательно изменить переменную. Тут 2 варианта. 1: хотел изменить не ту переменную. Тут спасают грамотные названия этих самый переменных. Не должен был вообще ничего менять. Тут да. Но таких багов лично я давно не допускал.
Dmitry
Slava
Slava
Если код поддерживается в течении десятилетий - тем более, уже пять поколений людей его писало
Slava
я тут во всём согласен с Дейвом https://dave.cheney.net/2017/06/15/simplicity-debt
Vladislav
Тот же, по-моему, Дейв писал о том, что нужно отказаться от глобальных переменных.
Vladislav
И сразу уходит глобальное состояние, которое можно менять.
engelbart
ТО что все годами гонятт на глобальные переменные не новость
engelbart
Но иногда не понятно как иначе, у меня из за этих инъектиций состояния в функции, бывает голову уже сломаешь
Dmitry
Ну это дело привычки. Нужно принять что придётся не менять что-то во вселенной, а создавать новую вселенную, где уже есть нужное изменение :D
Vladislav
engelbart
Угу
Мерль
Aleksandr
Aleksandr
это все диктуется чрезмерной лаконичностью и низкоуровневостью языка.
engelbart
Как вот люди решают проблему большого конфига, у меня есть масштабный кофиг (на самом деле много, уровня приложения, уровня конкретного инстанса, уровня задачи) и читаю я в main и потом начинаю части его прокидывать в функции, но это уйма убогой писанины.
И я постоянно думаю что сорвусь и дам пакетам своим или читать конфиг, или будут переменные глобальные
Michael
😂😂😂
Michael
Context
Michael
и в нём, что надо прокидывать
Michael
не?
Aleksandr
engelbart
Ну да, типа того. Но вот толи всю эту уйму конфигов пизхать в один контекст, толи делать дробить их
Valentin
Mike
Mike
заодно внутри пакета можешь норм организовать конфиг по файлам
engelbart
Пакет config есть, их как бы много.
На уровне app , естьт конфиг где номер инстанса например и база, на уровне задачи например дургой конфиг , там какую таблицу процессить и тд
engelbart
Т.е. в двух словах, или контексты или некий синглетон с методами getBlabla
Dmitry
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
Спасибо!