~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 8FD24D54141FA2F3AA0D3711E01F8447__1717065300 ✰
Заголовок документа оригинал.:
✰ Inversion of control - Wikipedia ✰
Заголовок документа перевод.:
✰ Инверсия управления — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Inversion_of_control ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/8f/47/8fd24d54141fa2f3aa0d3711e01f8447.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/8f/47/8fd24d54141fa2f3aa0d3711e01f8447__translat.html ✰
Дата и время сохранения документа:
✰ 21.06.2024 11:15:04 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 30 May 2024, at 13:35 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Инверсия управления — Википедия Jump to content

Инверсия контроля

Из Википедии, бесплатной энциклопедии

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

Инверсия управления широко используется в средах разработки приложений с момента появления сред с графическим интерфейсом. [1] [2] и продолжает использоваться как в средах с графическим интерфейсом, так и в средах приложений веб-серверов . Инверсия управления делает структуру расширяемой с помощью методов, определенных программистом приложения. [3]

Программирование, управляемое событиями, часто реализуется с использованием IoC, поэтому пользовательский код должен заниматься только обработкой событий, в то время как цикл событий и отправка событий/сообщений обрабатываются платформой или средой выполнения. В средах приложений веб-сервера диспетчеризация обычно называется маршрутизацией, а обработчики могут называться конечными точками.

Фраза «инверсия управления» также стала отдельно использоваться в сообществе Java-программистов для обозначения шаблонов внедрения зависимостей объектов, которые происходят с «контейнерами IoC» в средах Java, таких как среда Spring . [4] В этом другом смысле «инверсия управления» относится к предоставлению платформе контроля над реализациями зависимостей, которые используются объектами приложения. [5] а не к первоначальному значению предоставления потока управления платформой (контроля над временем выполнения кода приложения, например, обратных вызовов).

Обзор [ править ]

Например, при традиционном программировании основная функция приложения может вызывать функции в библиотеке меню, чтобы отобразить список доступных команд и запросить у пользователя выбор одной из них. [6] Таким образом, библиотека вернет выбранную опцию в качестве значения вызова функции, а основная функция использует это значение для выполнения связанной команды. Этот стиль был распространен в текстовых интерфейсах . Например, почтовый клиент может отображать экран с командами загрузки новой почты, ответа на текущую почту, создания новой почты и т. д., а выполнение программы будет блокироваться до тех пор, пока пользователь не нажмет клавишу для выбора команды.

С другой стороны, при инверсии управления программа будет написана с использованием программной среды , которая знает общие поведенческие и графические элементы, такие как оконные системы , меню, управление мышью и так далее. Пользовательский код «заполняет пробелы» для платформы, например, предоставляет таблицу пунктов меню и регистрирует подпрограмму кода для каждого элемента, но именно платформа отслеживает действия пользователя и вызывает подпрограмму при выборе пункта меню. . В примере с почтовым клиентом платформа может отслеживать ввод с клавиатуры и мыши и вызывать команду, вызываемую пользователем любым способом, и в то же время отслеживать сетевой интерфейс , чтобы узнать, поступают ли новые сообщения, и обновлять экран, когда какая-либо сеть активность обнаружена. Эту же структуру можно использовать в качестве основы для программы работы с электронными таблицами или текстового редактора. И наоборот, платформа ничего не знает о веб-браузерах, электронных таблицах или текстовых редакторах; реализация их функциональности требует специального кода.

Инверсия управления подразумевает, что многократно используемый код и код, ориентированный на конкретную задачу, разрабатываются независимо, даже если они работают вместе в приложении. Обратные вызовы , планировщики , циклы событий и метод шаблона — примеры шаблонов проектирования , которые следуют принципу инверсии управления, хотя этот термин чаще всего используется в контексте объектно-ориентированного программирования . ( Внедрение зависимостей — это пример отдельной, специфической идеи «инвертирования контроля над реализациями зависимостей», популяризированной средами Java.) [4]

Инверсию контроля иногда называют «Голливудским принципом: не звоните нам, мы позвоним вам». [1]

Предыстория [ править ]

Инверсия управления — не новый термин в информатике. Мартин Фаулер прослеживает этимологию этой фразы до 1988 года: [7] но это близко связано с концепцией инверсии программы , описанной Майклом Джексоном в его методологии структурированного программирования Джексона в 1970-х годах. [8] Синтаксический анализатор «снизу вверх» можно рассматривать как инверсию парсера «сверху вниз» : в одном случае управление лежит на парсере, а в другом случае — на принимающем приложении.

Этот термин был использован Майклом Мэттссоном в диссертации (с его первоначальным значением как фреймворк, вызывающий код приложения, а не наоборот). [9] и затем был взят оттуда [10] Стефано Маццокки и популяризирован им в 1999 году в несуществующем проекте Apache Software Foundation, Avalon, в котором он относился к родительскому объекту, передающему зависимости дочернего объекта в дополнение к управлению потоком выполнения. [11] Эта фраза была далее популяризирована в 2004 году Робертом К. Мартином и Мартином Фаулером , последний из которых относит происхождение этого термина к 1980-м годам. [7]

Описание [ править ]

