Re[18]: О пользе Dependency Injection
От: · Великобритания  
Дата: 19.01.21 10:28
Оценка: 3 (1) +1
Здравствуйте, takTak, Вы писали:

T>все разговоры в этой теме от банального непонимания, для чего придумали DI / IoC

Это верно.
А придумали контейнеры для сборки монструозных монолитных enterprise приложений из крупных отдельно поставляемых компонент, плагинной архитектуры, внутри так называемых application servers.
  Вот тут очень хорошее объяснение для кого это нужно и как использовать.

Но это многе не понимают, и даже когда пишут микросервис из 5 классов, втыкают туда контейнер, "ибо надо". Но объяснить для чего — не могут.

T>ну так вот тебе надо ПРОТЕСТИРОВАТЬ, что схема базы данных, используемая твоим кодом, актуальна, например,

А ещё многие не понимают разницу между выделением интерфейсов, IoC, DI, контейнерами.

T>как ты с твоим этим кодом будешь писать код, который это проверяет?

var mainService = new MainService(new InMemoryProvider());
...
testThis(mainService);
testThat(mainService);
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: О пользе Dependency Injection фреймворков
От: takTak  
Дата: 19.01.21 10:36
Оценка:
МП>>>кто-то может популярно расписать преимущества либо природу явления популярности?
МП>>>(часть плюсов знаю и гипотезы-то я имею, но мнение всё равно такое)

T>>покажи просто, как ты собираешься поддерживать систему, над которой работали и 10 лет назад (и все эти люди уже уволились) и позавчера пара практикантов, а сегодня надо приделать какую-то фичу тебе и ты эту систему увидел в первый раз


TG>Встречный закономерный вопрос: как в этом случае поможет DI?

TG>И можно пример кода, пожалуйста.

система при DI делится на кучу заменямых компонентов, так что сделанные изменения проще тестировать,

если все прошлые изменения покрыты тестами (а когда есть DI, это сделать в разы проще), то прогонка этих же регрессионных тестов может указать на явные ошибки, когда ни тестов ни нет, то поддержка по становится чем-то вроде ходьбы по канату на высоте 100 метров без страховки

применимо это к так называемым оо — системам, при фунциональщине тесты базируются на иной парадигме, там композиция делается по-другому
Re[19]: О пользе Dependency Injection
От: Буравчик Россия  
Дата: 19.01.21 10:42
Оценка: +1 :)
Здравствуйте, ·, Вы писали:

·>А ещё многие не понимают разницу между выделением интерфейсов, IoC, DI, контейнерами.


Да, в этом топике идет спор и про DI vs не-DI, и про "Pure DI" vs "DI Container".

Все спорят со всеми (в общем, срач), ценную информацию найти весьма сложно
Best regards, Буравчик
Отредактировано 19.01.2021 10:58 Буравчик . Предыдущая версия .
Re[19]: О пользе Dependency Injection
От: takTak  
Дата: 19.01.21 10:48
Оценка:
T>>все разговоры в этой теме от банального непонимания, для чего придумали DI / IoC
·>Это верно.
·>А придумали контейнеры для сборки монструозных монолитных enterprise приложений из крупных отдельно поставляемых компонент, плагинной архитектуры, внутри так называемых application servers.

о чём ты вообще? идея юнит-тестирования намного старше веб-серверов...
·>Но это многе не понимают, и даже когда пишут микросервис из 5 классов, втыкают туда контейнер, "ибо надо". Но объяснить для чего — не могут.

T>>ну так вот тебе надо ПРОТЕСТИРОВАТЬ, что схема базы данных, используемая твоим кодом, актуальна, например,

·>А ещё многие не понимают разницу между выделением интерфейсов, IoC, DI, контейнерами.

T>>как ты с твоим этим кодом будешь писать код, который это проверяет?

·>
·>var mainService = new MainService(new InMemoryProvider(), new Configuration(), new IdentityProvider(Thread.Current.Identity), new FileManager() , new EmailSerice(new SmtrAddress(25.145.789), etc.));
·>...
·>testThis(mainService);
·>testThat(mainService);
·>


