Size: a a a

Golang Developers — русскоговорящее сообщество

2020 May 07

AY

Alexey Yurchenko in Golang Developers — русскоговорящее сообщество
Вы смешали бизнес логику и репозиторий
источник

TA

Timofey Aksyonov in Golang Developers — русскоговорящее сообщество
Это про второй случай как я понимаю?

А в курсор как забраться, это ведь часть работы с БД из оффициального драйвера?
источник

AY

Alexey Yurchenko in Golang Developers — русскоговорящее сообщество
общий случай такой.

type MyRepo struct {}

func (r MyRepo) GetAll() ([]model.Post, error) {
 return ...
}

func (r MyRepo) Update(data *model.Post) error {
}

и отдельно логика на CalcPostScoreData который использует две вышеуказанных функции через интерфейс
источник

AY

Alexey Yurchenko in Golang Developers — русскоговорящее сообщество
Функции repo, которые тупо тащат или записывают данные, я не тестирую (только интеграционные на все вместе). Оно обычно сразу взрывается, в отличии от бизнес логики в сервисах.
источник

AY

Alexey Yurchenko in Golang Developers — русскоговорящее сообщество
https://gist.github.com/alexesDev/ae24027c887215ab536456c8aaa54089
Я так делаю, если кому интересно. Из демо проекта простой сервис.
источник

AY

Alexey Yurchenko in Golang Developers — русскоговорящее сообщество
env это сборка всех репозиториев и другой фигни, которая с внешним миром работает. Обязана реализовать для всех сервисов нужные методы.
источник

AY

Alexey Yurchenko in Golang Developers — русскоговорящее сообщество
Это тип TDD, написал сервис, потестил и пошел допиливать репозитории 😃 пока не допилишь - проект не собирается.

Мок для локального Env интерфейса делает https://github.com/matryer/moq
источник

AY

Alexey Yurchenko in Golang Developers — русскоговорящее сообщество
Тестировать код вроде этого

func (env *Env) GetShopClientByMainPhoneAndPassword(phone string, password string) (*model.ShopClient, error) {
 row := model.ShopClient{}
 err := env.db.Model(&row).Where("main_phone = ? and encrypted_password = crypt(?, encrypted_password)", phone, password).Select()
 if err == pg.ErrNoRows {
   return nil, nil
 }
 return &row, err
}

особо смысла ИМХО нет.
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
У нас вообще бизнес логика с бд через интерфейс работает
источник

AY

Alexey Yurchenko in Golang Developers — русскоговорящее сообщество
Анатолий
У нас вообще бизнес логика с бд через интерфейс работает
у меня ж так же или не так понял?
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
да, я не дочитал сообщение про интерфейс 😃 просто код увидел и пропустил
В - внимательность
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
Многим просто лень описывать интерфейс для бд, и его использовать
И мне раньше было лень, пока не начал тесты писать
источник

AY

Alexey Yurchenko in Golang Developers — русскоговорящее сообщество
Alexey Yurchenko
Тестировать код вроде этого

func (env *Env) GetShopClientByMainPhoneAndPassword(phone string, password string) (*model.ShopClient, error) {
 row := model.ShopClient{}
 err := env.db.Model(&row).Where("main_phone = ? and encrypted_password = crypt(?, encrypted_password)", phone, password).Select()
 if err == pg.ErrNoRows {
   return nil, nil
 }
 return &row, err
}

особо смысла ИМХО нет.
Даже тут env.db это интерфейс. Не хочу, чтобы этот слой и слой бизнеслогики знали про транзакции. Это нарушение инкапсуляции (контроллер решает кому транзацию, а кому просто соединение), но мне так проще
источник

L

LeiDruid in Golang Developers — русскоговорящее сообщество
Товарищи, у меня есть сервис, в который приходит json, в зависимости от поля type в поле object может оказаться разного типа объект
Как правильно такое парсить в go ?
источник

L

LeiDruid in Golang Developers — русскоговорящее сообщество
Я попробовал сделать поле Object типа interface{}, но как потом запарсить этот интерфейс - хз
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
мы можем тебе помогать тут ответами
источник

L

LeiDruid in Golang Developers — русскоговорящее сообщество
Анатолий
мы можем тебе помогать тут ответами
а можно мне помочь ответом ? :)
источник

L

LeiDruid in Golang Developers — русскоговорящее сообщество
это какой-то продакшен ?
источник

L

LeiDruid in Golang Developers — русскоговорящее сообщество
или на зачет в универ ?
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
LeiDruid
а можно мне помочь ответом ? :)
есть два варианта:
1. interface{} как ты и сделал, потом преобразуй obj.(type)
2. доп поля вложи уровнем глубже и сделай тип json.RawData и потом его отдельно анмаршаль (это не всегда подходит если данные нельзя менять)
источник