powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Внедрение зависимостей: практическое применение
34 сообщений из 34, показаны все 2 страниц
Внедрение зависимостей: практическое применение
    #38708563
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погружаюсь в паттерн "Внедрение зависимостей". Проштудировал "Внедрение зависимостей в .NET" Марка Симана и некоторые попавшиеся по ходу дела примеры. В целом в теории все понятно, но остался все-таки некоторый туман, касающийся практического применения в некоторых случаях. Вполне возможно, что я однобоко смотрю на ситуацию и меня нужно подтолкнуть в нужную сторону.

1. Единственный Resolve
Я исхожу из посыла Симана, на котором он категорически настаивает: Resolve используется один раз, все остальные зависимости подгружаются уже автоматически через DI. Иначе ломается вся схема DI, и, если вызывать Resolve на более глубоких слоях, паттерн начинает превращаться в Service Locator, который Симан считает антипаттерном.

Что подсказывает ваш опыт? Нужно ли этому правилу следовать неукоснительно? Или без фанатизма: применять Resolve глубже, если таким образом упрощается структура кода.

Следующие пункты в какой-то степени вытекают из первого.

2. Конструкторы с параметрами
Часто класс создается с конкретными параметрами, передаваемыми через конструктор, после чего класс готов к употреблению. Причем параметры заранее неизвестны (парамеры рантайма). То есть два пути получается:

2а) отказываться от инициализации класса в конструкторе и вводить понятие "неинициализированного класса" и контроль за тем, чтобы неинициализированный класс не мог использоваться, специальный метод инициализации.

2б) делать абстрактную фабрику под каждый конкретный класс и внедрять ее как зависимость

В общем, дополнительный гемор или как?

3. Перегруженные конструкторы
Это как вариант второго пункта, то есть отказываться от перегруженных конструкторов в принципе и идти по принципу отдельной инициализации класса или персональной фабрики?

Тут я приведу конкретный пример, возможно я не прав с архитектурой. Я упрощаю, надо иметь ввиду, что реальный класс несколько сложней. Пример в контексте ASP.NET MVC: есть некая модель бизнес-уровня - к примеру "карточка клиента", содержащая некоторое количество полей (необязательно элементарных). Модель инкапсулирует некоторые проверки, взаимодействие с репозиторием и некоторые другие функции). Модель может быть создана тремя путями: а) создание нового клиента (при этом в конструкторе может быть несколько предустановок, например "родительский клиент") б) загрузка из базы (в конструкторе передается id) в) создание на основе введенных пользователем данных (в конструктор передается пул введенных значений).

Все это удобно реализуется тремя перегрузками конструктора. Как изменить подход, чтоб внедрить DI?

4. Необязательные зависимости
Опять же пример из жизни MVC: классу контроллера может потребоваться зависимость от нескольких моделей, но реально будет использоваться одна-две, в зависимости как от вызванного метода (Action), так и, например, от результатов валидации. Внедрять зависимости от всех моделей? зачем ему этот ворох? Бить контроллер на множество мелких контроллеров? Тоже не очень удобный вариант: зачем мы тогда вообще объединяем несколько методов в контроллер.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38708571
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Абстрактная фабрика не нужна, конейнер и есть такая фабрика.
Для необязательных зависимостей надо использовать свойства.
Надо подбирать контейнер, который имеет возможность ижектить зависимости в виде lazy.
Надо учиться работать с дочерними контейнерами.

НЕ НАДО инжектить объекты с данными.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38708883
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasАбстрактная фабрика не нужна, конейнер и есть такая фабрика.разница в том, что с помощью фабрики можно получить объект с заданными параметрами в момент создания экземпляра, в то время как зависимость создается заранее. Тут-то у меня и ступор возникает.