В традиционном программировании поток бизнес -логики определяется объектами, которые статически связаны друг с другом. При инверсии управления ход выполнения зависит от графа объектов, который строится при выполнении программы. Такой динамический поток становится возможным благодаря взаимодействиям объектов, которые определяются посредством абстракций. Эта привязка во время выполнения достигается с помощью таких механизмов, как внедрение зависимостей или локатор служб . В IoC код также может быть статически связан во время компиляции, но поиск кода для выполнения осуществляется путем чтения его описания из внешней конфигурации , а не с помощью прямой ссылки в самом коде.

При внедрении зависимостей зависимый объект или модуль связывается с объектом, который ему нужен во время выполнения . Какой конкретный объект будет удовлетворять зависимости во время выполнения программы, обычно невозможно узнать во время компиляции с помощью статического анализа . Хотя здесь этот принцип описан с точки зрения взаимодействия объектов, он может применяться и к другим методологиям программирования, помимо объектно-ориентированного программирования .

Чтобы работающая программа могла связывать объекты друг с другом, объекты должны обладать совместимыми интерфейсами . Например, класс A может делегировать поведение интерфейсу I который реализуется классом B; программа создает экземпляр A и B, а затем вводит B в A.

Используйте [ править ]

Пример кода [ править ]

События HTML DOM [ править ]

Веб-браузеры реализуют инверсию управления событиями DOM в HTML. Разработчик приложения использует document.addEventListener() чтобы зарегистрировать обратный звонок.

<!doctype html> 
 <  html   lang  =  "en"  > 
 <  head  > 
      <  Meta   charset  =  "utf-8"  > 
      <  title  >  DOM Level 2  </  title  > 
 </  head  > 
 <  body  > 
      <  h1  >  DOM Level 2 Event обработчик  </  h1  >      
      <  p  ><  big  ><  span   id  =  "output"  >/  span  ></  big  >/  p  > 

      <  script  > 
           var   RegisteredListener   =   function   ()   { 
                document  .   getElementById  (  «выход»  ).   innerHTML   =   "<large>Вызван зарегистрированный прослушиватель.</large>"  ; 
            }           
           документ  .   addEventListener  (   «клик»  ,   зарегистрированный прослушиватель  ,   правда   ); 

            документ  .   getElementById  (  «выход»  ).   innerHTML   =   "<large>Обработчик событий зарегистрирован. Если вы щелкнете страницу, ваш веб-браузер вызовет обработчик событий.</large>" 

      </  script  > 
 </  body  > 
 </  html  > 

Фреймворки веб-приложений [ править ]

В этом примере кода веб-приложения ASP.NET Core создается узел веб-приложения, регистрируется конечная точка, а затем передается управление платформе: [12]

вар   строитель   =   WebApplication  .   CreateBuilder  (  аргументы  ); 
  вар   приложение   =   строитель  .   Строить  (); 
  приложение  .   MapGet  (  "/"  ,   ()   =>   "Привет, мир!"  ); 
  приложение  .   Бегать  (); 

См. также [ править ]

Ссылки [ править ]

  1. ^ Перейти обратно: а б с Свит, Ричард (25 июня 1985 г.). «Среда программирования Mesa» . Уведомления ACM SIGPLAN . 20 (7): 216–229. дои : 10.1145/17919.806843 .
  2. ^ Visual_Basic_(классический)
  3. ^ Джонсон, Ральф Э.; Фут, Брайан (июнь – июль 1988 г.). «Проектирование повторно используемых классов» . Журнал объектно-ориентированного программирования . 1 (2): 22–35. CiteSeerX   10.1.1.101.8594 . Проверено 29 апреля 2014 г.
  4. ^ Перейти обратно: а б Фаулер, Мартин. «Инверсия управляющих контейнеров и шаблон внедрения зависимостей» . Мартин Фаулер.com . Проверено 4 июня 2023 г.
  5. ^ Перейти обратно: а б «Spring Framework: контейнер IoC» . docs.spring.io . Проверено 25 мая 2023 г.
  6. ^ Внедрение зависимостей .
  7. ^ Перейти обратно: а б Inversion of Control on Martin Fowler's Bliki
  8. ^ «Введение в метод проектирования Джексона» (PDF) .
  9. ^ Мэттссон, Майкл (февраль 1996 г.). «Объектно-ориентированные фреймворки. Обзор методологических проблем» . Департамент компьютерных наук Лундского университета. CiteSeerX   10.1.1.36.1424 . ЛУ-КС-ТР: 96-167.
  10. ^ Стефано Маццокки (22 января 2004 г.). «Об инверсии управления» . Архивировано из оригинала 2 февраля 2004 года.
  11. ^ «Шаблоны IOC — Avalon Framework» . Проект Апач Авалон . Проверено 8 июня 2023 г.
  12. ^ Перейти обратно: а б Райан Новак, Кирк Ларкин, Рик Андерсон. " "Маршрутизация в ASP.Net Core" " . Learn.microsoft.com . Майкрософт . Проверено 25 мая 2023 г. Маршрутизация отвечает за сопоставление входящих HTTP-запросов и отправку этих запросов на исполняемые конечные точки приложения. Конечные точки — это единицы исполняемого кода приложения, обрабатывающие запросы. Конечные точки определяются в приложении и настраиваются при запуске приложения. {{cite web}}: CS1 maint: несколько имен: список авторов ( ссылка )

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 8FD24D54141FA2F3AA0D3711E01F8447__1717065300
URL1:https://en.wikipedia.org/wiki/Inversion_of_control
Заголовок, (Title) документа по адресу, URL1:
Inversion of control - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)