Size: a a a

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

2020 October 22

D

Dmitry in Golang Developers — русскоговорящее сообщество
Анатолий
в ддд обычно 3 слоя:
слой который работает с данными извне
бизнесс логика
работа с хранилищем
вот да, сам ддд предполгает что сущность выполняет всю бизнес логику по изменению состояния в собственных методах
при этом внутренние данные закрыты чтобы на основе их нельзя было принимать решения
источник

А

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

А

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

x

x-foby in Golang Developers — русскоговорящее сообщество
Dmitry
т.е по сути вся бизнес логика у нас находится в хендлерах ?
Нет, конечно, просто вы соорудили Франкенштейна с репозиторием в json-файлах.
Если вы хотите DDD, то вы в любом случае будете писать набор адаптеров/конвертеров/фабрик и т.д., потому что доменная сущность живёт только в доменном слое, а на уровне хендлеров вам нужны другие структуры данных (даже если они такие же).

Но опять же, вам пример слишком синтетический.
Программа пишется от простого к сложному, а вы сразу начинаете городить кучу абстракций.

Для большей половины программ, к слову, можно и из хендлеров сразу в базу ходить — это нормально, когда у вас программа состоит из одной сущности и двух методов, например.
Все эти слои нужны, когда нужны.
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
благодарю, пошел читать
источник
2020 October 23

D

Dmitry in Golang Developers — русскоговорящее сообщество
господа, подскажите как выйти из такой непонятки
метод репозитория имеет следующую сигнатуру
func (m userMemoryStorage) GetById(id User.Id) (User.User, error)

как бы все понятно тут
но что делать когда необходимо вернуть ответ в случае ошибки в методе ? не важно какой
собственно мне видится return User.User{}, errors.new("...")

но мне кажется это не очень правильным, хотелось бы возвращать nil вместо пустого юзера
однако голанг это не позволяет мне

чтобы возвращать nil мне нужно изменить сигнатуру метода на
func (m userMemoryStorage) GetById(id User.Id) (User.UserInterface, error)

но в интерфейсе я не могу указывать поля которые будут изменять данные структуры (методы структуры с указателями func (u *User) Activate() например)
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Dmitry
господа, подскажите как выйти из такой непонятки
метод репозитория имеет следующую сигнатуру
func (m userMemoryStorage) GetById(id User.Id) (User.User, error)

как бы все понятно тут
но что делать когда необходимо вернуть ответ в случае ошибки в методе ? не важно какой
собственно мне видится return User.User{}, errors.new("...")

но мне кажется это не очень правильным, хотелось бы возвращать nil вместо пустого юзера
однако голанг это не позволяет мне

чтобы возвращать nil мне нужно изменить сигнатуру метода на
func (m userMemoryStorage) GetById(id User.Id) (User.UserInterface, error)

но в интерфейсе я не могу указывать поля которые будут изменять данные структуры (методы структуры с указателями func (u *User) Activate() например)
(*user.User, error)
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
Dmitry
господа, подскажите как выйти из такой непонятки
метод репозитория имеет следующую сигнатуру
func (m userMemoryStorage) GetById(id User.Id) (User.User, error)

как бы все понятно тут
но что делать когда необходимо вернуть ответ в случае ошибки в методе ? не важно какой
собственно мне видится return User.User{}, errors.new("...")

но мне кажется это не очень правильным, хотелось бы возвращать nil вместо пустого юзера
однако голанг это не позволяет мне

чтобы возвращать nil мне нужно изменить сигнатуру метода на
func (m userMemoryStorage) GetById(id User.Id) (User.UserInterface, error)

но в интерфейсе я не могу указывать поля которые будут изменять данные структуры (методы структуры с указателями func (u *User) Activate() например)
я возвращаю пустую структуру и ошибку, у меня всегда в начале метода есть образно такой кусок  var result User.User и его я возвращаю при ошибке, если нет, заполняю
источник

А

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

AS

