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 handler</h1>     
     <p><large><span id="output"></span></large></p>

     <script>
          var registeredListener = function () {
               document.getElementById("output").innerHTML = "<large>The registered listener was called.</large>";
          }          
          document.addEventListener( "click", registeredListener, true );

          document.getElementById("output").innerHTML = "<large>The event handler has been registered. If you click the page, your web browser will call the event handler.</large>"

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

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

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

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();

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

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

  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
Номер скриншота №: 5ed180724e023758f0ab2ebc73e73b42__1717065300
URL1:https://arc.ask3.ru/arc/aa/5e/42/5ed180724e023758f0ab2ebc73e73b42.html
Заголовок, (Title) документа по адресу, URL1:
Inversion of control - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)