Собственно, абстрактная фабрика - это как раз рекомендация Симана для случаев, когда нужно создавать экземпляр с параметрами рантайма.
gandjustasНадо подбирать контейнер, который имеет возможность ижектить зависимости в виде lazy.Ну а как потом получать эту зависимость с конкретными параметрами. Резолвить через контейнер? lazy - это та же фабрика-посредник, которая позволит создать экземпляр позже.
gandjustasДля необязательных зависимостей надо использовать свойства.как это применить к описанной мной ситуации? Ну создал я несколько свойств вместо параметров конструктора. Контейнер ведь будет заполнять их все равно в момент создания экземпляра, а нужность или ненужность той или иной зависимости выясняется уже во время работы экземпляра.

gandjustasНадо учиться работать с дочерними контейнерами.В с этим не сталкивался, можно чуть подробнее?

gandjustasНЕ НАДО инжектить объекты с данными.имеются ввиду РОСО-объекты? А если есть объект, который обрабатывает данные и промежуточно их хранит? А если ему глубже нужна опять абстрактная зависимость для обработки этих данных?
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38708907
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ исхожу из посыла Симана, на котором он категорически настаивает: Resolve используется один раз, все остальные зависимости подгружаются уже автоматически через DI. Иначе ломается вся схема DI, и, если вызывать Resolve на более глубоких слоях, паттерн начинает превращаться в Service Locator, который Симан считает антипаттерном.

Что подсказывает ваш опыт? Нужно ли этому правилу следовать неукоснительно? Или без фанатизма: применять Resolve глубже, если таким образом упрощается структура кода.

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

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


Shocker.ProЧасто класс создается с конкретными параметрами, передаваемыми через конструктор, после чего класс готов к употреблению. Причем параметры заранее неизвестны (парамеры рантайма). То есть два пути получается:

2а) отказываться от инициализации класса в конструкторе и вводить понятие "неинициализированного класса" и контроль за тем, чтобы неинициализированный класс не мог использоваться, специальный метод инициализации.

2б) делать абстрактную фабрику под каждый конкретный класс и внедрять ее как зависимость

В общем, дополнительный гемор или как?

классы, которые требуют внедрения зависимостей не надо создавать вручную. дополнительные параметры в таком случае передаются:

а) либо через публичные свойства
б) либо через инициализатор

ещё вариант, внедрять фабрику, которая может инстанцировать класс с набором конкретных параметров.


Shocker.ProЭто как вариант второго пункта, то есть отказываться от перегруженных конструкторов в принципе и идти по принципу отдельной инициализации класса или персональной фабрики?

Тут я приведу конкретный пример, возможно я не прав с архитектурой. Я упрощаю, надо иметь ввиду, что реальный класс несколько сложней. Пример в контексте ASP.NET MVC: есть некая модель бизнес-уровня - к примеру "карточка клиента", содержащая некоторое количество полей (необязательно элементарных). Модель инкапсулирует некоторые проверки, взаимодействие с репозиторием и некоторые другие функции). Модель может быть создана тремя путями: а) создание нового клиента (при этом в конструкторе может быть несколько предустановок, например "родительский клиент") б) загрузка из базы (в конструкторе передается id) в) создание на основе введенных пользователем данных (в конструктор передается пул введенных значений).

Все это удобно реализуется тремя перегрузками конструктора. Как изменить подход, чтоб внедрить DI?

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

Shocker.ProОпять же пример из жизни MVC: классу контроллера может потребоваться зависимость от нескольких моделей, но реально будет использоваться одна-две, в зависимости как от вызванного метода (Action), так и, например, от результатов валидации. Внедрять зависимости от всех моделей? зачем ему этот ворох? Бить контроллер на множество мелких контроллеров? Тоже не очень удобный вариант: зачем мы тогда вообще объединяем несколько методов в контроллер.

один из вариантов, это использовать ленивую инициализацию Lazy<T>. можно использовать в параметрах конструктора или в публичных свойствах. бить контроллер не надо. можно аггрегировать наборы в специальные классы. или опять же фабрики. но Lazy<T> самый простой вариант.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38708923
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasАбстрактная фабрика не нужна, конейнер и есть такая фабрика.

