Что такое инверсия контроля?

Короткий ответ: языковые дизайнеры решили создать язык таким образом.

Длинный ответ: Section 6.2.2: Explicit enumeration conversions спецификации языка C # говорит:

явное преобразование перечислений между двумя типами обрабатывается обработкой любого участвующего enum-типа в качестве базового типа этого типа перечисления, а затем выполнения неявного или явного количественного преобразования между результирующими типами. Например, с учетом типа E с перечислением и базового типа int преобразование из E в байт обрабатывается как явное числовое преобразование (§6.2.1) от int до байта, а преобразование из байта в E обрабатывается как неявное числовое преобразование (§6.1.2) из ​​байта в int.

В принципе, enum рассматривается как базовый тип, когда дело доходит до преобразования операция. По умолчанию базовый тип enum - Int32, что означает, что преобразование обрабатывается точно так же, как преобразование в Int32. Это означает, что допустимое значение int допустимо.

Я подозреваю, что это было сделано главным образом по соображениям производительности. Сделав enum простым интегральным типом и разрешив любое интегральное преобразование типа, CLR не нужно выполнять все дополнительные проверки. Это означает, что использование enum действительно не имеет потери производительности по сравнению с использованием целого числа, что, в свою очередь, способствует его использованию.

1647
задан Abhinav 4 February 2019 в 12:26
поделиться

13 ответов

Шаблоны Инверсии управления (IoC) и Внедрения зависимости (DI) - все об удалении зависимостей от Вашего кода.

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

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

то, Что мы сделали здесь, создает зависимость между TextEditor и SpellChecker. В сценарии МОК мы вместо этого сделали бы что-то вроде этого:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

В первом примере кода мы инстанцируем SpellChecker (this.checker = new SpellChecker();), что означает TextEditor, класс непосредственно зависит от SpellChecker класс.

Во втором примере кода мы создаем абстракцию при наличии SpellChecker класс зависимости в [1 110] подпись конструктора (не инициализирующий зависимость в классе). Это позволяет нам звонить, зависимость тогда передают его классу TextEditor как так:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

Теперь клиент, создающий TextEditor, класс имеет контроль, по которому SpellChecker реализация для использования потому что мы вводим зависимость к TextEditor подпись.

Это - просто простой пример, существует хороший ряд статей Simone Busoli, который объясняет его более подробно.

1348
ответ дан Luca Ritossa 4 February 2019 в 12:26
поделиться

Инверсия Управления - то, что Вы получаете когда Ваши обратные вызовы программы, например, как gui программа.

, Например, в старом школьном меню, Вы могли бы иметь:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

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

В программе GUI или somesuch, вместо этого мы говорим:

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

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

В основном, что-либо с циклом событий, обратными вызовами, или выполняется, триггеры попадает в эту категорию.

559
ответ дан Hearen 4 February 2019 в 12:26
поделиться

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

Как в этом примере с TextEditor: если у Вас есть только один SpellChecker, возможно, не действительно необходимо использовать МОК? Если Вы не должны писать модульные тесты или что-то...

Так или иначе: будьте разумны. Шаблон разработки хорошие методы , но не Библия, которая будет проповедоваться. Не засовывайте его везде.

43
ответ дан Michal Sznajder 4 February 2019 в 12:26
поделиться

МОК / DI мне выставляет зависимости к вызывающим объектам. Супер простой.

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

39
ответ дан ferventcoder 4 February 2019 в 12:26
поделиться

Я соглашаюсь с NilObject, но я хотел бы добавить к этому:

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

, Если Вы копируете и вставить код вокруг, Вы почти всегда делаете что-то неправильно. Шифруемый как принцип разработки Однажды и Только Однажды .