этот код показывает, что ты ни разу правильно не написал тестового кода с использованием DI, правильно было бы так:


·>
 >Container.Register<InMemoryProvider, IDbProvider> (); // и 5 других зависимостей мне трогать не надо
·>var mainService = Container.Resolve<MainService> ();
·>...
·>testThis(mainService);
·>testThat(mainService);
·>
Отредактировано 19.01.2021 11:10 takTak . Предыдущая версия .
Re[20]: О пользе Dependency Injection
От: · Великобритания  
Дата: 19.01.21 11:34
Оценка:
Здравствуйте, takTak, Вы писали:

T>>>все разговоры в этой теме от банального непонимания, для чего придумали DI / IoC

T>·>Это верно.
T>·>А придумали контейнеры для сборки монструозных монолитных enterprise приложений из крупных отдельно поставляемых компонент, плагинной архитектуры, внутри так называемых application servers.
T> о чём ты вообще? идея юнит-тестирования намного старше веб-серверов...
"веб-сервер" я не говорил, не приписывай мне ложные высказывания.
Для юнит-тестирования контейнер не нужен тоже, чаще даже вреден. Нужен DI.

T>>>как ты с твоим этим кодом будешь писать код, который это проверяет?

T>·>var mainService = new MainService(new InMemoryProvider(), new Configuration(), new IdentityProvider(Thread.Current.Identity), new FileManager() , new EmailSerice(new SmtrAddress(25.145.789), etc.));
T>·>...

Ты предлагаешь посылать письма и писать файлы из тестов? Особенно весело бороться в тестах с многопоточкой. Нет, в тестахм добрая половина этих зависимостей будут тестовые реализации.

А для второй половины — если же ты хочешь потестировать интеграцию MainService с какими-то фиксированными зависимостями, которые так же используются и в реальном приложении тоже, просто делаешь классическую композицию и у тебя получается переиспользуемый модуль со своими зависимостями, например что-то типа такого:
class MainServiceModule
{
  MainService service;
   
  MainServiceModule(DbProvider dbProvider, EmailService emailService)
  {
     service = new MainService(dbProvider, configuration, new IdentityProvider(Thread.Current.Identity), new FileManager(), emailService);
  }
}


T>этот код показывает, что ты ни разу правильно не написал тестового кода с использованием DI, правильно было бы так:

Такой код я писал, конечно. Но с тех пор кое-чему научился.

T>>Container.Register<InMemoryProvider, DbProvider> ()

Это не DI, это контейнер. Разберись в конце-концов что такое DI.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[21]: О пользе Dependency Injection
От: takTak  
Дата: 19.01.21 11:45
Оценка:
T>>>>все разговоры в этой теме от банального непонимания, для чего придумали DI / IoC
T>>·>Это верно.
T>>·>А придумали контейнеры для сборки монструозных монолитных enterprise приложений из крупных отдельно поставляемых компонент, плагинной архитектуры, внутри так называемых application servers.
T>> о чём ты вообще? идея юнит-тестирования намного старше веб-серверов...
·>"веб-сервер" я не говорил, не приписывай мне ложные высказывания.
ой, насмешил... твой сервер приложений ещё моложе, чем веб-сервера
·>Для юнит-тестирования контейнер не нужен тоже, чаще даже вреден. Нужен DI.
ну ка покажи, как ты собираешься делать DI без Ioc контейнера


T>>>>как ты с твоим этим кодом будешь писать код, который это проверяет?

·>
T>>·>var mainService = new MainService(new InMemoryProvider(), new Configuration(), new IdentityProvider(Thread.Current.Identity), new FileManager() , new EmailSerice(new SmtrAddress(25.145.789), etc.));
T>>·>...
·>


·>Ты предлагаешь посылать письма и писать файлы из тестов? Особенно весело бороться в тестах с многопоточкой. Нет, в тестахм добрая половина этих зависимостей будут тестовые реализации.


ты сам назвал сервис "Main", а теперь на меня обижаешься ? в том-то и дело, что в одном случае у тебя его в твоём тесте даже инициировать толком не получится, а в моём варианте инициализация и тестового и продуктивного кода выглядит почти одинаково, с одним лишь отличием, что я подменяю то, что тестирую и вызываю тем, что меня в тесте интересует

