Size: a a a

2020 July 20

МП

Мимо Проходящий... in Go-go!
Aikidos
Самый лучший принцип разработки, "нормально делай, нормально будет". Лучше ещё не придумали.
+1
источник

AK

Anton Kucherov in Go-go!
Никита
Да, в джаве ок, там иначе нельзя. Но в Го та же проблема: функцию то сделать можно, но как нам это скрыть за интерфейсом? Может есть какой-то ФПшный подход (а он наверняка есть), чтобы “мокать” конкретные функции, но я не знаю его (
В Go функции можно передавать как аргументы. И использовать в качестве типа подставляя потом туда любую функцию которая удовлетворяет определению
источник

ЛА

Локоть Анатолий... in Go-go!
Мимо Проходящий
Не надо анализ. Я употребил слово вкратце. Ну gzip решается элементарно, start/stop достаточно на уровне сервера. Устойчивость к конкурентному использованию и депрекейтед решения - это как?
Короче либа должна быть полностью thread safe.
Если я по ошибке стартую рутину процессинга ивентов из двух потоков, я должен получить консистентное состояние данных
источник

Н

Никита in Go-go!
Aikidos
S постоянно нарушается. Потому что каждый формулирует, что такое ответственность и где проходят её рамки, сам.
Так то да. Но вот для примера: у меня есть Gateway для пользовательских сообщений, например. В нем есть банальные CRUD методы в базу и метод на подписку новых публикаций, для лайв апдейта ленты, и реализован он через очередь. И, например, метод Update() и метод Subscribe() меняются по разным причинам – из-за реализации внутри. А так нам приходится в одном классе Gateway шарить инстанс на базу и на очередь, хотя Subscribe база не нужна, а остальным операциям не нужна очередь
источник

AK

Anton Kucherov in Go-go!
Aikidos
Самый лучший принцип разработки, "нормально делай, нормально будет". Лучше ещё не придумали.
Это просто общая фраза которая ни на какой принцип не тянет. Она настолько общая, что лишена вообще какого либо смысла.
источник

A

Aikidos in Go-go!
Anton Kucherov
Это просто общая фраза которая ни на какой принцип не тянет. Она настолько общая, что лишена вообще какого либо смысла.
Как и S.
источник

ЕА

Егор Андреевич... in Go-go!
Никита
Так то да. Но вот для примера: у меня есть Gateway для пользовательских сообщений, например. В нем есть банальные CRUD методы в базу и метод на подписку новых публикаций, для лайв апдейта ленты, и реализован он через очередь. И, например, метод Update() и метод Subscribe() меняются по разным причинам – из-за реализации внутри. А так нам приходится в одном классе Gateway шарить инстанс на базу и на очередь, хотя Subscribe база не нужна, а остальным операциям не нужна очередь
источник

AK

Anton Kucherov in Go-go!
Aikidos
Как и S.
Нет. Нарушение S все таки можно увидеть. К примеру когда функция выглядит как: func DoBarAndBuz() или func DoFooOrBar.
А "нормально" оно у каждого свое.
источник

A

Aikidos in Go-go!
Никита
Так то да. Но вот для примера: у меня есть Gateway для пользовательских сообщений, например. В нем есть банальные CRUD методы в базу и метод на подписку новых публикаций, для лайв апдейта ленты, и реализован он через очередь. И, например, метод Update() и метод Subscribe() меняются по разным причинам – из-за реализации внутри. А так нам приходится в одном классе Gateway шарить инстанс на базу и на очередь, хотя Subscribe база не нужна, а остальным операциям не нужна очередь
У нас бы это разделилось на репозиторий и отдельно на сервис уведомлений о новых сообщениях и всё такое. В одном бы всё не было.
источник

МП

Мимо Проходящий... in Go-go!
Anton Kucherov
- Все принципы SOLID несколько лет назад были обоснованы с использованием Логики Хоара (Можете найти обоснование и попробовать его научными методами опровергнуть)
- Вся суть Clean Architecture строится вокруг идеи "Высокоуровневый код не должен зависеть он низкоуровнего" (За редким исключением при необходимости узких оптимизаций. И этот принцип можно встретить в огромной куче существующих IT систем разных мастей)
- То что очевидно одним не очевидно другим.
- Абсолютно не имеет значения как разбивать код по папкам, если соблюдено правило зависимостей и абстракции не текут.
"Высокоуровневый код не должен зависеть он низкоуровнего" - вот это и есть банальщина, о которой я говорил. И решается оно интерфейсами го, а не абстрактными общими рекомендациями за всё хорошее.

"То что очевидно одним не очевидно другим" - вот не надо всех считать тупыми, кто не разделяет ваших взглядов. Почитайте статью, на которую я ссылку давал
источник

Н

Никита in Go-go!
Anton Kucherov
В Go функции можно передавать как аргументы. И использовать в качестве типа подставляя потом туда любую функцию которая удовлетворяет определению
Я думал вызывать методы прямо из импортируемого пакета. Например, была у нас структура PaymentGateway с методом Process. А сделал бы отдельно функцию Process, которая принимает PaymentGateway, и все это в пакете payments. И там, где нужно делать пейменты, я бы импортировал пакет payments, и дергал оттуда функцию Process, в которую передавался бы PaymentGateway, прокинутый уровнями выше.

Не знаю, нормально ли так, или это нечто неподобное
источник

Н

Никита in Go-go!
Aikidos
У нас бы это разделилось на репозиторий и отдельно на сервис уведомлений о новых сообщениях и всё такое. В одном бы всё не было.
Контекстно они связаны сообщениями, мне кажется, что один класс тут бы смотрелся логичнее.
источник

Н

Никита in Go-go!
Меня и так совсем напрягает, что когда у тебя десятки сущностей, и на каждую свой сервис, репозиторий, и тд, в main происходит чудовищная по виду простыня инжектов
источник

A

Aikidos in Go-go!
Anton Kucherov
Нет. Нарушение S все таки можно увидеть. К примеру когда функция выглядит как: func DoBarAndBuz() или func DoFooOrBar.
А "нормально" оно у каждого свое.
Никогда таких функций не видел, но видел что-то вроде имплементаций,для примера возьмём, File, который работает с файлом. Пишет, читает, перемещает. Это нарушение S? Или писать в файл должен кто-то один, а читать кто-то другой? По практике да, разделяют. Но ведь если всё собрать в одну реализацию, то тоже вроде как S не нарушен. Зона ответственности - работа с файлом. Как определить тут? Функции в вакууме удобны для рассмотрения, но на практике жаркие споры где S нарушен постоянны.

У одного моего знакомого, в проекте нет интерфейсов больше 1 метода. Потому что там S маниакально преследуют.
источник

AK

Anton Kucherov in Go-go!
Мимо Проходящий
"Высокоуровневый код не должен зависеть он низкоуровнего" - вот это и есть банальщина, о которой я говорил. И решается оно интерфейсами го, а не абстрактными общими рекомендациями за всё хорошее.

"То что очевидно одним не очевидно другим" - вот не надо всех считать тупыми, кто не разделяет ваших взглядов. Почитайте статью, на которую я ссылку давал
Если это банальщина, объясните тогда наличие оргромного кол-ва кода где практически полностью отсутствуют какие либо интерфейсы и он запутан так, что любое изменение может привести к падению приложения в абсолютно несвязанном с правкой месте?

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

VM

Vladislav Milenin in Go-go!
Anton Kucherov
Если это банальщина, объясните тогда наличие оргромного кол-ва кода где практически полностью отсутствуют какие либо интерфейсы и он запутан так, что любое изменение может привести к падению приложения в абсолютно несвязанном с правкой месте?

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

Н

Никита in Go-go!
Мимо Проходящий
"Высокоуровневый код не должен зависеть он низкоуровнего" - вот это и есть банальщина, о которой я говорил. И решается оно интерфейсами го, а не абстрактными общими рекомендациями за всё хорошее.

"То что очевидно одним не очевидно другим" - вот не надо всех считать тупыми, кто не разделяет ваших взглядов. Почитайте статью, на которую я ссылку давал
Как минимум простой независимости от фреймворков встретить можно не везде. Django/RoR как стиль жизни
источник

AK

Anton Kucherov in Go-go!
Vladislav Milenin
в небольших кодовых базах интерфейсы крайне редко нужны
В любых кодовых базах где требования не ясны или бизнес не совсем хорошо понимает домен нужны интерфейсы. Иначе вы в конце концов придете к 2 финалам:
1) Выбросить и переписать все с нуля
2) Мы такого не закладывали, это невозможно
источник

A

Aikidos in Go-go!
Никита
Контекстно они связаны сообщениями, мне кажется, что один класс тут бы смотрелся логичнее.
Можно и один сделать, если так удобно. Код должен быть понятен, покрываться тестами и всё такое. Остальное я уже давно не преследую. Субъективно всё это.
источник

МП

Мимо Проходящий... in Go-go!
Anton Kucherov
Если это банальщина, объясните тогда наличие оргромного кол-ва кода где практически полностью отсутствуют какие либо интерфейсы и он запутан так, что любое изменение может привести к падению приложения в абсолютно несвязанном с правкой месте?

Я не считаю ни кого тупым, я имел ввиду то, что у всех разработчиков совершенной разный опыт. И это нормально знать одни вещи и не знать других.
Объяснение - х-х-ивпродакшон-дривен-девелопмент. Чистая архитектура тут ни особо что решает.
источник