16
ответ дан Community 4 February 2019 в 12:26
поделиться
  1. Инверсия управления является шаблоном, используемым для разъединения компонентов и слоев в системе. Шаблон реализован посредством введения зависимостей в компонент, когда это создается. Эти зависимости обычно обеспечиваются как интерфейсы для дальнейшего разъединения и поддерживать тестируемость. МОК / контейнеры DI, такие как замок Windsor, Единица является инструментами (библиотеки), которыми можно пользоваться для обеспечения МОК. Эти инструменты обеспечивают расширенные функции выше и вне простого управления зависимостью, включая время жизни, AOP / Перехват, политика, и т.д.

  2. a. Облегчает компонент от того, чтобы быть ответственным за управление, это - зависимости.
    b. Обеспечивает способность подкачать реализации зависимости в различных средах.
    c. Позволяет компоненту быть протестированным посредством насмешки зависимостей.
    d. Обеспечивает механизм для совместного использования ресурсов всюду по приложению.

  3. a. Очень важный при выполнении разработки через тестирование. Без МОК может быть трудно протестировать, потому что компоненты под тестом высоко связаны с остальной частью системы.
    b. Очень важный при разработке модульных систем. Модульная система является системой, компоненты которой могут быть заменены, не требуя перекомпиляции.
    c. Очень важный, если существует много сквозных проблем, которым нужно к обращенному, partilarly в корпоративном приложении.

25
ответ дан Michał Powaga 4 February 2019 в 12:26
поделиться
  1. Так номер 1 выше . , Что такое Инверсия Управления?

  2. Обслуживание является вещью номер один, которую оно решает для меня. Это гарантирует, что я использую интерфейсы так, чтобы два класса не были близкими друг с другом.

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

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

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

я записал его однажды, но теперь я могу ввести много типов в этот набор кода, если я публикую различные типы сообщений. Я могу также записать картопостроители, которые берут запись того же типа и отображают их на различные сообщения. Используя DI с Дженериками дал мне способность записать очень мало кода для выполнения многих задач.

, О, да, существуют проблемы тестируемости, но они вторичны к преимуществам МОК/DI.

я определенно люблю МОК/DI.

3. Это становится более соответствующим минута, у Вас есть проект среднего размера несколько большей сложности. Я сказал бы, что это становится соответствующим минута, Вы начинаете чувствовать боль.

3
ответ дан Community 4 February 2019 в 12:26
поделиться
  1. Статья Википедии. Мне инверсия управления поворачивает Ваш последовательно записанный код и превращает его в структуру делегации. Вместо Вашей программы, явно управляющей всем, Ваша программа настраивает класс или библиотеку с определенными функциями, которые назовут, когда определенные вещи происходят.

  2. Это решает дублирование кода. Например, в былые времена Вы вручную записали бы свой собственный цикл событий, опросив системные библиотеки относительно новых событий. В наше время, самые современные API, которые Вы просто говорите системным библиотекам, какие события Вы интересуетесь, и это сообщит, когда они произойдут.

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

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

64
ответ дан NilObject 4 February 2019 в 12:26
поделиться

я прочитал много ответов для этого, но если кто-то все еще смущен и нуждается плюс крайний "laymans в термине", чтобы объяснить, что МОК вот является моим взятием:

Воображают родителя и ребенка, говорящего друг с другом.

Без МОК:

*Parent: можно только говорить, когда я задаю Вам вопросы, и можно только действовать, когда я даю Вам разрешение.

Родитель : Это означает, Вы не можете спросить меня, если можно поесть, играть, перейдите к ванной или даже спите, если я не спрашиваю Вас.

Родитель : Вы хотите поесть?

Ребенок : Нет.

Родитель : Хорошо, я вернусь. Ожидайте меня.

Ребенок : (Хочет играть, но так как нет никакого вопроса от родителя, ребенок ничего не может сделать).

После 1 часа...

Родитель : я вернулся. Вы хотите играть?

Ребенок : Да.

Родитель : Разрешение дано.

Ребенок : (наконец удается играть).

Этот простой сценарий объясняет, что управление центрируется к родителю. Свобода ребенка ограничивается и высоко зависит от вопроса родителя. Ребенок может ТОЛЬКО [1 132] говорить при выяснении говорить, и может ТОЛЬКО [1 133] действие когда данное разрешение.

С МОК:

у ребенка есть теперь способность задать вопросы, и родитель может ответить ответами и полномочиями. Просто означает, что управление инвертируется! Ребенок теперь свободен задать вопросы в любое время и хотя существует все еще зависимость с родителем относительно полномочий, он не зависит в средствах разговора/выяснения вопросов.

технологическим способом объяснить, это очень похоже на console/shell/cmd по сравнению со взаимодействием GUI. (Который является ответом Mark Harrison выше № 2 главного ответа). В консоли Вы зависите от, какой спрашивается/отображается Вам, и Вы не можете перейти к другим меню и функциям, не отвечая, что это - вопрос сначала; после строгого последовательного потока. (программно это похоже на цикл метода/функции). Однако с GUI, меню и функции размечаются, и пользователь может выбрать то, что ему нужно таким образом наличие больше управление и быть менее ограниченным. (программно, меню имеют обратный вызов при выборе и действие происходит).

5
ответ дан 22 November 2019 в 20:09
поделиться

Например, задача № 1 - создать объект. Без концепции IOC задача № 1 должна быть выполнена Programmathty.but с концепцией IOC, задача № 1 будет выполняться контейнером.

Кратко управление перевернуты из программиста к контейнеру. Итак, это называется инверсией контроля.

Я нашел один хороший пример здесь .

17
ответ дан 22 November 2019 в 20:09
поделиться

Перед использованием инверсии управления вы должны хорошо знать тот факт, что он имеет свои плюсы и минусы, и если вы это сделаете, вы должны знать, зачем вы его используете.

Плюсы:

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

Минусы:

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

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

89
ответ дан 22 November 2019 в 20:09
поделиться

Что такое инверсия управления?

Если вы последуете этим простым два шага, вы выполнили инверсию управления:

  1. Отделите часть what -to-do от , когда часть -to-do).
  2. Убедитесь, что , когда часть знает как мало о , что часть ; и наоборот.

Существует несколько возможных методов для каждого из этих шагов в зависимости от технологии / языка, которые вы используете для своей реализации.

-

инверсия часть инверсии управления (IoC) сбивает с толку; потому что инверсия является относительным членом. Лучший способ понять IoC - это забыть об этом слове!

-

Примеры

  • Обработка событий. Обработчики событий (часть «что делать») - создание событий (часть «когда делать»)
  • Интерфейсы. Компонентный клиент (часть выполнения) - реализация интерфейса компонентов (часть выполнения)
  • Приспособление xUnit. Setup и TearDown (часть, что делать) - фреймворк xUnit вызывает Setup в начале и TearDown в конце (часть, когда нужно делать)
  • Шаблон проектирования метода шаблона. шаблонный метод when-to-do part - реализация примитивного подкласса what-to-do part
  • Методы контейнера DLL в COM. DllMain, DllCanUnload и т. Д. (Часть действий) - COM / OS (часть выполнения)
405
ответ дан 22 November 2019 в 20:09
поделиться

С тех пор уже существует много ответов для вопроса, но ни один из них не показывает разбивку срока Управления Инверсией, который я вижу возможность дать более краткому и полезному ответу.

Инверсия Управления является шаблоном, который реализует Принцип инверсии зависимости (DIP). DIP указывает следующее: 1. Высокоуровневые модули не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций (например, интерфейсы). 2. Абстракции не должны зависеть от деталей. Детали (конкретные реализации) должны зависеть от абстракций.

существует три типа Инверсии Управления:

Интерфейсная Инверсия Поставщики shouldn’t определяют интерфейс. Вместо этого потребитель должен определить интерфейс, и поставщики должны реализовать его. Интерфейсная Инверсия позволяет устранять необходимость изменить потребителя каждый раз, когда новый поставщик добавил.

Инверсия Потока управление Изменениями потока. Например, у Вас есть консольное приложение, где Вы попросили вводить много параметров и после каждого вводимого параметра, Вы вынуждены нажать Enter. Можно применить Инверсию Потока здесь и реализовать настольное приложение, где пользователь может выбрать последовательность ввода parameters’, пользователь может отредактировать параметры, и на заключительном шаге, пользователь должен нажать Enter только однажды.

Инверсия Создания Это может быть реализовано следующими шаблонами: Шаблон "фабрика", Сервисный Локатор и Внедрение зависимости. Инверсия создания помогает устранить зависимости между типами, перемещающими процесс создания объектов зависимости за пределами типа, который использует эти объекты зависимости. Почему зависимости плохи? Вот несколько примеров: прямое создание нового объекта в Вашем коде делает тестирование тяжелее; невозможно изменить ссылки в блоках без перекомпиляции (принципиальное нарушение OCP); Вы can’t легко заменяете настольный UI веб-UI.

3
ответ дан 22 November 2019 в 20:09
поделиться