·>А для второй половины — если же ты хочешь потестировать интеграцию MainService с какими-то фиксированными зависимостями, которые так же используются и в реальном приложении тоже, просто делаешь классическую композицию и у тебя получается переиспользуемый модуль со своими зависимостями, например что-то типа такого:

·>
·>class MainServiceModule
·>{
·>  MainService service;
   
·>  MainServiceModule(DbProvider dbProvider, EmailService emailService)
·>  {
·>     service = new MainService(dbProvider, configuration, new IdentityProvider(Thread.Current.Identity), new FileManager(), emailService);
·>  }
·>}
·>


ну это уже тонкости, как ты там назовёшь: модуль , сервис или ещё как...

T>>этот код показывает, что ты ни разу правильно не написал тестового кода с использованием DI, правильно было бы так:

·>Такой код я писал, конечно. Но с тех пор кое-чему научился.

T>>>Container.Register<InMemoryProvider, DbProvider> ()

·>Это не DI, это контейнер. Разберись в конце-концов что такое DI.

так давай, покажи написанный на твоёй коленке DI без контейнера, мы его оценим
Re[13]: О пользе Dependency Injection
От: Буравчик Россия  
Дата: 19.01.21 12:28
Оценка: 6 (1) +2
Здравствуйте, Министр Промышленности, Вы писали:

МП>все аргументы которые ему нужны он попросит как входящие аргументы

МП>причем эти все аргументы наверняка будут примитивными типами, типа строк и чисел

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

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

А в проектах с DI ты делаешь изменение в одном месте — в composition root.

МП>чтобы его вызвать нужно будет вначале явно задействовать логику по прочтению конфигурации/обращению к базе данных и т.п. для получения значений


Это вообще ужас. Мало того, что нужно передавать 100 параметров, так еще каждый раз когда мы вызываем этот хелпер, мы должны каким-то способом обратиться к БД.

Но для работы с БД, нам нужна connection string и прочие параметры БД. Откуда мы возьмем их? Опять вызовем хелпер, чтобы вызвать другой хелпер? В общем, получается лапша хелперов.

Чтобы убрать эту лапшу поступают просто — объекты делают глобальными (конфигурация, контекст БД и т.п.). И рано или поздно проявляются проблемы работы с глобальными переменными.

МП>по мне так это структура программы здорового человека

МП>она будет явной, поддерживаемой и развиваемой

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

Именно эта независимость частей системы придает системе гибкость, и это же добавляет сложности. Просто с ней работать нужно немного иначе.
Best regards, Буравчик
Re[22]: О пользе Dependency Injection
От: · Великобритания  
Дата: 19.01.21 12:30
Оценка:
Здравствуйте, takTak, Вы писали:

T>>>·>А придумали контейнеры для сборки монструозных монолитных enterprise приложений из крупных отдельно поставляемых компонент, плагинной архитектуры, внутри так называемых application servers.

T>>> о чём ты вообще? идея юнит-тестирования намного старше веб-серверов...
T>·>"веб-сервер" я не говорил, не приписывай мне ложные высказывания.
T>ой, насмешил... твой сервер приложений ещё моложе, чем веб-сервера
Ага, и причём тут идея юнит-тестирования? Ты споришь с сам с собой. Я тебе не мешаю?

T>·>Для юнит-тестирования контейнер не нужен тоже, чаще даже вреден. Нужен DI.

T>ну ка покажи, как ты собираешься делать DI без Ioc контейнера
Тут уже раз сто показывали. Вот ещё раз.

T>·>Ты предлагаешь посылать письма и писать файлы из тестов? Особенно весело бороться в тестах с многопоточкой. Нет, в тестахм добрая половина этих зависимостей будут тестовые реализации.

T>ты сам назвал сервис "Main", а теперь на меня обижаешься ?
У тебя опять проблемы с чтением. Сервис так не я назвал, а varenikAA тут
Автор: varenikAA
Дата: 19.01.21
.