Alexander Shavelev in Golang Developers — русскоговорящее сообщество
Dmitry
господа, подскажите как выйти из такой непонятки
метод репозитория имеет следующую сигнатуру
func (m userMemoryStorage) GetById(id User.Id) (User.User, error)

как бы все понятно тут
но что делать когда необходимо вернуть ответ в случае ошибки в методе ? не важно какой
собственно мне видится return User.User{}, errors.new("...")

но мне кажется это не очень правильным, хотелось бы возвращать nil вместо пустого юзера
однако голанг это не позволяет мне

чтобы возвращать nil мне нужно изменить сигнатуру метода на
func (m userMemoryStorage) GetById(id User.Id) (User.UserInterface, error)

но в интерфейсе я не могу указывать поля которые будут изменять данные структуры (методы структуры с указателями func (u *User) Activate() например)
> но мне кажется это не очень правильным, хотелось бы возвращать nil вместо пустого юзера

да все норм возвращать пустого) вызывающий же должен ошибку проверить в первую очередь
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
Alexander Shavelev
> но мне кажется это не очень правильным, хотелось бы возвращать nil вместо пустого юзера

да все норм возвращать пустого) вызывающий же должен ошибку проверить в первую очередь
А если вызывающий идиёт как я :) забудет. Я ещё не привык
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
Dmitry
А если вызывающий идиёт как я :) забудет. Я ещё не привык
тогда ты запаникуешь и у тебя приложение упадет
источник

А

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

x

x-foby in Golang Developers — русскоговорящее сообщество
Главное — принять и следовать одному простому правилу: если возвращается ошибка, то все значения, идущие в кортеже с ней — нулевые.
Это касается, как возврата из функции, так и использования результатов.
То есть либо данные с nil-ошибкой, либо ошибка и zero-value данные.

Что возвращать в качестве данных: структуры или указатели на них — это в большинстве случаев просто вопрос вкуса, и в очень редких случаях (которых у большинства разработчиков никогда не будет) вопрос производительности.
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
x-foby
Главное — принять и следовать одному простому правилу: если возвращается ошибка, то все значения, идущие в кортеже с ней — нулевые.
Это касается, как возврата из функции, так и использования результатов.
То есть либо данные с nil-ошибкой, либо ошибка и zero-value данные.

Что возвращать в качестве данных: структуры или указатели на них — это в большинстве случаев просто вопрос вкуса, и в очень редких случаях (которых у большинства разработчиков никогда не будет) вопрос производительности.
Исчерпывающе. Спасибо
источник

AS

Alexander Shavelev in Golang Developers — русскоговорящее сообщество
Dmitry
А если вызывающий идиёт как я :) забудет. Я ещё не привык
на таких вызывающих есть 2 приема:
- линтеры
- паника
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
А есть какие то правильные способы обработки ошибок ?
Делать после каждого вызова if err != nil как то не очень
Сделать для этого отдельную глобальную функцию в целом можно, но пока эта идея в загашнике
CheckError(err interface{}, message string)
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
Dmitry
А есть какие то правильные способы обработки ошибок ?
Делать после каждого вызова if err != nil как то не очень
Сделать для этого отдельную глобальную функцию в целом можно, но пока эта идея в загашнике
CheckError(err interface{}, message string)
тебе ведь нужно отреагировать на ошибку, вернуть что-то, прервать программу, по этому придется всегда if err != nil  делать
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Dmitry
А есть какие то правильные способы обработки ошибок ?
Делать после каждого вызова if err != nil как то не очень
Сделать для этого отдельную глобальную функцию в целом можно, но пока эта идея в загашнике
CheckError(err interface{}, message string)
CheckError вам не поможет, когда надо будет прервать функцию по разным условиям.
источник

AS

Alexander Shavelev in Golang Developers — русскоговорящее сообщество
Dmitry
А есть какие то правильные способы обработки ошибок ?
Делать после каждого вызова if err != nil как то не очень
Сделать для этого отдельную глобальную функцию в целом можно, но пока эта идея в загашнике
CheckError(err interface{}, message string)
правильный способ обработки ошибок начинается с ее проверки) а дальше от ошибки уже зависит
источник