Перестань вводить людей в заблуждение. Контейнер не есть фабрика, хотя может выполнять её функции.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38708936
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttоднозначно все 3 способа плохи для конструкторов. этим должна озаботиться фабрика, или на крайний случай фабричный метод.то есть под каждый класс сущности делать персональную фабрику, предназначенную именно для этого класса? (универсальная типобезопасная фабрика не получится из-за того, что у классов есть специфические параметры создания)

hVosttодин из вариантов, это использовать ленивую инициализацию Lazy<T>имеется ввиду System.Lazy<T>? Ок, прикину этот способ на свои задачи.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38708947
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proто есть под каждый класс сущности делать персональную фабрику, предназначенную именно для этого класса? (универсальная типобезопасная фабрика не получится из-за того, что у классов есть специфические параметры создания)

Без конкретной задачи, трудно сказать что будет лучше. Но в целом да, или фабричный метод (который может нести на борту сам класс, можно получать его через функтор).

Если на момент создания ты знаешь какой конструктор надо использовать (в твоём варианте), значит ты также будешь знать какую фабрику использовать. Только во втором случае фабрика будет получена через DI, и получит все требуемые зависимости.

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

Shocker.Proимеется ввиду System.Lazy<T>? Ок, прикину этот способ на свои задачи.

Ага. По мне, так очень удобно.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38708980
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProgandjustasАбстрактная фабрика не нужна, конейнер и есть такая фабрика.разница в том, что с помощью фабрики можно получить объект с заданными параметрами в момент создания экземпляра, в то время как зависимость создается заранее. Тут-то у меня и ступор возникает.

С чето ты взял что зависимость создается заранее? В контейнере ты регистрируешь тип и указываешь политику управления временем жизни. Чаще всего это per-request в веб-приложении, чтобы на каждый запрос создавался один экземпляр.



Shocker.ProСобственно, абстрактная фабрика - это как раз рекомендация Симана для случаев, когда нужно создавать экземпляр с параметрами рантайма.
Хреновая рекомендация честно говоря. Контейнеры обычно умеют: инжектить сами себя (если тебе надо тип в рантайме выбирать) и\или инжектить Func<T>\Lazy<T>, когда в контейнере зарегистрированы типы T, чтобы не создавать объект если он не нужен.

Если надо руками создавать фабрики, то выбрасывай контейнер, он бесполезен.


Shocker.ProgandjustasНадо подбирать контейнер, который имеет возможность ижектить зависимости в виде lazy.Ну а как потом получать эту зависимость с конкретными параметрами. Резолвить через контейнер? lazy - это та же фабрика-посредник, которая позволит создать экземпляр позже.
Конкретные параметры это что?
Два варианта:
1) Параметры неизвестные на момент регистрации, но известные на момент выполнения запроса (пользователь, route values итд) - тут нужно использовать дочерние контейеры и в них пихать все параметры запроса.
2) Параметры, вычисляемые только при обработке данных, например сумма заказов по клиенту. В этом случае не нужно использовать IoC вообще - явно напиши код, который обрабатывает необходимые величины.

Не надо идею IoC доводить до абсурда, когда все операторы new замняются на инъекцию. До добра такое не доводит. Основная логика в приложении должна быть читаема, чтобы можно пройти по цепочки вызовов, а все инъекции должны быть очевидны (лучше всего разметить атрибутами). Иначе при чтении будет очень сложно определить откуда и как берется значение.



Shocker.ProgandjustasНадо учиться работать с дочерними контейнерами.В с этим не сталкивался, можно чуть подробнее?
Это зависит от контейнера. Unity например позволяет создавать Child, который
а) имеет время жизни меньше parent
б) может расширять и переопределять набор зависимостей


