All streams
Search
Write a publication
Pull to refresh
13
0
Сергей Роговцев @lair

Архитектор

Send message

Несколько VIEW на стороне источников и джоб на Postgres, который вычитывает их и подменяет партиции в Postgres.

...и вы при этом говорите, что у вас микросервис? Любопытно.

Больше потоков запустить нельзя - шина данных ляжет от такого объема данных.

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

Как, читая чужой код, узнать, какая из нескольких существующих реализаций интерфейса будет вызвана в рантайме?

А зачем?

А какие она даёт преимущества?

Возможность переиспользовать одного и того же потребителя с разными реализациями.

То есть, то, что "выше", потребляет (consumes) то, что ниже?

Распространяется ли это отношение на абстракции; иными словами, можно ли сказать, что модуль A потребляет (consumes) некую абстракцию из модуля Б (и в этом случае модуль А потребляет модуль Б)?

Каких случаях?

Упомянутых в коде и в последующем вопросе к нему.

И просьба задать вопрос без кода, так как код должен являться результатом применения модели / принципа, а не источником.

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

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

Да нет, в нем как раз все зависимости прекрасно видны.

Ответ на то что понимается под зависит и использует был дан выше.

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

Нет не идентично.

В каком-то из двух случаев не используются результаты деятельности?

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

Я увидел что Вам не понятна разница между использованием реализации [интерфейсов] и зависимостью

Мне-то она понятна. Но я боюсь, что то, что мне понятно, отличается от того, что понятно вам.

И это, повторюсь, подчеркивает проблему определения в статье.

Но на всякий случай использовать в рамках статьи имеется ввиду результат деятельности.

Давайте немного расширим пример.

class OrderCreationUseCase(IOrderRepository repository)
{
  void CreateOrder(string customer)
  {
    var order = new Entity.Order(customer);
    repository.Save(order);
  }
}

OrderCreationUseCase не пользуется результатами деятельности new Entity.Order? Или не пользуется результами деятельности repository.Save?

С точки зрения кода (а DIP - он про код, про отношения модулей) эти отношения идентичны, разве нет?

Нет usecase зависит от entity и использует реализации из внешнего взаимодействия.

Если в вашей терминологической системе usecase не использует entity, я, честное слово, не понимаю, что вы обозначете этим словом, и как это соотносится с бытовым пониманием.

(Потому что "очевидно что" когда usecase "использует кодовую базу непосредственно" (ваши слова), он неизбежно "использует реализацию" тоже ваши слова. Вот в обратную сторону возможны варианты. А в эту - нет.)

И это как раз и демонстрирует неоднозначность определения в статье.

Нет он от него зависит

Цитирую ваш же текст (выделение мое):

оцифровываю их в виде юзекйса, в котором я описываю 2 интерфейса: для генерации ид и сохранения заказа в хранилище и две структуры входной и выходной параметр. Попутно я пользую модель заказа из энтити.

Это слово означает что-то другое, не использование?

Просто если я пойду к произвольному знакомому мне разработчику и покажу ему вот такой код

namespace UseCase
{
  void CreateOrder(string customer)
  {
    var order = new Entity.Order(customer);
  }
}

я услышу в ответ, что UseCase.CreateOrder использует Entity.Order и зависит от него же.

В вашей терминологической системе не так?

То есть usecase использует и entity, и внешнее взаимодействие?

Почему никого ге смущает, что модуль нижнего уровня зависит от модуля верхнего уровня?

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

однако, меня сильно смущает, что теперь модуль, в котором находится В не может существовать без модуля, где поселился А и интерфейс, по той простой причине, что В должен реализовывать этот самый интерфейс ?!

Именно поэтому в описании принципа есть фраза "Оба модуля должны зависеть от абстракций", которую автор поста почему-то проигнорировал.

Тут есть зависит.

Я явным образом спрашиваю про "использует". Вот у вас есть пример с тремя слоями:

Самый высокий уровень - entity (если вы его используете)
Затем usecase он зависит от entity. Фактически тут определяется львиная доля бизнес логики.
Затем внешнее взаимодействие - самый низкий из 3х основных. Для уточнения это уровень внешнего представления и репозиториев.

если мы возьмем определение из поста, в котором есть слово "использует"

Модуль верхнего уровня (далее МВУ) — это модуль, который в конечном итоге использует реализацию другого модуля. Можно провести аналогию из природы: модуль верхнего уровня — это модуль, который находится выше в «пищевой цепочке», т.е. потребляет (имеет внутри себя) код другого модуля.

и применим это слово "использует" к вашему примеру, какие будут ответы на два этих вопроса:

  • usecase использует entity, или нет?

  • usecase использует внешнее взаимодействие, или нет?

В теле сатьи есть определения МВУ и МНУ. Они чётко дают понимание терминов выше и ниже.

Для меня - не дают. Потому что они опираются на слово "используют", которого я в этом контексте не понимаю, и поэтому и спрашиваю на конкретном примере:

Самый высокий уровень - entity (если вы его используете)
Затем usecase он зависит от entity. Фактически тут определяется львиная доля бизнес логики.
Затем внешнее взаимодействие - самый низкий из 3х основных. Для уточнения это уровень внешнего представления и репозиториев.

В этом конкретном перечислении

  • usecase использует entity, или нет?

  • usecase использует внешнее взаимодействие, или нет?

Кстати, само по себе слово "использует"-то понятно. Проблема в том, что в приведенном вами выше примере средний слой (use-case) "использует" и entity, и внешнее взаимодействие. И это само по себе нормально, проблема только в том, что в этот момент нельзя употреблять слово "использует" для отношения "выше-ниже" (или надо признать, что этот слой "выше" остальных).

Что такое формально определить?

Привести определение, которое будет однозначно понято всеми сторонами обсуждения.

Есть ли непротиворечивый пример?

Да. Можно говорить, что модуль А "выше" модуля Б по уровню, если модуль А зависит от модуля Б (где "А зависит от Б" - это кодовая зависимость в терминах используемых технологий, т.е. А нельзя "скомпилировать" без Б).

Ибо выше и ниже чётко определяется в статье.

Статья сама себе противоречит, как я уже писал выше, так что нет, не определяется.

Не понимаю сути вопроса.

Суть вопроса очень проста: как формально определить, какой модуль "выше", чем другой.

Тут появляется очень много имхо ненужной конкретики: инфраструктура,

Инфраструктура - это один из ваших слоев (третий, если быть точным, вы его назвали "внешнее взаимодействие"). Это не "ненужная конкретика".

Использует ли слой "внешнего взаимодействия" слои use-case и entity? Опираясь на ваше же определение ниже, "обращается" ли слой внешнего взаимодействия к слоям use-case и entity?

Что такое "использует"?

На простом примере: когда инфрастуктура читает из БД сущность, она (по крайней мере, в большей части известных мне реализаций) явно вызывает код этой сущности: конструктор, сеттеры, возможно какие-то еще методы. Значит ли это, что инфраструктура использует сущность?

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

Information

Rating
Does not participate
Location
Montreal, Quebec, Канада
Date of birth
Registered
Activity