Объяснение Inversion of Control для самых маленьких

  Рет қаралды 25,601

S0ER

S0ER

2 жыл бұрын

#soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - t.me/softwareengineervlog
Спонсорство - donate.s0er.ru
Сайт платным контентом - soer.pro
Зеркало для видео Дзен Видео - zen.yandex.ru/id/5f578bdf22e2...
GitHub - github.com/soerdev
Чат для программистов - / discord
Группа ВК - codeartblog

Пікірлер: 48
@nanvlad
@nanvlad 2 жыл бұрын
Вообще непонятно стало еще больше...
@Horrrorsful
@Horrrorsful 2 жыл бұрын
не лучшее видео и объяснение, складывается впечатление, будто весь ioc это и есть какой-то магический фреймворк, но это всего лишь его частный случай реализации, а в общем ioc это штука гораздо более обширная и не завязана ни на каких фреймворках, это даже больше какой-то шаблон или паттерн программирования.
@AndreiVvedenskii
@AndreiVvedenskii 2 жыл бұрын
Стало легче, но не до конца. Может есть ссылка на хороший пример, где объяснят, мол раньше все работало так, теперь нам нужна вот эта фича и без IoC уже никак. Очень не хватает, пусть базового, примера того почему мы на проекте используем что-то. Все сразу начинают с того, как это работает и "смотрике как круто". А что круто не понятно, потому как я вдвое короче напишу программу, которая делает то же самое.
@theban2517
@theban2517 2 жыл бұрын
Например наш сервер ждет http запрос. Если инверсии контроля нет, то нам придется буквально ждать и постоянно проверять не пришел ли он (например бесконечным while/setInterval). С инверсией контроля мы эту задачу отдаем модулю http, просто навешивая обработчик события (коллбэк). По крайней мере я так понял, посмотрев видео и прочитав пару статей на хабре. Знающие, поправьте, если я не прав
@ievgenk.8991
@ievgenk.8991 2 жыл бұрын
Представьте ситуацию когда у вас есть файл в котором лежит класс, но в этом файле нет ни одного импорта, а все зависимости в класс передаеются через конструктор класса - а потом все зависимости передаются в класс где он создается. Зачем это нужно это очень интересный вопрос, который меня так же мучал очень долгое время, и по моим скромным размышлениям это не очень то часто и нужно в бизнес логике проекта, но все же есть несколько условных юзкейсов, где это может быть полезно, которые я попытаюсь описать: 1. Представьте что у вас большой проект и над ним работают, пусть будет, три команды A, B, C и ваш архитектор хочет распаралелить их работу, что быстрее запилить фичу для клиента, но есть проблема - команда А пилит модуль от которого зависит команда В, а вот команда С тоже зависит от модуля А но и модуля С. Назревает очевидная проблема, что распаралелить работу не получиться, потому что сначала нужно дождаться пока команда А сделает свой модуль, потом В и потом уже С - это будет очень долго и тут приходит на помощь depedency inversion(DI)/iversion of control(IoC) - вы просто договариватесь перед старом работы про интерфейсы которые будут предоставлены модулями от команды A, B и C и начинаете работу, написав какие то примитивные моки, которые бы соотвествовли оговоренным контрактам/интерфейсам. А по мере готовности настоящих модулей - просто подменяете свои моки на настоящий рабочий код от ваших команд. 2. Есть теоретическая необходимость подменять зависимости внешние зависимости (библиотечки). Например вы пилите приложение которое выдает пользователю очень удобную статистику по погоде. И у вас есть сторонний сервис к которому вы обращаетесь за информацией и вы можете его юзать напрямую в коде и не парится, а потом вам приходит письмо от босса, где говорится, что сервис закрывается или что он подымает цену и вам надо перейти на другой сервис, и вам предоставляют новый. И тут перед вами встает задачка пробежаться по всему коду и вручную выпиливать старую либу и заменять на новую. Как раз в такой ситуации IoC мог бы быть полезным. Написав свой сервис обертку над библиотекой погоды, который имеет определенный интерфейс и возвращает удобные для вас данны, вы его передаете как зависимость в другие модули (через конструктор если класс, или как аргументы функции) и уже ваша бизнес логика использует вашу абстракцию и если надо поменять либу вы просто меняте свой код в одном месте и все в теории может работать так же. И вам не будут страшны ситуации теперь когда вам могут прийти снова и попросить поменять библиотеку на новую или вернуться к старой. Но есть огромное НО, вышеописаные ситуации встречаются редко и даже если вы работаете в большой компании то в условиях украинского рынка чаще всего это будет небольшие или среднего размера проекты с аутсорса, а даже если и будете несколькими командами работать над одним проектом - очень редко случается ситуации когда фичи пилятся параллельно (разве что только при старте проекта, что тоже бывает очень редко). А кейс с необходимостью подмена внешних библиотек так же крайне редок - программисты на практике редко меняют библиотеки баз данных, логеров и прочее, как правило все они это железобетонные решения, а если даже и надо будет это сделать (подменить старую либу на нову) то может оказаться что "наивный" способ когда ходим по каждому файлу и правим ручками гораздо быстрее и дешевле в глобальном контекте, чем постоянно тратить силы и время на поддержку кодовой инфрастктуры в IoC стиле. Но все же, почему же IoC может быть полезен? Если начать разбираться, то на первый взгляд может показаться, что это просто бесполезная игрушка для заскучавших программистов по временам когда они играли конструкторы лего (или им подобные). НО, IoC может быть крайне полезен для написанию юнит тестов. Представьте ситуацию что вы хотите протестировать ваш код в котором есть логирование в базу данных или в файловую систему, получается при каждой прогонке тестов, ваше хранилище будет заполнятся мусором, но если вы написали ваш код используя подход Dependency Inversion то во время тестов вы просто и легко можете замокать все модули которые являются лишними или вредными для тестирования. Но снова есть НО, это полезно для экосистем типа java, c#, go, kotlin, а если же вы прогоняете тесты в экосистемах типа python, ruby, nodejs - вы можете мокать любые модули и зависимости, даже глобальные объекты без особого труда и таким образом отпадает необходимость упарываться в DI/IoC за отсуствием какого либо профита. Резюмируя вышесказаноое, IoC это не серебрянная пуля и не однозначное добро, как утверждает автор канала и этот подход не должен использоваться всеми и вся. Более того, любой код - это потенциальное место для ошибок и всегда требует вермени и сил для поддержки (в том чиле и код который пишется для работы IoC) и как вы подметили, можно писать код в два раза быстрее без DI/IoC, поэтому каждый разработчик сам, или команда должны определять нужно ли реализовывать этот подход в проекте или нет. Надеюсь объяснил доступно и понятно.
@AndreiVvedenskii
@AndreiVvedenskii 2 жыл бұрын
@@ievgenk.8991 Более или менее, конечно живой проект был бы краше, но и то хлеб. Спасибо. Надо бы еще своего лида этим вопрос напрячь😂
@fellainthewagon7166
@fellainthewagon7166 2 жыл бұрын
@@ievgenk.8991 хорошо объяснил, по сути для тестов нужно, остальное все крайне маловероятное да
@polinajs
@polinajs Жыл бұрын
@@ievgenk.8991 ваш коммент это самое полезное, что я нашла в русскоязычном интернете ❤
@andreygrigorev8366
@andreygrigorev8366 2 жыл бұрын
Привет, Соер Можешь пож подсказать, что ты используешь для навигации по гиту и просмотру ченджей в ролике про ангуляр (где ты исследуешь его исходники) и в ролике про нпм?
@adeskmath
@adeskmath Жыл бұрын
спасибо, как всегда объяснение понятным языком👍
@sovrinfo
@sovrinfo 2 жыл бұрын
Спасибо за видео.Коммент в поддержку!
@holydrug
@holydrug 2 жыл бұрын
Спасибо за видео
@ashimov1970
@ashimov1970 2 жыл бұрын
С удовольствием смотрю твои видео по актуальным для меня вопросам SWE и Comp Sci. Большая просьба как нибудь по возможности (чем скорее, тем лучше, конечно) рассказать об асинхронном программировании и его связи с многопоточным. Заранее благодарю
@berakmonaco9389
@berakmonaco9389 2 жыл бұрын
Спасибо! Расскажите, пожалуйста, ещё про Execution Context
@vampus5561
@vampus5561 Жыл бұрын
Очень доходчивое объяснение. Вроде и знал про EventLoop'ы, и про то, что main организует, но когда начал читать про IoC, то не очень было понятно всё равно куда что передаётся. Теперь понял. Спасибо!
@paulsoja2732
@paulsoja2732 2 жыл бұрын
а какой программой пользуешься для отображения на экране блоков?
@user-sj1ls2pz9j
@user-sj1ls2pz9j Жыл бұрын
Спасибо! Все понятно
@kawaikaino5277
@kawaikaino5277 Жыл бұрын
Более запутанное объяснение сложно найти))
@alekseychaykovskiy3963
@alekseychaykovskiy3963 2 жыл бұрын
Спасибо
@alergeo1
@alergeo1 2 жыл бұрын
Только вчера читал статью по реализации IoC DI. Как пример реализации IoC, был взят модуль сортировки массивов различными способами. Без IoC у тебя куча ифов внутри. В противном случае, делаем IoC контейнер, который будет принимать в себя плагины. А про DI, всё сводится к передачи зависимостей через параметры, а не прямой импорт. Ну и для дальнейшего удобства, делаем привязку зависимостей/ частичное примирение. Можно всё это в фабрику запихать кст. Итого, инверсия контроля позволяет упростить логику, а также даёт возможность к расширению но не к изменению модуля. Инъекция зависимостей, упрощает тестирование модуля, и дальнейшее изменение этих самых зависимостей. Всё это было в контексте ноды. А ну ещё это статье не противоречила тому что я видел у FunFunFunction
@evan_kirk
@evan_kirk 8 күн бұрын
Типа, IoC - это когда мы реализуем абстракции фреймворка, чтобы в последствии он мог вызывать наш код или как? Что-то я запутался с принципами DIP, IoC, DI и т.д. Кто-нибудь, помогите структурировать это все в голове 🥲.
@Anatoly555
@Anatoly555 2 жыл бұрын
04:00 "это всё очень похоже на event loop" А разве все реализации event loop не представляют собой варианты исполнения принципа IoC ? Приложение ведь стартует некий фреймворк, который обменивается мессажами, а программный код представляет собой кучу евентов, один из которых а-ля onClose вызовется перед закрытием приложения, если он есть. Всем управляет фреймворк.
@darkmatiz
@darkmatiz 2 жыл бұрын
а что за шикарная программка для блоков?
@slash7076
@slash7076 2 жыл бұрын
Классно.
@victorklimov5254
@victorklimov5254 2 жыл бұрын
То есть, по сути, при инверсии управления ваш код - это только коллбэки, которые фреймворк "дёргает" в нужное время. Задача программиста сводится к написанию плагинов к уже готовой программной системе
@user-zf6ur9xc5i
@user-zf6ur9xc5i 5 ай бұрын
Да, я тоже так понял. И любое приложение - это некий плагин для операционной системы, кстати.
@slavakazansky4975
@slavakazansky4975 2 жыл бұрын
Почему Вы закрыты для связи?
@user-lc6yf8rz6k
@user-lc6yf8rz6k Жыл бұрын
Это не для самых маленьких.. Соер, сделай команду, где ты будешь курировать других( делать отметку "знак качества"), которые сделают несколько разных полноценных курсов, ориентированных на разные уровни знаний.
@kirillsushilnikov9614
@kirillsushilnikov9614 2 жыл бұрын
как говорится, ничего особо не понял, но очень интересно.
@user-lo5bx9wl5m
@user-lo5bx9wl5m 2 ай бұрын
А внутри фреймворка то что? Тот же майн. Я всегда думал что IoC это про управление зависимостями а не про фреймворки.
@karelalex
@karelalex 2 жыл бұрын
Теперь стало непонятно вот чего. Всякие жависты любят говорить, что мол вот фреймворк спринг делает IOC через DI, но что-то этот самый DI не очень то похож на IOC. Нам ничего не мешает сделать DI при старте программы, а потом вернуть управление в main. И никакого IOCа не случится. Или я чего-то не понимаю?
@DzhigurdaAnton
@DzhigurdaAnton 2 жыл бұрын
я перепутал с депенденси инвершн в телегоамме) Стыдно)
@user-by8ji5nm2o
@user-by8ji5nm2o 2 жыл бұрын
Спасибо, как всегда, отличное видео. Особенно хорошо, что объясняете с самых истоков и в разрезе какой-либо проблемы. А IoC-контейнеры затрагивать не будете? Не совсем понятна новичку их концепция.
@romanbush5164
@romanbush5164 2 жыл бұрын
Ля как будто бы этот принцип месяц назад появился 🤣 спасибо соер, щас это главнейший архитектурный принцип в работе при написании кода
@user-ni4vw6yw8b
@user-ni4vw6yw8b Жыл бұрын
Явно, не хватает примера.
@NeverGTI
@NeverGTI 5 ай бұрын
Фреймворки, библиотеки, куры, овцы, цеппелин... Мартин в "Чистой архитектуре" пояснил базовый принцип IoC на полутора страницах 16 шрифта. А это, простите, шляпа какая то.
@user-oh5jk6kf4x
@user-oh5jk6kf4x 2 жыл бұрын
Проблема: вы пишете интеграцию с вашим сокетным api компьютерной игры, и не знаете как организовать взаимодействие с вашим кодом, обрабатывающим происходящие события. Решение: заходите в гугл с запросом разница dip и ioc и там отличная ссылка на русский stack overflow, чеж вы туда не зашли если вам непонятно? А так, вы пользуетесь методами подписки или расширения: Создаете просто класс, который содержит например приемку сообщений сокета и когда приходит некоторое сообщение вызывает свое событие, на которое реагируют другие. Задаем вопрос, подписчики на событие знают о том, когда произойдет событие? Не знают, значит это IoC, потому что от события зависит когда подписчик отреагирует Как в WordPress, создаете вашу функцию и привязываете её к хуку add_action("admin_init", "имя_вашей_функции"); хреново сделано конечно, потому что передача функции в таком виде это как то можно ошибиться в написании, а так это яркий пример IoC, когда мы привязываемся к хуку мы знаем когда произойдет вызов нашей функции? Мы не знаем, оно произойдет когда фреймворк вызовет нашу функцию, чисто догадываемся, что это произойдет тогда, когда админ панель начнут загружать, но из нашего кода мы явно не задаем это. Альтернативно, можно создать базовый класс, у которого есть некоторый асинхронный цикл прослушивания сообщений у сокета, и когда событие происходит, мы вызываем абстрактный метод OnMessageChanged к примеру. Создаем наследника нашего класса и в нем реализуем этот метод. Из наследника мы не знаем когда наш код будет вызван, в наследнике явно не написано (кодом), как будет вызываться метод, и когда
@user-hc1hl2nx8e
@user-hc1hl2nx8e 2 жыл бұрын
Ты перепутал DIP и IoC.
@user-oh5jk6kf4x
@user-oh5jk6kf4x 2 жыл бұрын
@@user-hc1hl2nx8e спасибо за замечание
@eugenegrib1545
@eugenegrib1545 18 күн бұрын
Подписаться
@vitaliishemetov609
@vitaliishemetov609 Жыл бұрын
Сухо и непонятно
@sergeykovalev7276
@sergeykovalev7276 2 жыл бұрын
Мэйн то все равно остался)
@victorklimov5254
@victorklimov5254 2 жыл бұрын
Только, как правило, мы его уже не пишем сами, а используем уже написанный
@malerx
@malerx 2 жыл бұрын
Чётко. Вот это хорошо, вот это правильно. Делай вещи, Соер.
@dpmnv
@dpmnv 2 жыл бұрын
Надо было добавить к названию видео: и тупых
@user-bz8ip1zo5d
@user-bz8ip1zo5d 2 жыл бұрын
Зачем себя так принижать!
@dpmnv
@dpmnv 2 жыл бұрын
@@user-bz8ip1zo5d это шутка :)
@kirillsushilnikov9614
@kirillsushilnikov9614 2 жыл бұрын
как говорится, ничего особо не понял, но очень интересно.
Stay on your way 🛤️✨
00:34
A4
Рет қаралды 28 МЛН
Finger Heart - Fancy Refill (Inside Out Animation)
00:30
FASH
Рет қаралды 30 МЛН
EVOLUTION OF ICE CREAM 😱 #shorts
00:11
Savage Vlogs
Рет қаралды 13 МЛН
Dependency injection fundamentals in C# - DI vs IoC vs DIP
13:30
Amichai Mantinband
Рет қаралды 29 М.
Dependency INVERSION vs Dependency INJECTION in Python
17:51
ArjanCodes
Рет қаралды 157 М.
Dependency Injection & Inversion of Control
11:00
Ryan Schachte
Рет қаралды 195 М.
Dependency Injection простыми словами
18:17
devschacht
Рет қаралды 85 М.
Stay on your way 🛤️✨
00:34
A4
Рет қаралды 28 МЛН