Около 2 месяцев я читал все, что смог найти по этим трем темам, и еще не уверен, что понял.
Инверсия зависимостей Принцип .Это означает, что вы всегда должны полагаться только на интерфейсы, а не на их реализацию. Если ваш класс зависит от любого другого класса, это плохо, потому что это зависит от деталей этого второго класса. Если ваш класс зависит от интерфейса, это абсолютно нормально, поскольку такая зависимость означает только то, что вашему классу нужно что-то абстрактное, которое может делать что-то конкретное, и вам все равно, как он это делает.
Поскольку P в "DIP" означает «Принцип», я, вероятно, должен определить его так: Принцип инверсии зависимостей - это принцип, который требует, чтобы все объекты вашего кода зависели только от деталей, которые им действительно нужны .
Под «деталями, которые им действительно нужны» я имею в виду интерфейсы для простейшего случая. Я также использовал слово «сущности», чтобы подчеркнуть, что DIP также применим к процедурам и всему остальному, а не только к классам.
Внедрение зависимостей . Это применимо только к объектам с включенным DI. Сущность с поддержкой DI - это сущность, которая «открыта» для настройки своего поведения без изменения его внутренних компонентов. Существует 2 основных типа внедрения (когда речь идет о классах):
- Внедрение конструктора - это когда вы передаете объекту все необходимые "абстрактные детали" как раз к моменту его создания.
- Инъекция через сеттер - это когда вы «проясняете» требуемые аспекты после того, как объект уже был создан.
Итак, определение, вероятно, похоже на следующее: Внедрение зависимостей - это процесс передачи «абстрактных деталей» сущности, которая действительно нуждаются в этих деталях .
Под «действительно нуждаются в этих деталях» я подразумеваю интерфейсы для простейшего случая. Слово «сущности», как всегда, используется, чтобы подчеркнуть, что DI также применим к процедурам и всему остальному.
Инверсия управления. Его часто определяют как «различие между библиотеками и фреймворками», как «писать программы так же, как в процедурном программировании» и так далее. Это меня больше всего сбивает с толку. Я считаю, что основная идея здесь заключается именно в инициировании каких-либо действий. Либо вы делаете что-то «когда захотите» (процедурный способ), либо «ждете», пока кто-нибудь вас не спросит (способ IoC).
Мое определение: IoC - это свойство потока выполнения вашей программы, когда вы ничего не делайте, пока они не попросят вас сделать это .
Это звучит в точности как «Голливудский принцип», но я считаю, что «Голливудский принцип» и IoC - абсолютно одинаковая идея .