Size: a a a

2020 December 07

М

Михаил in Go-go!
Алексей Долгов
1. да, передаем указатель на пулл соединений. это ресурс. в основном применяется этот ресурс в хранение и получение данных. часто эту логику реализуют в отдельной структуре - репозитории. репозиторий - сохраняет обновляет, возвращает данные, удаляет и там много чего. потом репозиторий используется в каких то сервисах, сервисы в хэндлерах. часто можно видеть такое в main
db := newDB()
br := newBookRepository(db)
bs := newBookService(br)
h := newBookHandler(bs)
2.да. как вариант
package db

....

var db   *sqlx.DB

func init() {
 db, err = sqlx.Open("postgres", url)
}

func GetConnection() *sqlx.DB {
 return db
}
 
но 2 вариант очень плохо, целиком из антипаттернов go
Кстати. Вот я попробовал написать свой первый круд и столкнулся с тем, что у меня функция main выглдяит не очень красиво из-за этого обилия newBookRepository, newBookService  и пр. Как избежать этой каши?

В туре вообще говорится, что в функции main должна содержать минимум кода. Но это кажется невозможным
источник

DP

Daniel Podolsky in Go-go!
Александр Владимирович
мои мысли по поводу того что компилятор сам вставляет в код точки останова, чтобы иногда сбрасывать гороутину видимо не верны
Верны. Но сбрасывать - это передавать управление планировщику
источник

М

Михаил in Go-go!
Алексей Долгов
1. да, передаем указатель на пулл соединений. это ресурс. в основном применяется этот ресурс в хранение и получение данных. часто эту логику реализуют в отдельной структуре - репозитории. репозиторий - сохраняет обновляет, возвращает данные, удаляет и там много чего. потом репозиторий используется в каких то сервисах, сервисы в хэндлерах. часто можно видеть такое в main
db := newDB()
br := newBookRepository(db)
bs := newBookService(br)
h := newBookHandler(bs)
2.да. как вариант
package db

....

var db   *sqlx.DB

func init() {
 db, err = sqlx.Open("postgres", url)
}

func GetConnection() *sqlx.DB {
 return db
}
 
но 2 вариант очень плохо, целиком из антипаттернов go
Почему второй вариант - это антипаттерны?
источник

АК

Александр Костюченко... in Go-go!
Алексей Долгов
1. да, передаем указатель на пулл соединений. это ресурс. в основном применяется этот ресурс в хранение и получение данных. часто эту логику реализуют в отдельной структуре - репозитории. репозиторий - сохраняет обновляет, возвращает данные, удаляет и там много чего. потом репозиторий используется в каких то сервисах, сервисы в хэндлерах. часто можно видеть такое в main
db := newDB()
br := newBookRepository(db)
bs := newBookService(br)
h := newBookHandler(bs)
2.да. как вариант
package db

....

var db   *sqlx.DB

func init() {
 db, err = sqlx.Open("postgres", url)
}

func GetConnection() *sqlx.DB {
 return db
}
 
но 2 вариант очень плохо, целиком из антипаттернов go
к вопросу выше, почему вариант 2 плох? просто вместо main всё хранится в store ?
источник

АК

Александр Костюченко... in Go-go!
Или вы имеете ввиду "связность" кода?
источник

C

Calculon🤖 in Go-go!
Александр Костюченко (КМ Системс)
к вопросу выше, почему вариант 2 плох? просто вместо main всё хранится в store ?
потому что глобал стейт
источник

АД

Алексей Долгов... in Go-go!
Михаил
Кстати. Вот я попробовал написать свой первый круд и столкнулся с тем, что у меня функция main выглдяит не очень красиво из-за этого обилия newBookRepository, newBookService  и пр. Как избежать этой каши?

В туре вообще говорится, что в функции main должна содержать минимум кода. Но это кажется невозможным
я смирился с описанием всего и вся в main. ибо со всякими плюхами для di еще хуже выглядит
источник

М

Михаил in Go-go!
Алексей Долгов
я смирился с описанием всего и вся в main. ибо со всякими плюхами для di еще хуже выглядит
Ясно, спасибо
источник

АД

Алексей Долгов... in Go-go!
Михаил
Почему второй вариант - это антипаттерны?
глобальные переменные - зло, init - зло по многим причинам
источник

АК

Александр Костюченко... in Go-go!
Calculon🤖
потому что глобал стейт
В случае с примером где в main прокидывается - разве там не один и тот же указатель? Или я неверно понимаю "глобал стейт"?
Поделитесь ресурсом для получения информации?
источник

DM

Dmitry M in Go-go!
Daniel Podolsky
Верны. Но сбрасывать - это передавать управление планировщику
вроде как рантайм сам себе шлет сигнал https://habr.com/ru/post/502506/
источник

C

Calculon🤖 in Go-go!
Александр Костюченко (КМ Системс)
В случае с примером где в main прокидывается - разве там не один и тот же указатель? Или я неверно понимаю "глобал стейт"?
Поделитесь ресурсом для получения информации?
где там main?
источник

М

Михаил in Go-go!
Алексей Долгов
глобальные переменные - зло, init - зло по многим причинам
Так-то да, но неужели это меньшее зло по сравнению с портянкой в main?
источник

АК

Александр Костюченко... in Go-go!
Calculon🤖
где там main?
виноват, ошибся.
источник

Z

Zver in Go-go!
Михаил
Кстати. Вот я попробовал написать свой первый круд и столкнулся с тем, что у меня функция main выглдяит не очень красиво из-за этого обилия newBookRepository, newBookService  и пр. Как избежать этой каши?

В туре вообще говорится, что в функции main должна содержать минимум кода. Но это кажется невозможным
Запихайте в функцию инициализации приложения и передвайте в нее параматры инициализации. Для некоторой автоматизации есть Wire.
источник

М

Михаил in Go-go!
Zver
Запихайте в функцию инициализации приложения и передвайте в нее параматры инициализации. Для некоторой автоматизации есть Wire.
Я смотрел wire, он мне не очень понравился. ЛУчше уж руками граф зависимостей собирать
источник

Z

Zver in Go-go!
Александр Костюченко (КМ Системс)
к вопросу выше, почему вариант 2 плох? просто вместо main всё хранится в store ?
У вас пакет станет зависим от состояния другого пакета. А вдруг у вас будет потом 2 пакета которым нужно будет подключение к 2м разным базам или вы захотите замокать пакет.
источник

АД

Алексей Долгов... in Go-go!
Михаил
Так-то да, но неужели это меньшее зло по сравнению с портянкой в main?
ну возможно сказав "очень плохо" я переборщил, скорей "не очень хорошо"
Зато в этой портянке все происходит явно, магия не всем нравится
источник

Z

Zver in Go-go!
Александр Костюченко (КМ Системс)
В случае с примером где в main прокидывается - разве там не один и тот же указатель? Или я неверно понимаю "глобал стейт"?
Поделитесь ресурсом для получения информации?
Почитайте про Dependency Injecrion и Inversion of control.
источник

Z

Zver in Go-go!
Михаил
Я смотрел wire, он мне не очень понравился. ЛУчше уж руками граф зависимостей собирать
Ну про него интересно почтитать в плане понятия DI.
источник