Re[6]: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 14.01.21 14:26
Оценка: +1
Здравствуйте, vsb, Вы писали:

vsb>Поздравляю, вы только что показали пример использования паттерна Dependency Injection.


У ТС претензии вроде как не к самому DI, а к фреймворкам и контейнерам. Не?
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 14.01.21 14:31
Оценка:
Здравствуйте, Somescout, Вы писали:

IT>>А раз так, то как же можно получить информацию о кастомере без DI фреймворка и пары IoC контейнеров? Никак не можно.

S>Кстати, а если действительно никак не можно — например информация о кастомере разбросана по нескольким сервисам?

И как тут поможет DI фреймворк?
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: О пользе Dependency Injection
От: microuser  
Дата: 14.01.21 14:32
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Здравствуйте, microuser, Вы писали:


M>>Как это читаемость будет меньше при большем количестве ничего не делающего кода?


ARK>Во-первых, количество кода не обязано быть больше. Это утверждение — не аксиома и нуждается в обосновании.

ARK>Во-вторых, читаемость зависит не только от количества кода.

M>>Еще раз говорю, покажите реальный проект без DI или хотя бы CRUD заготовку.


ARK>Любой (почти) проект на гитхабе бери, там DI не будет никакого.


Ну взял первый попавшийся, DI на месте:

https://github.com/asc-lab/dotnetcore-microservices-poc/blob/master/PricingService/Commands/CalculatePriceHandler.cs

CalculatePriceHandler нигде руками не создается, так же как и его зависимость IDataStore, все достается из контейнера. Теперь ваша очередь, покажите любой CRUD проект без DI.
Re[8]: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 14.01.21 14:52
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Я аообще не понял о чем собственно спор, вот яркий пример и заодно определение


AA>https://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java


Классный пример. На первый взгляд код с DI получается короче. Но если внимательно присмотреться, то можно заметить, что код без DI самодостаточен и понятен, а краткость без DI достигается банальным опусканием реализации некоторых объектов Даже в таком мелком примере умудрились всё запутать
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: О пользе Dependency Injection
От: AlexRK  
Дата: 14.01.21 14:55
Оценка:
Здравствуйте, microuser, Вы писали:

M>Ну взял первый попавшийся, DI на месте:

M>https://github.com/asc-lab/dotnetcore-microservices-poc/blob/master/PricingService/Commands/CalculatePriceHandler.cs
M>CalculatePriceHandler нигде руками не создается, так же как и его зависимость IDataStore, все достается из контейнера. Теперь ваша очередь, покажите любой CRUD проект без DI.

Откуда-то взялось дополнительное условие "CRUD-проект".
Ну вот первый попавшийся: https://github.com/dlang/dmd/tree/master/src/dmd
Догадываюсь, что это не "CRUD-проект" (что бы это ни значило), но подозреваю, что сложность его на пару порядков больше, чем типичного "круда". Однако, почему-то напрямую вызываются конструкторы, без всяких инъекций.
Re[6]: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 14.01.21 14:59
Оценка:
Здравствуйте, microuser, Вы писали:

M>Хотелось бы real life пример бизнес приложения, или хотя бы CRUD hello world без DI.


Давай ты нам приведёшь такой пример с DI, а мы его переделаем без DI.
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 14.01.21 15:05
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>>Ок, простой пример: на веб странице компонент должен выводить имя текущего пользователя. Он должен его откуда-то получить: либо вы при рендеринге каждой страницы прокидываете эту информацию ему вручную, либо компонент так или иначе (через DI, репозиторий, синглтон) получает эту информацию сам.

S>Ну это же прекрасный пример. Через три-четыре релиза у нас в топ жалоб выезжает "ваше приложение нещадно тормозит", привлекается команда высокооплачиваемых экспертов, которые после трёх месяцев расчистки конюшен констатирует очевидное: "у вас там каждая кнопка в гуе считает, что ей нужно лазить в базу/сторонний сервис/ещё куда-то, в итоге для построения одного экрана открывается 27 коннектов к базе, и исполняется более трёхсот SQL-запросов. Из них треть дублируют друг друга, а половина, хоть и не совпадает, может быть покрыта одним из более широких запросов". Рекомендация экспертов: "чётко разделить фазы построения гуя, доставая данные из базы минимальным количеством запросов и передавая визуальным компонентам готовую viewModel".

А DI то тут причем? Не вижу связи с оптимизацией sql запросов, что правильно, и DI. Тоже самое отменно может быть
и без плюшек DI.
Кодом людям нужно помогать!
Re[13]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 14.01.21 15:17
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Это все как раз про DI. Особенно читаемость — она там где-то в районе нуля.