T>в том-то и дело, что в одном случае у тебя его в твоём тесте даже инициировать толком не получится,

У тебя не получится, у других получится. Если не будешь отключать мозг, то и ты научишься, это не сложно.

T>а в моём варианте инициализация и тестового и продуктивного кода выглядит почти одинаково, с одним лишь отличием, что я подменяю то, что тестирую и вызываю тем, что меня в тесте интересует

А в моём варианте инициализация будет вызывать тот же самый код.

T>ну это уже тонкости, как ты там назовёшь: модуль , сервис или ещё как...

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

T>>>>Container.Register<InMemoryProvider, DbProvider> ()

T>·>Это не DI, это контейнер. Разберись в конце-концов что такое DI.
T>так давай, покажи написанный на твоёй коленке DI без контейнера, мы его оценим
Я уже написал тут
Автор: ·
Дата: 19.01.21
и выше. Если кода мало и он примитивный это не означает, что он какой-то неправильный, тебе просто непривычно после контейнеров-то.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[23]: О пользе Dependency Injection
От: takTak  
Дата: 19.01.21 12:41
Оценка:
T>>>>·>А придумали контейнеры для сборки монструозных монолитных enterprise приложений из крупных отдельно поставляемых компонент, плагинной архитектуры, внутри так называемых application servers.
T>>>> о чём ты вообще? идея юнит-тестирования намного старше веб-серверов...
T>>·>"веб-сервер" я не говорил, не приписывай мне ложные высказывания.
T>>ой, насмешил... твой сервер приложений ещё моложе, чем веб-сервера
·>Ага, и причём тут идея юнит-тестирования? Ты споришь с сам с собой. Я тебе не мешаю?
итак, возвращаемся к первому предложению: юнит-тестирование возникло до появления серверов приложений, так что облегчающие юнит-тесторование DI не имеет к серверам приложений никакого отношения

T>>·>Для юнит-тестирования контейнер не нужен тоже, чаще даже вреден. Нужен DI.

T>>ну ка покажи, как ты собираешься делать DI без Ioc контейнера
·> Тут уже раз сто показывали. Вот ещё раз.
ты на своём коде покажи, "а вот дядя знает" в другом возрасте употребляют

T>>·>Ты предлагаешь посылать письма и писать файлы из тестов? Особенно весело бороться в тестах с многопоточкой. Нет, в тестахм добрая половина этих зависимостей будут тестовые реализации.

T>>ты сам назвал сервис "Main", а теперь на меня обижаешься ?
·>У тебя опять проблемы с чтением. Сервис так не я назвал, а varenikAA тут
Автор: varenikAA
Дата: 19.01.21
.

пиши в спортлото

T>>в том-то и дело, что в одном случае у тебя его в твоём тесте даже инициировать толком не получится,

·>У тебя не получится, у других получится. Если не будешь отключать мозг, то и ты научишься, это не сложно.
не спорю, в этом ты- мастак

T>>а в моём варианте инициализация и тестового и продуктивного кода выглядит почти одинаково, с одним лишь отличием, что я подменяю то, что тестирую и вызываю тем, что меня в тесте интересует

·>А в моём варианте инициализация будет вызывать тот же самый код.
так ты точно уверен, что ты не сам с собой общаешься ?

T>>ну это уже тонкости, как ты там назовёшь: модуль , сервис или ещё как...

·>Ну да, суть в том, что код для композиции нескольких компонент — это тоже самый обыкновенный код, а не контейнерная магия.

T>>>>>Container.Register<InMemoryProvider, DbProvider> ()

T>>·>Это не DI, это контейнер. Разберись в конце-концов что такое DI.
T>>так давай, покажи написанный на твоёй коленке DI без контейнера, мы его оценим
·>Я уже написал тут
Автор: ·
Дата: 19.01.21
и выше. Если кода мало и он примитивный это не означает, что он какой-то неправильный, тебе просто непривычно после контейнеров-то.


т.е. ты делаешь DI без интерфейсов? ты точно свою ссылку из википедии прочитал?
Re[20]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 19.01.21 12:57
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б> "Pure DI" vs "DI Container".