Shocker.ProgandjustasНЕ НАДО инжектить объекты с данными.имеются ввиду РОСО-объекты? А если есть объект, который обрабатывает данные и промежуточно их хранит? А если ему глубже нужна опять абстрактная зависимость для обработки этих данных?
Промежуточные тоже не надо инжектить, код становится нереально сложно читать если логика становится завязана на контейнер.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709003
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasЕсли надо руками создавать фабрики, то выбрасывай контейнер, он бесполезен.

Чумовой бред.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709004
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasС чето ты взял что зависимость создается заранее? В контейнере ты регистрируешь тип и указываешь политику управления временем жизни. Чаще всего это per-request в веб-приложении, чтобы на каждый запрос создавался один экземпляр.Заранее - не значит в момент запуска приложения, но в момент создания графа, то есть как минимум создания класса, в котором я вызываю подкласс, использующий зависимость, то есть параметры вызова еще неизвестны
gandjustasХреновая рекомендация честно говоря. Контейнеры обычно умеют: инжектить сами себя (если тебе надо тип в рантайме выбирать) и\или инжектить Func<T>\Lazy<T>, когда в контейнере зарегистрированы типы T, чтобы не создавать объект если он не нужен.
Если надо руками создавать фабрики, то выбрасывай контейнер, он бесполезен.разумеется, лямбда это просто частный случай фабрики.
gandjustasКонкретные параметры это что?
Два варианта:
...
2) Параметры, вычисляемые только при обработке данных, например сумма заказов по клиенту. В этом случае не нужно использовать IoC вообще - явно напиши код, который обрабатывает необходимые величины.вот именно второй вариант.
gandjustasНе надо идею IoC доводить до абсурда, когда все операторы new замняются на инъекцию. До добра такое не доводит.Ну, собственно, я и пытаюсь найти ту границу разумного использования DI. Мне как раз неясно, как быть, если класс, создаваемый через new хочет зависимость, которая в других случаях настраивается через контейнер? Вручную транслировать все (или сам контейнер) через конструктор?
gandjustasЭто зависит от контейнера. Unity например позволяет создавать Child, который
а) имеет время жизни меньше parent
б) может расширять и переопределять набор зависимостейиспользую Autofac.
То есть, фактически, это создание нового графа? То есть точка резолва корня этого графа перемещается вглубь вызовов классов?
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709019
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНу, собственно, я и пытаюсь найти ту границу разумного использования DI. Мне как раз неясно, как быть, если класс, создаваемый через new хочет зависимость, которая в других случаях настраивается через контейнер? Вручную транслировать все (или сам контейнер) через конструктор?

Зависимости надо снижать. Например DTO классы не должны быть зависимыми. Если есть зависимость и архитектура строится на DI, то надо использовать DI. Тут тяжело сказать, где граница применения DI, её итак видно неплохо. Там где можно избежать использовать DI, над избегать. Тут уже придёт с опытом, теоретически это плохо формализуется.

Shocker.Proиспользую Autofac.
То есть, фактически, это создание нового графа? То есть точка резолва корня этого графа перемещается вглубь вызовов классов?

Да. Но таких моментов должно быть по-меньше. На границе сервисов с разным способом управления времени жизни.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709060
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProgandjustasНе надо идею IoC доводить до абсурда, когда все операторы new замняются на инъекцию. До добра такое не доводит.Ну, собственно, я и пытаюсь найти ту границу разумного использования DI. Мне как раз неясно, как быть, если класс, создаваемый через new хочет зависимость, которая в других случаях настраивается через контейнер? Вручную транслировать все (или сам контейнер) через конструктор?

Если я правильно понял, то ты пытаешься создать экземпляр класса A, который требует в конструкторе экземпляры классов B и C, а также некоторое значение x, которое известно только в рантайме после вычислений. Тогда, скорее всего, надо переписать класс A таким образом, чтобы значение x передавать не в конструктор, а в метод класса A. Сам класс A инжектить в вызывающий класс.