Ну тормоза то будут на старте, при создании графов объектов.

ARK>Плюс лишние тормоза и еще потеря статической типизации в точке получения объекта.


Не будет там потери, просто меньше компилятора предупреждений от компилятора переедут в
падение во время исполнения -- при запуске, например. Я выше ссылку на SO привел. Т.е.
если где-то чего-то не хватает, мы узнаем только при запуске.
Кодом людям нужно помогать!
Re[10]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 14.01.21 15:19
Оценка:
Здравствуйте, AlexRK, Вы писали:

S>>То, что в недрах гуя нет простого доступа к DBConnection — это хорошо, а не плохо. Так что нам не нужно средство, которое даёт эту невыносимую лёгкость сделать "а шандарахну-ка я тут запросец в базу".

ARK>Плюс адин. Провоцирует на повышение связности на ровном месте. В результате на выходе Big Ball of Mud.

Нет, провоцирует сложность конфигурации и т.п. Связность как была низкой -- по интерфейсам -- так и осталось.
Кодом людям нужно помогать!
Re[5]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 14.01.21 15:22
Оценка:
Здравствуйте, TG, Вы писали:

TG>>>Или получается, что DI полезен только вот в таких "хитрых" архитектурах?

S>>Что "хитрого" в такой архитектуре?
TG>Фраза "Допустим мне в глубинах компонентов понадобился доступ к базе" намекает, что при проектировании несколько подзабыли принципы SOLID, разделение на слои и т.д. И если сделано это осознанно, то было бы опять же интересно посмотреть на конкретный кейс.

Скорее про DDD какое-нибудь забыли\отступись, а доступ в глубинах компонентов к бд можно и по SOLID сделать.
Кодом людям нужно помогать!
Re[7]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 14.01.21 15:30
Оценка:
Здравствуйте, IT, Вы писали:

S>>Это, вобще-то, и есть dependency injection. Только вы это вручную делаете, и фактически переносите проблемы на уровень выше: теперь вызывающий код в обязательном порядке должен иметь ссылку на базу (напрямую или через DatabaseHelper), и сам должен получить userDao — что поменялось в итоге от такой перетасовки? Ничего — все проблемы ровно на том же месте.

IT>Как минимум поменялось то, что теперь это всё делается явно. Не надо гадать кто, где, когда, зачем. Этот код можно перенести в другой проект и он либо будет работать, либо не скомпилируется. А в случае с контейнерами он скорее всего скомпилируется, но работать не будет.

Вроде договорились, что серебряной пули не существует. Программист может абстрагироваться от кучи
реализаций абстракций, их конфигурации и т.п., а просто будет работать с тем, что есть, т.е. дадут\сконфигурируют.
Кодом людям нужно помогать!
Re[17]: О пользе Dependency Injection
От: microuser  
Дата: 14.01.21 15:31
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Здравствуйте, microuser, Вы писали:


M>>Ну взял первый попавшийся, DI на месте:

M>>https://github.com/asc-lab/dotnetcore-microservices-poc/blob/master/PricingService/Commands/CalculatePriceHandler.cs
M>>CalculatePriceHandler нигде руками не создается, так же как и его зависимость IDataStore, все достается из контейнера. Теперь ваша очередь, покажите любой CRUD проект без DI.

ARK>Откуда-то взялось дополнительное условие "CRUD-проект".

ARK>Ну вот первый попавшийся: https://github.com/dlang/dmd/tree/master/src/dmd
ARK>Догадываюсь, что это не "CRUD-проект" (что бы это ни значило), но подозреваю, что сложность его на пару порядков больше, чем типичного "круда". Однако, почему-то напрямую вызываются конструкторы, без всяких инъекций.

Конечно не CRUD и естественно здесь никакой DI не нужен. Просто потому что здесь сложности в создании объектов никакой нет, их тут всего штук 50(судя по количеству файлов) и они не меняются так как бизнес логики нет, а новые будут добавляться лишь изредка. По большому счету компилятор это функция которой на вход подаются исходники, а на выходе исполняемый файл. DI нужен в "энтерпрайз" разработке, где куча разнообразной логики которая имеет свойство часто меняться, это приводит к тому что меняются сигнатуры конструкторов, их зависимости и т.д.
Re[8]: Бизнес приложение
От: Sharov Россия  
Дата: 14.01.21 15:33
Оценка:
Здравствуйте, Министр Промышленности, Вы писали:

МП>в таком описании становится понятно, что оставление DI в проекте есть ни что иное как технических долг...

МП>просто по завершении работ по быстро обновимшимся требованиям забили болт на реформирование структуры классов по сборкам

