170 похожих чатов

Ну и? Мокающий пакет те же ошибки возвращает, на то

он и мокающий

44 ответов

9 просмотров
Alexander- Автор вопроса

Там же, где живет оригинальный GetUser

Alexander- Автор вопроса

Положите туда же, где лежит объявленный интерфейс с этим методом

Alexander
Положите туда же, где лежит объявленный интерфейс ...

бац, а он лежит на слое логики, потому интерфейс на месте использования рекурсивный импорт

|- user |- errors.go <- вот здесь например |- user.go |- db |- mongo |- sql |- mock

Бизнес-модель (Структуры, интерфейсы, реализации сервисов)

Anton Kucherov
Бизнес-модель (Структуры, интерфейсы, реализации с...

ну это вопрос организации папок в проекте, а если у человека организована как: |- handlers |- user |- role |- service |- user |- role |- storage |- user |- role тогда где ошибки?

Anton Kucherov
|- user |- errors.go <- вот здесь например ...

и тут ещв вопрос: в errors.go там ошибки и стораджа и сервисов? или 1 набор ошибок?

Artur Karapetov
ну это вопрос организации папок в проекте, а если ...

Тогда надо пересмотреть подход к организации кода. Чтобы она перестала отражать склад технических терминов и начала отражать предметную область.

Anton Kucherov
Тогда надо пересмотреть подход к организации кода....

почти все языки с вами поспорят, ну кроме golang и python

Artur Karapetov
почти все языки с вами поспорят, ну кроме golang и...

Нет. не поспорят. Со мной поспорят разве что Framework Driven Developers

Anton Kucherov
Нет. не поспорят. Со мной поспорят разве что Frame...

а кстати, а клиентов куда девать? клиенты к Consul/zipkin/microservice ?

Artur Karapetov
и тут ещв вопрос: в errors.go там ошибки и сторадж...

а у вас в сторадже может быть ошибка, кроме паники? (ну, или обертки над ней)

serg
перехваченная паника

в golang можно перехватывать паники?

Artur Karapetov
а кстати, а клиентов куда девать? клиенты к Consul...

Куда хотите. Главное чтобы бизнес-код их напрямую не вызывал и ничего о них не знал.

Artur Karapetov
и тут ещв вопрос: в errors.go там ошибки и сторадж...

Там ошибки бизнеса. И эти ошибки могут использоваться в любом инфраструктурном слое ниже.

Alexander
🙂

почитал про recover, выглядит интересно, надо попробовать

Не будет циклического импорта. Потому что пакет user не использует пакеты /db/*.

Alexander- Автор вопроса
Anton Kucherov
Там ошибки бизнеса. И эти ошибки могут использоват...

мысль интересная. то есть сделать 5 общих бизнесовых ошибок, во всех слоях просто выбрасывать fmt.Errorf(), кроме последнего, а в последнем бизнес слое, заворачивать ошибку в бизнесовую и ее уже анализировать в хендлере. но тут встает вопрос, как отличить ошибку storage, когда запрос не смог выполниться и когда просто не нашлось ничего?

Artur Karapetov
мысль интересная. то есть сделать 5 общих бизнесо...

|- user |- user.go <- Тут структуры для функционала работы с ползователями. |- errors.go <- Тут ошибки которые может вернуть сервис / абстрактное хранилище / и т.п. |- service.go <- Тут реализация сервиса, который использует интерфейс хранилища. И которым при работе с пользователями будут пользоваться хэндлеры. |- storage.go <- Тут интерфейс хранилища, который используется сервисом. |- db <- Вот эти ребята реализуют интерфейс который описан в storage.go и возвращают структуры и ошибки которые описаны в user.go и errors.go. |- sql | - mock

На этот вопрос нет однозначного ответа. Тут все зависит от фич и от юзкейсов. Это другого уровня вопрос. Поэтому обычно принято начинать с одного пакета в котором хранится вся бизнес-логика (в такой схеме все сущности и сервисы могут лежать в пакете internal например), а уже потом этот пакет дербанить на ограниченные контексты (user/group/etc.) исходя из приобретенных знаний о бизнес-домене. Иначе будет всегда одно и то же. Мы сперва разбили пакеты, потом они почему то должны использовать друг друга и у нас появляются циклические импорты. Потому что оказалось что 2 сущности тесно связаны между собой в рамках одного ограниченного контекста.

вы имеет ввиду когда функционал работает с несколькими сущностями, с ролями и пользователями например?

Anton Kucherov
На этот вопрос нет однозначного ответа. Тут все за...

я думаю Roman спрашивает про слой что-то типа Policy, когда в нем используется UserService и RoleService и OrderService

И да, на самом деле не обязательно использовать одни и те же структуры по всему коду. Код можно дублировать. Если приложение большое, сущностей User может быть несколько в разных пакетах. И эти сущности в каждом пакете будут обозначать немного разные вещи с разными юзкейсами. Существует заблуждение, что условный type User struct уровня бизнес-логики в приложении должен быть один и его потом надо таскать везде где он нужен. Это не так.

Artur Karapetov
ну нет, дублировать код не надо

Вы возводите DRY в абсолют (Т.е. превращаете его в Карго-культ). Когда сущности находятся в разных ограниченных контекстах - дублирование кода сократит вам уйму времени и нервов. Впрочем дело ваше.

Anton Kucherov
Вы возводите DRY в абсолют (Т.е. превращаете его в...

не возвожу, ну по крайней мере пока что не замечаю что возвожу

скажут что надо быть дисциплинированным и писать тесты

Сама необходимость дублирования обычно продиктована ситуациями когда в одном юзкейсе должна (бизнесово) меняться сущность, а во втором нет. 🙂 Т.е. пришел бизнес и сказал:"_ Вот в этой фиче надо вот это поменять." А вы такие: "- Бляяяяяя... А мы не можем, у нас все во всех местах поменяется. Простите." А бизнес такой: "- Погодите, а почему так, у нас же безнесово вещи никак не связаны. Это должно быть просто, почему нет?" А вы такие: "Соррян, у нас DRY"

Artur Karapetov
плохой дизайн

Поэтому существуют ситуации в которых сущности можно дублировать, чтобы получился "Хороший дизайн" (точнее более гибкий дизайн. Плохой и хороший - не совсем подходящие слова). Но опять таки. Где именно производить дублирование кода, нужно смотреть предметно и точечно, по ситуации.

Anton Kucherov
Поэтому существуют ситуации в которых сущности мож...

Так продумать места где система может измениться и есть один из важных этапов проектирования.

Anton Kucherov
Сама необходимость дублирования обычно продиктован...

ну, скопипастить функционал, много времени не нужно. так что тут описана какая-то невероятная архитектурная проблема. тут, скорее, проблема как раз в другом - копипаст функционала нарушает принцип единой ответственности. а копирование сущностей избегается соответствующими паттернами - интерфейсами или еще какими обертками....

serg
ну, скопипастить функционал, много времени не нужн...

Я бы сказал DRY в части случаев нарушает принцип единой ответственности. Объединяя код у которого имеются разные причины для изменения.

Anton Kucherov
Я бы сказал DRY в части случаев нарушает принцип е...

а пон. объединил функционал не зная меры :)

serg
ну, скопипастить функционал, много времени не нужн...

Это только микросервисами решается. А проблема вытекает из неверного выборауровне абстракции скорее всего, потому кажется что похожий функционал это нарушение DRY

serg
а пон. объединил функционал не зная меры :)

Да, я именно об этом. Я лично часто такое встречал. Когда объединяют просто чтобы объединить. Грубо говоря берем CopyPaste детектор и в тупую объединяем похожие строки кода обобщая его

Anton Kucherov
Да, я именно об этом. Я лично часто такое встречал...

хорошо, что здесь нет джавистов. сейчас бы нас просветили...

Похожие вопросы

Обсуждают сегодня

Скажите, можно ли как-то "переместить" динамический массив из одной переменной в другую? Скажем, переместить из TList<> в TArray<>. Именно переместить, а не скопировать. Если ...
Eugene Krasnikov (ᴊɪɴ x)
37
Вот еще криповенькая штука. uMain.pas(517,3) Warning: Case statement does not handle all possible cases И ЧО? 😂
Александр (Rouse_) Багель
15
комрады, че-та лыжы не едут var tmpFont: TFont; begin tmpFont:= TFont.Create; try case rgFontColor.ItemIndex of 0: tmpFont.Color:= clWindowText; 1: tmpFo...
Ed Doc
34
.model small .stack 100h .data a db 'Hello, World!', '$' ; исходная строка b db 20 dup(?) ; строка b с запасом на максимальную длину .code main: ...
Алексей -man
3
вопрос, кого посмотреть в ютубе или где почитать про указатели чтобы раз и навсегда запомнить зачем они нужны и как правильно ими пользоваться? поделитесь хорошими ресурсами, ...
-
14
М-да. Почему бы просто со stringlist не работать?
Michael Longneck
23
Интересно, нет ли какого-то способа получить из dll не адрес самой метки, а адрес со смещением?
The Bird of Hermes
54
Редактор листа Excel, по сути двумерный массив ячеек. Ячейка - это экземпляр класса, у нее всякие свойства, методы. Проблема в том, что количество используемых строк и колоно...
Sergey Bodrov
2
Is there a digital way to cut the electricity from a usb in linux? It sounds weird, but it's exactly what I need to do. I tried to simulate the unplug/replug but is not the ...
Eduard Rivas
15
Добавляю 100 тыс слов в TListBox. Перемешаю скролл (от ListBox). После примерно 65536 скролл резко прыгает вверх. Это что за глюк? Как фиксить, кто-нибудь знает?
Eugene Krasnikov (ᴊɪɴ x)
8
Карта сайта