...
1. Какой di контейнер юзать или актуальность его? 2. Чистая архитектура нужна или нет? 3. Gorm это аналог алхимии? А есть аналог asyncpg? 4. Эксепшенов тоже нет? Каждый раз нужно ошибку возвращать и проверять через стратегию? 5. Есть ссылка на стайлгайд например почему мы должны функцию называть с Must которая инициализируется при старте приоожухи и тд
2. Чистая архитектура это книжка, там в основном про solid. Реклмендую прочитать на выходных, чтобы такие вопросы не возникали. А разнообразия «чистых архитектур» на гитхабе, это просто перекладывание папочек и попытка повторить нейминг, предложенный в книжке. Хотя в той же книжке написано, что чистая архитектура не регламентирует структуру и архитектуру проекта
...
Sorry
⛪️Поп Гапон⛪️
там не про слои, а про границы
⛪️Поп Гапон⛪️
но не замерял, но примерно до середины там про солид
⛪️Поп Гапон⛪️
это направление зависимостей, не слои
Илья🦖
вроде 50%
ну да, принципы солид для модулей еще расписаны
Rostislav
Kuro
Rostislav
4. if err
это не стратегия же. Просто условие
Oleg
это направление зависимостей, не слои
Между чем протекают абстракции?
⛪️Поп Гапон⛪️
не понял, что значит протекают
Илья🦖
Правильный ответ "Слои", как я понял
...
не понял, что значит протекают
Когда низлежащий слой знает о высшем, например, из-за прямых импортов (Dependency inversion principle) или отсутсвия интерфейсов в некоторых местах. Но это же всё про solid...
CatLecter
1. Какой di контейнер юзать или актуальность его? 2. Чистая архитектура нужна или нет? 3. Gorm это аналог алхимии? А есть аналог asyncpg? 4. Эксепшенов тоже нет? Каждый раз нужно ошибку возвращать и проверять через стратегию? 5. Есть ссылка на стайлгайд например почему мы должны функцию называть с Must которая инициализируется при старте приоожухи и тд
1. Лучше написать свою реализацию разрешения зависимостей, это достаточно просто, тебе скорее всего не нужна сложная библиотека для решения твоих проблем. Да и нужно понять есть ли проблема, для большинства проектов DI не нужен. 2. Чистая архитекрута это как религия - у каждого своя, я бы не усложнял проект реализуя "свое видение чистой архитектуры", пользы от нее не так много как много хайпа. 3. За ORM в го тебя на кол посадят, во первых зачем брать быстрый язык, чтобы замедлять его какими-то орм, когда просто можно писать на абсолютно всем понятном SQL. Во вторых из-за низкой популярности орм в го горм развивается очень медленно и имеет кучу багов, тебе оно не нужно, в проде его нет, на собесах тебя про него не спросят. Есть pgx, но лучше начать с нативных инструментов языка database/sql. 4. Каждый раз явно возвращать ошибку, вспомни про тот же принцип в питоне что явное лучше не явного и забудь про try-except)
Oleg
1. Лучше написать свою реализацию разрешения зависимостей, это достаточно просто, тебе скорее всего не нужна сложная библиотека для решения твоих проблем. Да и нужно понять есть ли проблема, для большинства проектов DI не нужен. 2. Чистая архитекрута это как религия - у каждого своя, я бы не усложнял проект реализуя "свое видение чистой архитектуры", пользы от нее не так много как много хайпа. 3. За ORM в го тебя на кол посадят, во первых зачем брать быстрый язык, чтобы замедлять его какими-то орм, когда просто можно писать на абсолютно всем понятном SQL. Во вторых из-за низкой популярности орм в го горм развивается очень медленно и имеет кучу багов, тебе оно не нужно, в проде его нет, на собесах тебя про него не спросят. Есть pgx, но лучше начать с нативных инструментов языка database/sql. 4. Каждый раз явно возвращать ошибку, вспомни про тот же принцип в питоне что явное лучше не явного и забудь про try-except)
3. Да я и так работал с сырым sql, просто местами устаешь писать под каждый фильтр where запрос 4. Там удобно сделано, ты в любом месте рейзишь ошибку, а на уровне приложения перехватил и все готово😁
CatLecter
3. Да я и так работал с сырым sql, просто местами устаешь писать под каждый фильтр where запрос 4. Там удобно сделано, ты в любом месте рейзишь ошибку, а на уровне приложения перехватил и все готово😁
ну, учить орм ради решения этой проблемы это куда более когнетивно сложная задача) тратить на нее ресурсы чтобы нигде потом не использовать... короче горм это не монетизируемые знания))
Oleg
пайтон мой основной язык был долгое время, спасибо)
Сложно перейти было? Или что самое сложное было?
CatLecter
Сложно перейти было? Или что самое сложное было?
не сложно, просто 3 дня потратил на изучение синтаксиса и начал писать код в проекте с 20 миллионами пользователей) го простой) самое сложное после перехода с питона было осознать, что горутины в бизнес логике это зло, не нужно их никуда вставлять) что парадигма асинхронности другая, грубо говоря в го под капотом все IO операции и так асинхронные, в питоне ты пишешь async/await, а тут все по умолчанию асинхронное) я какое-то время пытался вместо асинхронных вызовов горутины штамповать)
CatLecter
но после пары прочитанных книг пришло осознание
CatLecter
Что значит устанешь под фильтр писать запрос? Там же не 10 файлов надо написать, а пару строк
причем в gorm много вариантов записи условия where)) как по мне легче в sql писать так уж точно))
Oleg
Что значит устанешь под фильтр писать запрос? Там же не 10 файлов надо написать, а пару строк
Есть таблица пользователей 1 Запрос я хочу за последний день кто зарегался 2 запрос кто не активировал аккаунт 3 запрос по дате рождения И тд А потом добавилась новая колонка вип клиент или нет И все запросы нужно править, добавляя эту колонку
Aleksei
причем в gorm много вариантов записи условия where)) как по мне легче в sql писать так уж точно))
Во во. Орм хороша когда видишь профит, а просто так нафиг надо
CatLecter
Есть таблица пользователей 1 Запрос я хочу за последний день кто зарегался 2 запрос кто не активировал аккаунт 3 запрос по дате рождения И тд А потом добавилась новая колонка вип клиент или нет И все запросы нужно править, добавляя эту колонку
ну это не проблема скл или орм) это проблема архитектуры, как проектировались запросы и так далее) да и утверждение что править все запросы очень спрное, в запросах нужно возвращать только те данные, которые нужны для дальнейшей обработки, а не все подряд, таким образом тебе нужно будет поправить точечно только несколько запросов, где нужно поле вип клиента) скорее всего это поле вообще добавилось потому-что оно нужно в новом юзкейсе, а не во всех подряд))
CatLecter
но собственно, если тебя волнует это так, то всегда можно использовать структуры данных как модели БД и парсить данные в струттуры из запроса
CatLecter
таким образом новое поле тебе портебуется добавить только в структуру
CatLecter
type UserDBModel struct { ID uuid.UUID `db:"user_id"` UserName string `db:"username"` FullName string `db:"full_name"` Email string `db:"email"`
CatLecter
user, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[UserDBModel])
CatLecter
или users, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[UserDBModel])
CatLecter
в общем описанная тобой проблема решается многими способами и без ОРМ
Almaz
Всем привет✋ есть пару вопросов на общие темы по It сфере. У кого есть возможность и желание поделится опытом, побесседовать, прошу написать в личку. Заранее благодарю✌️
Артём
golang
Null
1. Какой di контейнер юзать или актуальность его? 2. Чистая архитектура нужна или нет? 3. Gorm это аналог алхимии? А есть аналог asyncpg? 4. Эксепшенов тоже нет? Каждый раз нужно ошибку возвращать и проверять через стратегию? 5. Есть ссылка на стайлгайд например почему мы должны функцию называть с Must которая инициализируется при старте приоожухи и тд
1. актуальность-хуяктуальность. Я использую самописный контейнер как замену application.go, для меня это наименьшее зло. 2. Смотря что понимать под чистой архитектурой. Если брать как ее проявление гексагональную архитектуру - да, это прикольно нужно и важно, но есть и ребята, кто зовет БД из ручки - ничего с этим страшного прям у них нет. Проблемы начинаются как обычно при рефаке или на хайлоаде или в распределенных командах. 4. Можешь и не возвращать, потом гадать откуда трабл. Похожая штука на эксепшн - паника, ее тоже можно отловить, но это не го-way. 5. Стайлгайды лучше загугли, а вот Must при инициализации обычно указывает на фабрики, которые паничат, если что-то не случилось. Например, если коннект к базе не прошел, а у нас все приложение завязано на нее - сразу кинуть панику вместо пятисоток на ответ от ручек.
Rostislav
1. Лучше написать свою реализацию разрешения зависимостей, это достаточно просто, тебе скорее всего не нужна сложная библиотека для решения твоих проблем. Да и нужно понять есть ли проблема, для большинства проектов DI не нужен. 2. Чистая архитекрута это как религия - у каждого своя, я бы не усложнял проект реализуя "свое видение чистой архитектуры", пользы от нее не так много как много хайпа. 3. За ORM в го тебя на кол посадят, во первых зачем брать быстрый язык, чтобы замедлять его какими-то орм, когда просто можно писать на абсолютно всем понятном SQL. Во вторых из-за низкой популярности орм в го горм развивается очень медленно и имеет кучу багов, тебе оно не нужно, в проде его нет, на собесах тебя про него не спросят. Есть pgx, но лучше начать с нативных инструментов языка database/sql. 4. Каждый раз явно возвращать ошибку, вспомни про тот же принцип в питоне что явное лучше не явного и забудь про try-except)
она своя только у тех, кто смысла ее не понимает, который про простые истины: делай зависимости норм, чтобы не огребать при изменениях
Rostislav
1. актуальность-хуяктуальность. Я использую самописный контейнер как замену application.go, для меня это наименьшее зло. 2. Смотря что понимать под чистой архитектурой. Если брать как ее проявление гексагональную архитектуру - да, это прикольно нужно и важно, но есть и ребята, кто зовет БД из ручки - ничего с этим страшного прям у них нет. Проблемы начинаются как обычно при рефаке или на хайлоаде или в распределенных командах. 4. Можешь и не возвращать, потом гадать откуда трабл. Похожая штука на эксепшн - паника, ее тоже можно отловить, но это не го-way. 5. Стайлгайды лучше загугли, а вот Must при инициализации обычно указывает на фабрики, которые паничат, если что-то не случилось. Например, если коннект к базе не прошел, а у нас все приложение завязано на нее - сразу кинуть панику вместо пятисоток на ответ от ручек.
или когда надо добавить что-то новое, а там уже зоопарк
Alice
Всем здравствуйте! Меня зовут Алиса, представляю студию разработок Frog Studios. Мы в поиске Go разработчика! Требования: • Опыт от года • Golang, будет большим плюсом знание и опыт Python Django • PostgreSQL (оптимизация, индексы, миграции) • Опыт написания unit-тестов • Знание и умение работы со спецификацией Open API , Swagger • Docker, CI/CD Условия: удаленная рбота, фулл тайм, оклад до 150т Резюме присылать сюда: @tvoebezzymie
Segmentation
1. Какой di контейнер юзать или актуальность его? 2. Чистая архитектура нужна или нет? 3. Gorm это аналог алхимии? А есть аналог asyncpg? 4. Эксепшенов тоже нет? Каждый раз нужно ошибку возвращать и проверять через стратегию? 5. Есть ссылка на стайлгайд например почему мы должны функцию называть с Must которая инициализируется при старте приоожухи и тд
1. https://github.com/golobby/container, но только для сбора зависимостей не дальше cmd 2. Да. 3. Почти. Pgx или любой другой драйвер. В го нет разноцветных функций. 4. Да. Под стратегией хз что имеешь ввиду. 5. https://go.dev/blog/, https://google.github.io/styleguide/go/, https://github.com/uber-go/guide
CatLecter
Alex
То есть у 100% разработчиков) каждый из них говорит что остальные "не понимают смысла" 😂
Если ужать "весь смысл" до одного предложения, то это будет "зависимости направлены в одну сторону" ну или "БЛ ни от чего не зависит". Полно людей, которые это понимают. Тех, кто не понимает, к сожалению, тож полно.
Segmentation
4. https://refactoring.guru/ru/design-patterns/strategy
Я знаю что такое. Не понимаю что ты хочешь стратегировать при обработке ошибки.
Segmentation
Segmentation
Конфикт какой-то в домене… говнокод какой-то
Oleg
https://github.com/bxcodec/go-clean-arch/tree/master
Kuro
Почти 10к звезд на гитхубе
Тысячи мух не могут ошибаться..
Oleg
Тысячи мух не могут ошибаться..
Я позитивно мышлю Поэтому тысячи пчел не могут ошибаться..
Segmentation
Жаль тут нельзя лайкать
Segmentation
Я позитивно мышлю Поэтому тысячи пчел не могут ошибаться..
На гитхабе модель поедания другая, как Кафка и Кролик
Alex
https://github.com/bxcodec/go-clean-arch/tree/master
Смотрим импорты в app: помимо очевидно необходимого mysqlRepo импортируются go-sql-driver/mysql и database/sql. Что это значит? Что протекла абстракция. Потроха репы не должны использоваться вне её. В противном случае мы рано или поздно на эти потроха завязываемся, изменения вносить становится трудно.
Voo
1. Какой di контейнер юзать или актуальность его? 2. Чистая архитектура нужна или нет? 3. Gorm это аналог алхимии? А есть аналог asyncpg? 4. Эксепшенов тоже нет? Каждый раз нужно ошибку возвращать и проверять через стратегию? 5. Есть ссылка на стайлгайд например почему мы должны функцию называть с Must которая инициализируется при старте приоожухи и тд
1) Есть, но противников больше. Я один из них. 2) в природе я не видел что бы точно следовали этим "заповедям", все зависит от проекта и опыта разработчиков. Но структуры папок надо придерживаться. 3)Любая орм это плохо. Какая бы мощная не была. Не касается маленьких не хайлоад проектов. 4) Да, это методология от разработчиков. Лайк просто за это :) 5) Стайл гайдов много но в чистом виде не применяют. П.С. это все вкратце)
Roman
В защиту ORM приведу такой кейс. На странице магазина фильтр по разным характеристикам товаров, коих десятки, все поля опциональные. Как такое на бэке обрабатывать без ORM? Как такой SQL составить? Склеивать строчки в where ... and ... and ...? Это очень error-prone
Roman
Надо глянуть, спасибо
d.kim
кто-то в 2025 еще хейтит орм ?
Roman
Много кто ) Но, Я так и не понял, почему оно медленнее чем SQL. Не больший контроль, не ещё что-то, а про скорость сразу говорят. Как будто ORM из всех вариантов самый неоптимальный SQL генерит
Алексей
А кто-нибудь знает как без орм просто достать сущность + связь (например один ко многим) и сделать слайс из связанных сущностей?
d.kim
Много кто ) Но, Я так и не понял, почему оно медленнее чем SQL. Не больший контроль, не ещё что-то, а про скорость сразу говорят. Как будто ORM из всех вариантов самый неоптимальный SQL генерит
ORM очевидно накладывает определенный оверхэд, которого нет, если писать чистый SQL. но зачастую кто так говорит в итоге пишет круд на 100рпс, где все запросы это SELECT * FROM table
Roman
А что за оверхэд?
d.kim
накладные расходы
Roman
Какие именно? О чем речь?