Скорее гарантия гибкости и производительности программиста -- не надо разбираться с кучей сервисов, их
отличий, особенностей и т.п. , а просто "заказать" себе текущую реализацию (интерфейс) и плясать от нее.
Кодом людям нужно помогать!
Re[3]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 14.01.21 15:49
Оценка:
Здравствуйте, TG, Вы писали:

TG>А почему оставим-то? Это очень интересный вопрос.

TG>Или получается, что DI полезен только вот в таких "хитрых" архитектурах?
TG>А если что-то пилить с нуля, то можно и обойтись без DI?

Наверное, даже нужно. Но если все это разрастется до энтерпрайза с постоянно меняющимися требования,
тогда придется использовать DI.
Кодом людям нужно помогать!
Re[6]: О пользе Dependency Injection
От: Poopy Joe Бельгия  
Дата: 14.01.21 16:19
Оценка:
Здравствуйте, microuser, Вы писали:

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

M>Все это вопросы архитектуры, а DI фреймворк лишь берет на себя ответственность за создание экземпляров объектов, работать он может в любой архитектуре.
M>Хотелось бы real life пример бизнес приложения, или хотя бы CRUD hello world без DI.

Ну наше приложения я, естественно, тебе показывать не могу, а рыться по гитхабу не буду.
Но я тебе могу предложить кое-что лучше — целая статья на эту тему, где все разжевано на пальцах. https://fsharpforfunandprofit.com/posts/dependencies/
Re[8]: О пользе Dependency Injection
От: barn_czn  
Дата: 14.01.21 16:35
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Здравствуйте, barn_czn, Вы писали:


_>>Конкретный пример пож-та, чтобы спор был не абстрактным.


AA>И да, еще больше примеров в книжке "Роберт Мартин — Чистая архитектура — 2018", после ее прочтения сомнения отпадают.

AA>Так или иначе зависимости будут, использовать для этого ФВ или делать свой велосипед это уже от архитектора зависит.
AA>Хотя да, большинство проектов на C# это монолиты.

причем тут c#? а на ява или с++ ни монолиты? Большинство проектов.. учитывая популярность Unity сейчас можно сказать что большинство проектов на шарпе — полный гавнокод от школьников. Шарп тут не причем как ЯП.

AA>В корэ использую стандартный DI очень доволен. можно в любом месте приложения получить ссылку на любой объект не задумываясь.


AA>https://github.com/altbodhi/HostAppExample/blob/master/Program.cs



Все равно ни понял. Контексты всегда были и без DI (Control.Parent, Control.Application, Request.Host и т.д). Добирайся нихочу.
Но вот если есть конструктор у App, а я явно не вижу место его вызова — меня это напрягает. Таких неявных мест должно быть по минимуму.
Re[4]: О пользе Dependency Injection
От: C0s Россия  
Дата: 14.01.21 20:57
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я такое при возможности выкорчёвываю нещадно. На самом деле есть очень простой и эффективный критерий правильно написанной бизнес логики. Если логически законченный функционал бизнес логики легко извлекается из одного проекта и спокойно переносится в другой, то это правильно написанная бизнес логика. Если же для переезда в соседний дом нужно перетащить с собой весь подъезд, то это не код, а кусок оверинжениринга.


для переиспользования бизнес-логики нужна интеграция, а не копирование (репо, артефактов, классов...). последствия последнего объяснять, думаю, не надо.
и, бинго, даже интеграция делается через некий интерфейс. в случае необходимости его версионирования вводится политика EOL по каждой версии.
Re[6]: О пользе Dependency Injection
От: · Великобритания  
Дата: 14.01.21 21:21
Оценка: +1
Здравствуйте, vsb, Вы писали:

vsb> Поздравляю, вы только что показали пример использования паттерна Dependency Injection.

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

vsb> Которые разрастутся в сотни и тысячи строк однотипного скучного кода в реальном приложении с десятками-сотнями объектов

Точно. А вот конфигуации прямо таки веселье и праздник!
avalon/2.0.6
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: О пользе Dependency Injection
От: Somescout  
Дата: 14.01.21 21:25
Оценка:
Здравствуйте, IT, Вы писали:

IT>Какая прелесть! А кто мешает один раз написать для базы данных какой-нибудь рапер/хелпер, который будет решать все эти вопросы без DI?


Ок, напишу я его, а прокинуть его как? И я опять же не понимаю: зачем "решать эти вопросы без DI" — как это облегчает работу?
ARI ARI ARI... Arrivederci!
Re[7]: О пользе Dependency Injection
От: C0s Россия  
Дата: 14.01.21 21:30
Оценка: +3
Здравствуйте, Sinclair, Вы писали:

S>Ну это же прекрасный пример


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