Conversation
(feature) accrual
* feat(gopher): user registration * feat(gopher): user authentication * fix(infra): correct configuration of the DB environment * docs: added a description for the README
Feature/gophermart orders
* feat(gophermart): add balance API * feat(gophermart): add withdraw API * feat(gophermart): add withdrawals API
|
Как сделали PR для проверки: # Develop branch
git checkout --orphan develop
git rm -rf .
git commit -a -m "Init" --allow-empty
git push -u origin develop
# Review branch
git checkout develop
git checkout -b review
git push --set-upstream origin review
# Merge main
git checkout develop
git merge main --allow-unrelated-histories
git push |
| AccrualAddress string `env:"ACCRUAL_SYSTEM_ADDRESS" envDefault:"http://localhost:8081"` | ||
| } | ||
|
|
||
| func ParseFlags() Config { |
There was a problem hiding this comment.
Почему ParseFlags, если это конструктор, а конструкторы принято именовать с New
| ) | ||
|
|
||
| type OrdersHandler struct { | ||
| Repo repositories.Repository[models.Order] |
There was a problem hiding this comment.
Существуют различные решения с DI на го, но все они не очень, например, https://github.com/google/wire
Но у них есть существенный недостаток - они не могут работать с идеоматическим подходом го в плане интерфейсов. Те если объявлять интерфейсы вместе использования, что предоставляет большую гибкость в коде, то подобные вещи не очень хорошо отрабатывают, например, wire не умеет.
Литература и ссылки
interface pollution https://100go.co/5-interface-pollution/ в целом вся книга довольно полезная
https://youtu.be/eYHCCht8eX4?feature=shared
https://www.ardanlabs.com/blog/2016/10/avoid-interface-pollution.html
https://www.ardanlabs.com/blog/2015/09/composition-with-go.html
| return | ||
| } | ||
|
|
||
| if orderInstance, err := h.Repo.FindByFieldWithPreloads(context.Background(), "number", orderNumber, "Goods"); err != nil { |
There was a problem hiding this comment.
почему contexst.Background() вместо r.Context()?
|
|
||
| ctx := r.Context() | ||
|
|
||
| existing, err := h.Repo.FindByField(ctx, "number", req.Order) |
There was a problem hiding this comment.
выглядит так, что все ниже это - доменная или бизнес логика, которую можно декомпозировать и вынести либо в доменный слой6 если интересен DDD либо в сервисный слой, если больше приверженец SOLID или CLEAN
| for task := range p.tasks { | ||
| logger.L().Debug("worker picked task", zap.Int("worker_id", id), zap.Uint("order_id", task.OrderID)) | ||
|
|
||
| ctx := context.Background() |
There was a problem hiding this comment.
а предусмотрена ли возможность дождать окончания операции и после этого завершить процесс, если поступил сигнал на завершение?
|
|
||
| ctx, cancel := context.WithTimeout(context.Background(), ShutdownTimeout) | ||
| defer cancel() | ||
|
|
There was a problem hiding this comment.
с workerpool не понял, как отрабатывается этот сигнал
| } | ||
| } | ||
|
|
||
| func (f *AccrualFetcher) fetchAccrualResponse(ctx context.Context, number string) (*accrualResponse, error) { |
There was a problem hiding this comment.
тут можно сделать декомпозицию на доменную логику и клиента. Клиент умеет ходить в апи, знает куда и возвращает готовый ответ или ошибки определенного типа. А здесь уже вызывается клиент, обрабатываются ошибки от клиента и ответ.
There was a problem hiding this comment.
таким образом можно будет завязаться на интерфейс клиента и покрыть бизнес логику тестами на моках, не дожидаясь, когда реальный аккруал заработает - это обсуждали на созвоне. Плюс дополнительная декомпозиция.
В микросервисах обычно подымают grpc и наружу отдают grpc клиентов, которые можно импортировать в проект.
No description provided.