kykyryky
@kykyryky

Как разобраться с инверсией зависимостей?

Прочитал свежую статью про SOLID. Пример в статье мне понятен, но не понятна одна вещь. В разделе, где автор начинает рассказывать про инверсию зависимостей, есть абзац:

Для этого в своем модуле C он создал интерфейс, и написал простенький адаптер, который принимает зависимость из нужного модуля и предоставляет доступ только к нужному методу. Теперь если вы что-то поправите — исправить "поломку" можно будет в одном месте.


И я запутался. Что такое адаптер? Что значит "принимает зависимость"? Что такое вообще эта зависимость? И как так получилось вдруг, что теперь исправить "поломку" можно будет в одном месте?
Объясните на пальцах пожалста.

p.s. может есть еще хорошие и простые статьи про solid для дурачков? буду благодарен за ссылку.
  • Вопрос задан
  • 309 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Что такое адаптер?


Смотрите. Есть у вас например micro USB кабель. И есть дырка в новом макбуке - Usb type c. Друг в друга они, как вы понимаете, не втыкаются. И можно взять адаптер microUSB -> USB type-c.

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

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

За счет этого достигается независимость.

Что значит "принимает зависимость"?


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

public function changePassword(string $password, PasswordEncoder $encoder)
{
    $this->password = $encoder->encode($password);      
}


Это зависимость нашего метода. Он зависит от него. Диалог между объектами можно представить себе такой:

- Слыш, поменяй пароль на этот
- Оке, только хэшер паролей мне дай, мне очень надо
- А какой тебе?
- Да любой с этим типом
- Ну ок. На вот пароль и хэшер. Делай дела.

Что такое вообще эта зависимость?


Зависимости - это все что мы используем чтобы сделать дела. Это не только библиотечки, но и просто классы, функци и т.д. Весь "сторонний" код с точки зрения нашего кода. И самое важное в том, что "нашим" кодом является тот, над которым мы работаем в данный момент времени, а не все что мы написали. Даже функции, которые есть в языке программирования из коробки являются зависимостями. Вот только от них вам не деться никуда особо, а потому с ними замарачиваться не стоит. Или если есть долговременная поддержка у библиотеки и она устаялась - тоже можно просто использовать. А вот если это поделка на гитхабе с 10-ю звездочками и там до сих пор нет ни одного релиза - но она вам вот очень нужна, возможные поломки в ней (а они рано или поздно будут) стоит "закрыть" адаптером что бы потом поменять на что-то получше или обновить без боли.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
OnYourLips
@OnYourLips
https://ru.wikipedia.org/wiki/Адаптер_(шаблон_прое...
Адаптер (англ. Adapter) — структурный шаблон проектирования, предназначенный для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс.


Что значит "принимает зависимость"?
Получает другой объект, необходимый для своей работы.

И как так получилось вдруг, что теперь исправить "поломку" можно будет в одном месте?
У C и B теперь зависимости от разных классов-адаптеров модуля E, причём по интерфейсу из своего же модуля, а не прямые зависимости.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы