Введение
Техника программного программирования
В разработке программного обеспечения инверсия управления (IoC) — это принцип проектирования, при котором пользовательские части компьютерной программы получают поток управления от обобщенного фреймворка. Термин «инверсия» имеет исторический характер: архитектура программного обеспечения с такой конструкцией «инвертирует» управление по сравнению с процедурным программированием. В процедурном программировании пользовательский код программы вызывает повторно используемые библиотеки для выполнения общих задач, но при инверсии управления фреймворк вызывает пользовательский код. Инверсия управления широко используется в фреймворках разработки приложений с момента появления сред графического пользовательского интерфейса и продолжает использоваться как в средах графического пользовательского интерфейса, так и во фреймворках веб-серверов. Инверсия управления делает фреймворк расширяемым благодаря методам, определяемым программистом приложения. Событийно-ориентированное программирование часто реализуется с использованием IoC, так что пользовательский код должен заботиться только об обработке событий, в то время как цикл событий и диспетчеризация событий/сообщений обрабатываются фреймворком или средой выполнения. Во фреймворках приложений веб-серверов диспетчеризация обычно называется маршрутизацией, а обработчики могут называться конечными точками. Фраза «инверсия управления» также стала использоваться в сообществе программистов Java для обозначения конкретных шаблонов внедрения зависимостей объектов, которые возникают с «IoC-контейнерами» в Java-фреймворках, таких как Spring Framework. В этом другом смысле «инверсия управления» относится к предоставлению фреймворку контроля над реализациями зависимостей, используемых объектами приложения. Таким образом, библиотека возвращает выбранный вариант в качестве значения вызова функции, а основная функция использует это значение для выполнения соответствующей команды. Такой подход был распространен в текстовых интерфейсах. Например, почтовый клиент может отображать экран с командами для загрузки новой почты, ответа на текущую почту, создания новой почты и т. д., и выполнение программы блокируется до тех пор, пока пользователь не нажмет клавишу для выбора команды. При инверсии управления, с другой стороны, программа будет написана с использованием программного фреймворка, который знает общие поведенческие и графические элементы, такие как оконные системы, меню, управление мышью и т. д. Пользовательский код «заполняет пробелы» для фреймворка, например, предоставляет таблицу элементов меню и регистрирует подпрограмму кода для каждого элемента, но именно фреймворк отслеживает действия пользователя и вызывает подпрограмму при выборе элемента меню. В примере почтового клиента фреймворк может отслеживать ввод с клавиатуры и мыши и вызывать команду, вызванную пользователем любым способом, а также одновременно отслеживать сетевой интерфейс, чтобы узнать, поступают ли новые сообщения, и обновлять экран при обнаружении сетевой активности. Тот же фреймворк можно использовать в качестве основы для программы электронной таблицы или текстового редактора. И наоборот, фреймворк ничего не знает о веб-браузерах, электронных таблицах или текстовых редакторах; реализация их функциональности требует пользовательского кода. Инверсия управления подразумевает, что повторно используемый код и код, специфичный для решаемой задачи, разрабатываются независимо друг от друга, хотя они работают вместе в приложении. Обратные вызовы, планировщики, циклы событий и шаблон шаблона — примеры шаблонов проектирования, которые следуют принципу инверсии управления, хотя этот термин чаще всего используется в контексте объектно-ориентированного программирования. (Внедрение зависимостей является примером отдельной, специфической идеи «инвертирования контроля над реализациями зависимостей», популяризированной Java-фреймворками.) но она тесно связана с концепцией инверсии программы, описанной Майклом Джексоном в его методологии структурированного программирования Джексона в 1970-х годах. Парсер снизу вверх можно рассматривать как инверсию парсера сверху вниз: в одном случае управление находится у парсера, а в другом — у принимающего приложения. Термин был использован Майклом Маттссоном в диссертации (с его первоначальным значением фреймворка, вызывающего код приложения, а не наоборот) и затем был взят оттуда Стефано Маццокки и популяризирован им в 1999 году в недействующем проекте Apache Software Foundation Avalon, в котором речь шла о родительском объекте, передающем зависимости дочернего объекта в дополнение к управлению потоком выполнения. Фраза была дополнительно популяризирована в 2004 году Робертом К. Мартином и Мартином Фаулером, последний из которых прослеживает происхождение термина к 1980-м годам. Шаблон метода шаблона ASP.NET Core
related to the concept of program inversion described by Michael Jackson in his Jackson Structured Programming methodology in the 1970s. A bottom up parser can be seen as an inversion of a top down parser: in the one case, the
control lies with the parser, while in the other case, it lies with the receiving application. The term was used by Michael Mattsson in a thesis (with its original meaning of a framework calling application code instead of vice versa) and was then taken from there by Stefano Mazzocchi and popularized by him in 1999 in a defunct Apache Software Foundation project, Avalon, in which it referred to a parent object passing in a child object's dependencies in addition to controlling execution flow. The phrase was further popularized in 2004 by Robert C. Martin and Martin Fowler, the latter of whom traces the term's origins to the 1980s. ASP. NET Core
Template method pattern
Рамки веб-приложений
Это пример кода для веб-приложения ASP.NET Core, который создает хост веб-приложения, регистрирует конечную точку и затем передает управление фреймворку:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
var app = builder. Build ;
app. MapGet("/", => "Hello World! ");
app. Run ;