А в чем отличие?
Кодом людям нужно помогать!
Re[24]: О пользе Dependency Injection
От: · Великобритания  
Дата: 19.01.21 13:16
Оценка:
Здравствуйте, takTak, Вы писали:

T>·>Ага, и причём тут идея юнит-тестирования? Ты споришь с сам с собой. Я тебе не мешаю?

T>итак, возвращаемся к первому предложению: юнит-тестирование возникло до появления серверов приложений, так что облегчающие юнит-тесторование DI не имеет к серверам приложений никакого отношения
Да. И? Я ничего другого и не утверждал. Ты просто путаешь DI и DI-контейнеры. А вот контейнеры и фреймворки имеют прямое отношение к серверам приложений ибо идея пошла оттуда.

T>>>ну ка покажи, как ты собираешься делать DI без Ioc контейнера

T>·> Тут уже раз сто показывали. Вот ещё раз.
T>ты на своём коде покажи, "а вот дядя знает" в другом возрасте употребляют
Ещё раз: вот тут
Автор: ·
Дата: 19.01.21
ванильный DI, без контейнеров и интерфейсы тоже не обязательны.

T>>>ты сам назвал сервис "Main", а теперь на меня обижаешься ?

T>·>У тебя опять проблемы с чтением. Сервис так не я назвал, а varenikAA тут
Автор: varenikAA
Дата: 19.01.21
.

T>пиши в спортлото
Действительно, тебе писать бесполезно, ты всё равно не читаешь, только хамишь.

T>>>в том-то и дело, что в одном случае у тебя его в твоём тесте даже инициировать толком не получится,

T>·>У тебя не получится, у других получится. Если не будешь отключать мозг, то и ты научишься, это не сложно.
T>не спорю, в этом ты- мастак
Да, спасибо. И тебе того же желаю.

T>·>А в моём варианте инициализация будет вызывать тот же самый код.

T>так ты точно уверен, что ты не сам с собой общаешься ?
Да, уверен, просто ты не слушаешь.

T>>>так давай, покажи написанный на твоёй коленке DI без контейнера, мы его оценим

T>·>Я уже написал тут
Автор: ·
Дата: 19.01.21
и выше. Если кода мало и он примитивный это не означает, что он какой-то неправильный, тебе просто непривычно после контейнеров-то.

T>т.е. ты делаешь DI без интерфейсов? ты точно свою ссылку из википедии прочитал?
Да, прочитал. Для DI/CI интерфейсы не нужны. И контейнеры тоже. А интерфейсы _нужны_ только для так называемого частного случая Interface Injection (который в этом обсуждении ни разу не упоминался). И ты прочитай, рекомендую.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[21]: О пользе Dependency Injection
От: takTak  
Дата: 19.01.21 13:17
Оценка: 6 (1)
Б>> "Pure DI" vs "DI Container".

S>А в чем отличие?


в одном случае ты всё делаешь сам на своих коленках и с использованием своего велосипеда, который никому, кроме тебя, неинтересен,
в другом случае (опять же, никаких "DI container" нет, есть "IoC container" ) ты пользуешься трудом тех, кто до тебя на сотню-другую граблей уже наступил
Re[21]: О пользе Dependency Injection
От: Буравчик Россия  
Дата: 19.01.21 13:28
Оценка: 6 (1) +2
Здравствуйте, Sharov, Вы писали:

S>А в чем отличие?


DI можно использовать и без DI-контейнера. Весь код по созданию объектов пишется вручную — как классы с методами createAnything (в Main или в какой-то подсистеме).

Из плюсов — явный вызов всех конструкторов. Удобно описываются взаимосвязи, а также все связи контролируются компилятором (для статических языков).
Это как раз тот случай, когда и DI используется, и все взаимосвязи указаны явно (как хочет топик-стартер) — можно использовать Find Usage и прочие штуки.

Из минусов — больше wiring-кода, сложнее управлять сроком жизни объектов. Чуть менее удобно переопределять зависимости для тестирования — приходится создавать наследника для переопределения методов.

https://blog.ploeh.dk/2014/06/10/pure-di/
Best regards, Буравчик
Re[14]: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 19.01.21 14:35
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>>>>>Понял, а то у ТС вообще неопнятно на что он жалуется. ну это субъективно. так то во всех учебниках учат что надо избегать явного создания объектов.

IT>>>>Они не учат почему этого нужно избегать? Если нет, то ввыкинь такие учебники на помоечку. Впрочем, если да, то тоже выкинь.
AA>>>Чтобы не зависеть от реализации.
IT>>Зачем? Какую проблему это решает?
AA>Например, командная разработка. Интерфейсы согласованы и лежат в общей сборке. Один работает над клиентом, другой над реализацией интерфейса.

А проблема в чём? Зачем тут интерфейсы? К тому же, насколько мне известно, командная разработка это больше об SMS, чем об интерфейсах.
Если нам не помогут, то мы тоже никого не пощадим.
Re[22]: О пользе Dependency Injection
От: · Великобритания  
Дата: 19.01.21 16:31
Оценка: 11 (2) +1
Здравствуйте, Буравчик, Вы писали:

S>>А в чем отличие?

Б>Из минусов — больше wiring-кода,
Это как правило неправда. В лучшем случае кода будет примерно столько же. А чаще кода будет меньше, т.к. теперь не надо описывать тот же wiring-код в виде api данного контейнера — всякие там аннотации, специальные интерфейсы, конфиги, регистрация компонент и т.п.

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

Б> сложнее управлять сроком жизни объектов.

Это тоже не совсем правда. Тут ещё одна путаница. Тут уже путаются понятия "IoC-контейнер" и фреймворк. Контейнер это просто свалка инстансов, мапа просто {тип -> объект}. А фреймворк это уже целая интегрированная библиотека с кучей готовых тулзов. Например, AOP, lifecycle (start/stop/Disposable), context events и т.п.
Ещё могут быть готовые к использованию чтение конфигов, scopes, маппинги для http и т.п. И это уже всё к IoC не относится.

Б> Чуть менее удобно переопределять зависимости для тестирования — приходится создавать наследника для переопределения методов.

Это ерунда какая-то, к DI прямого отношения не имеет.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[17]: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 19.01.21 19:45
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>с одной стороны, если мы говорим о поломанных объектах, то при правильном программировании инвариантов их возможное существование будет пресекаться на корню. либо в конструкторе, либо в фабрике/билдере. и это безотносительно DI, а просто как правило хорошего тона и clean code.


Да, да. Особенно в сферическом вакууме или на примитивных проектах, типа PetShop.

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


Никто и не сравнивает DI или не-DI. Сравнивают DI фреймворк или не-DI фреймворк.

C0s>- пользоваться дебаггером для этого — моветон. нужно учиться логировать и читать логи. в первую очередь из-за того, что, когда проблема прилетает из продуктива, никакой дебаггер не поможет, а логи — да.


У меня процессы работают всю ночь. Если логировать каждую строчку кода в подробностях и с прилежанием, то место на диске с логами закончится очень быстро. А так да, логируем, куда девваться.
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: О пользе Dependency Injection
От: C0s Россия  
Дата: 19.01.21 19:56
Оценка:
Здравствуйте, IT, Вы писали:

IT>Да, да. Особенно в сферическом вакууме или на примитивных проектах, типа PetShop.


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

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


IT>Никто и не сравнивает DI или не-DI. Сравнивают DI фреймворк или не-DI фреймворк.


раз уж мы тут, то DI-фреймворк важен тем, что для правильного применения сразу требует хорошего чувства объектного построения, проектирования надёжных и устойчивых моделей, а также инверсии зависимостей. без оного этого тоже можно добиться, но только палкой или кнутом. кроме того, фреймворки типа spring являются сами по себе примерами хорошего кода, содержат массу готовых велосипедов с гибкой настройкой нужных скоростей на любые направления движения.

IT>У меня процессы работают всю ночь. Если логировать каждую строчку кода в подробностях и с прилежанием, то место на диске с логами закончится очень быстро. А так да, логируем, куда девваться.


