Comments 4
Ой столько проблем с этими DTO... По 10 прокси методов необходимо лишь бы перегнать в нужный формат
type deliveryClient interface {
Create(ctx context.Context, t time.Time, orderId string) (trackId string, err error)
}
Ну наконец-то увидел правильное использование интерфейсов в Go по месту использования. А то постоянно делают мало того что глобальными суперинтерфейсами, так еще и в пакет реализации засовывают.
И постоянное у всех вижу использование Repository и с методами не как для работы с коллекцией и определенной для 1 сущности. Смотришь по методам — там или DAO, или типичный Storage, но никак не репозиторий. Даже не знаю, почему так упорно везде пытаются пихать Repository.
И лично мне не нравится, что из пакета постоянно структуру делают экспортируемой. Да, я в курсе, что даже Goland IDE ругается на это (с чего ли?), и все так делают. Но когда из пакета торчат только разрешенные методы, мы снижаем случайно в другом пакете сделать жесткую зависимость и со временем превратить проект в «комок грязи» по "чистой архитектуре" с папочками по ДДД.
А так все по делу изложено и логично.
При таком решении поля объекта становятся публичными и надо договориться в команде не злоупотреблять этим.
А почему мы должны делать поля публичными? Таким образом мы нарушаем принцип сокрытия данных, соответсвенно нашей инкапсуляции поведения грош цена. Теперь мы знаем из чего состоит заказ и как он устроен внутри. Почему не закрыть эти данные например так?
type OrderData struct {
Id string
Status string
TrackId string
CreatedAt time.Time
UpdatedAt time.Time
}
type Order struct {
data OrderData
delivery deliveryClient
}
func NewOrder(data OrderData, delivery deliveryClient) *Order {
return &Order{
data: data,
delivery: delivery,
}
}
Я делаю это, чтобы не писать дополнительных геттеров. Защищаться от программиста дело неблагодарное, а соблюдать правила ради правил утомительно. Если вы пишете публичную библиотеку, то можете реализовать метод `Data() OrderData` и возвращать копию состояния, гарантируя чтобы в ней не оказалось указателей на исходные данные. Но по мне проще принять несовершенство мира и сосредоточится на решении действительно важных проблем.
Некоторые приёмы ООП в golang