Вообе если ты толком не представляешь архитектуру, то лучше начинать не с контейнера. Начать лучше в обычных классов, которые сами создают нужные экземпляры. Потом можно добавить контейнер и постепенно переделать классы так, чтобы вместо создания экземпляров получать их в конструкторе\свойствах. Обычно это получается как раз идеальный случай IoC.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709119
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasЕсли я правильно понял, то ты пытаешься создать экземпляр класса A, который требует в конструкторе экземпляры классов B и C, а также некоторое значение x, которое известно только в рантайме после вычислений.да
gandjustasТогда, скорее всего, надо переписать класс A таким образом, чтобы значение x передавать не в конструктор, а в метод класса A. Сам класс A инжектить в вызывающий класс.это я подразумевал под инициализатором (отдельно от конструктора). К сожалению, это подразумевает во-первых дополнительный инициализатор, во-вторых защиту от использования неинициализированного класса во всех его методах и свойствах, а это начинает резко снижать его читабельность или простоту модификации (в т.ч. при добавлениях/модификациях методов приходится помнить о наличии неинициализированного состояния). Поэтому пытаюсь понять, может есть иной best practice..
gandjustasВообе если ты толком не представляешь архитектуру, то лучше начинать не с контейнера. Начать лучше в обычных классов, которые сами создают нужные экземпляры. Потом можно добавить контейнер и постепенно переделать классы так, чтобы вместо создания экземпляров получать их в конструкторе\свойствах.как раз у меня уже имеется сильно связанный код и я пытаюсь его отрефакторить с использованием DI (началось с необходимости увязать две библиотеки, где DI подошел идеально)
hVosttТам где можно избежать использовать DI, над избегать.ну в вырожденном случае можно вообще обойтись без DI

Меня, может быть смутило то, что в этой главе Симан очень фанатично использует DI, вплоть до того, что развязывает модель с репозиторием за счет дополнительной абстрации в виде промежуточного сервиса, заточенного практически персонально под модель.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709146
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProМеня, может быть смутило то, что в этой главе Симан очень фанатично использует DI, вплоть до того, что развязывает модель с репозиторием за счет дополнительной абстрации в виде промежуточного сервиса, заточенного практически персонально под модель.

Когда тебе надо будет покрыть код тестами приблизительно на 100%, ты поймёшь Симана
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709270
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

значит главно что бы прога хорошо тестировалась?
ребятя вы потиноьку съезжаете с ума
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709282
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну так для этого и было придумано, unit test-ы всякие и тп.
безусловно, нечего IoC/DI огород городить для обычных приложений
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709302
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosзначит главно что бы прога хорошо тестировалась?
ребятя вы потиноьку съезжаете с ума

человек совершает ошибки. всегда. даже если это Бог Программирования. тем более при методологии CI, это практически обязательное требование. или по-вашему после каждой небольшой правки в коде необходимо загонять толпу QA и проверять абсолютно всё заново? ну-ну. удачи вам. как только сделаете ЗП каждому тестеру по $10k, я сам лично буду готов работать таким авто-тестером.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709304
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneну так для этого и было придумано, unit test-ы всякие и тп.
безусловно, нечего IoC/DI огород городить для обычных приложений

именно. все истерические вопли по поводу IoC/DI связаны с полным отсутствием какого-либо опыта.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709328
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

значит главно что бы прога хорошо тестировалась?
ребятя вы потиноьку съезжаете с ума
Согласен!
1. Должна хорошо продаваться.
2. Должна удовлетворять потребности клиентов.
Остальное - второстепенно.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709338
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До чего доходит :)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class HelloWorld
{
    public static void Main(String[] args)
    {
        MessageBody mb = new MessageBody();
        mb.Configure("Hello World!");
        AbstractStrategyFactory asf = DefaultFactory.Instance;
        MessageStrategy strategy = asf.CreateStrategy(mb);
        mb.Send(strategy);
    }
}
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709341
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВViPRoshVostt,