не надо логировать постоянно, достаточно возможности увеличивать или уменьшать подробность логирования без останова процесса. нашли проблему пользователи — включаем логи, просим повторить, снимаем их и анализируем.
Re[22]: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 19.01.21 20:04
Оценка:
Здравствуйте, takTak, Вы писали:

T>так давай, покажи написанный на твоёй коленке DI без контейнера, мы его оценим


Похоже ты реально путаешь DI и контейнеры.
Если нам не помогут, то мы тоже никого не пощадим.
Re[25]: О пользе Dependency Injection
От: takTak  
Дата: 19.01.21 20:07
Оценка:
T>>·>Ага, и причём тут идея юнит-тестирования? Ты споришь с сам с собой. Я тебе не мешаю?
T>>итак, возвращаемся к первому предложению: юнит-тестирование возникло до появления серверов приложений, так что облегчающие юнит-тесторование DI не имеет к серверам приложений никакого отношения
·>Да. И? Я ничего другого и не утверждал. Ты просто путаешь DI и DI-контейнеры.
просто я никогда не пользовался никакими серверами приложений: контейнеры были для меня именно помощью в написании проложений, так чтобы получебнное прлижение просто тестировалось бы,
если же тестов не предвидится, то и никакого смысла в том, чтобы композицию обьектов прозводить через DI, я не вижу, тут я на стороне того, кто эту ветку начал

ты начал использовать DI в контексте серверов приложений, причём, наверное, и без всяких тестов, имхо такой способ композиции приложения довольно прост, но какого-то выиграша от такого подхода , на самом деле, не видно

·>А вот контейнеры и фреймворки имеют прямое отношение к серверам приложений ибо идея пошла оттуда.

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


T>>>>ну ка покажи, как ты собираешься делать DI без Ioc контейнера

T>>·> Тут уже раз сто показывали. Вот ещё раз.
T>>ты на своём коде покажи, "а вот дядя знает" в другом возрасте употребляют
·>Ещё раз: вот тут
Автор: ·
Дата: 19.01.21
ванильный DI, без контейнеров и интерфейсы тоже не обязательны.

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

T>>·>А в моём варианте инициализация будет вызывать тот же самый код.

T>>так ты точно уверен, что ты не сам с собой общаешься ?
·>Да, уверен, просто ты не слушаешь.
ты первый начал

T>>>>так давай, покажи написанный на твоёй коленке DI без контейнера, мы его оценим

T>>·>Я уже написал тут
Автор: ·
Дата: 19.01.21
и выше. Если кода мало и он примитивный это не означает, что он какой-то неправильный, тебе просто непривычно после контейнеров-то.

T>>т.е. ты делаешь DI без интерфейсов? ты точно свою ссылку из википедии прочитал?
·>Да, прочитал. Для DI/CI интерфейсы не нужны. И контейнеры тоже. А интерфейсы _нужны_ только для так называемого частного случая Interface Injection (который в этом обсуждении ни разу не упоминался). И ты прочитай, рекомендую.
этот , как ты говоришь , "частный случай" — для меня единственно возможное и целесобразное применение , иначе смысла просто нет
Отредактировано 19.01.2021 20:15 takTak . Предыдущая версия .
Re[14]: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 19.01.21 20:10
Оценка: +1
Здравствуйте, Буравчик, Вы писали:

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


Б>А в проектах с DI ты делаешь изменение в одном месте — в composition root.


Как часто в своей жизни ты заменял БД на микросервисы?

Б>Чтобы убрать эту лапшу поступают просто — объекты делают глобальными (конфигурация, контекст БД и т.п.). И рано или поздно проявляются проблемы работы с глобальными переменными.


У меня проекту уже лет семь. Года четыре в продакшине. Глобавльные сетинги имеются. Сколько мне ещё осталось ждать до проявления проблем?

Б>Именно эта независимость частей системы придает системе гибкость, и это же добавляет сложности. Просто с ней работать нужно немного иначе.


Вопрос. Зачем нужна такая гибкость? Какую проблему это решает?
Если нам не помогут, то мы тоже никого не пощадим.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.