значит главно что бы прога хорошо тестировалась?
ребятя вы потиноьку съезжаете с ума
Согласен!
1. Должна хорошо продаваться.
2. Должна удовлетворять потребности клиентов.
Остальное - второстепенно.1 - это задачи отдела маркетинга, 2 - это задачи отдела product design (аналитегов).

А если посмотреть с точки зрения целей отдела разработки и тестирования?
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709344
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какбы с колокольни бизнеса и с колокольни процесса разработки открываются разные виды.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709346
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Админы вообще скажут, что главное - это виртуализация
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709349
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

да разве можно ради тестирования только сделать автомобиль модульной?
для этого должны быть более веские причины
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709355
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos, а автомобиль итак модульный.
Собирается из комплектующих разных производителей. Если производитель не понравился, то выбирается другой.
При этом остальные части авто как-то особо не страдают.

Уменьшение сроков поставки новой версии - это более веская причина?
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709360
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos, или ты намекаешь на то, что где-то тут спутали причину со следствием?
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709363
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

контекст совместимости по интерфейсу имеет единственное ограничение - надо иметь соответствующий интерфейс
а автомобильные модули должны быть не совместимыми, а почти идентичными
даже колесо побольше не поставишь, а поменьше и подавно
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709364
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAViPRos, или ты намекаешь на то, что где-то тут спутали причину со следствием?
да вот именно увлеклись
звеня цепи соединяются звенями другой цепи :)
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709367
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВДо чего доходит :)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class HelloWorld
{
    public static void Main(String[] args)
    {
        MessageBody mb = new MessageBody();
        mb.Configure("Hello World!");
        AbstractStrategyFactory asf = DefaultFactory.Instance;
        MessageStrategy strategy = asf.CreateStrategy(mb);
        mb.Send(strategy);
    }
}

а что, вполне номальный код.
может написать Hello World! лазером на небе, может - мочой на снегу
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709368
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAViPRos, а автомобиль итак модульный.
Собирается из комплектующих разных производителей. Если производитель не понравился, то выбирается другой.
При этом остальные части авто как-то особо не страдают.

Уменьшение сроков поставки новой версии - это более веская причина?
Разработку промышленного ПО правильней сравнивать например с АПЛ. Где представители завода изготовителя контролируют состояние изделия, проводят ремонты и модернизации.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709381
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAКакбы с колокольни бизнеса и с колокольни процесса разработки открываются разные виды.
Разработка не должна быть ради разработки.
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709388
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВskyANAКакбы с колокольни бизнеса и с колокольни процесса разработки открываются разные виды.
Разработка не должна быть ради разработки.Согласен.

Но и факт не должен отличаться от плана в разы из-за того, что тупо процесс не выстроен потому, как "бабки надо зарабатывать, а не о методологии рассуждать"
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709393
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proа что, вполне номальный код.
может написать Hello World! лазером на небе, может - мочой на снегу
Может то может быт и может. Только часто это превращается 100500 интерфейсов, от которых унаследовано всего по одному классу и полную путаницу, что и от чего зависит и откуда берется. Или там разделение ответственности доводят до полного бреда....
...
Рейтинг: 0 / 0
Внедрение зависимостей: практическое применение
    #38709449
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВМожет то может быт и может. Только часто это превращается 100500 интерфейсов, от которых унаследовано всего по одному классу и полную путаницу, что и от чего зависит и откуда берется. Или там разделение ответственности доводят до полного бреда....

Не надо путать божий дар с яичницей! Даже с плохим ножом профессиональный повар приготовит шедевр, а с профессиональным ножом профан нарежет овощей вперемешку со своими пальцами.

Вечно люди пытаются найти причину своих или чужих неудач то в инструментах, то в методологии, то ещё в чём-то. Даже ООП, который сначала то воспевался и обожествлялся, а затем только самый ленивый на него не погадил, всё равно в умелых руках вполне успешно и эффективно решает задачи.
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Внедрение зависимостей: практическое применение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]