Рубрики
5. Dependency inversion principle SOLID

SOLID «EXAMPLE» Музыкальное приложение

Добавление классов

создаем Spotify похожий класс яндекса - стриминговый сервис, позволяющий легально прослушивать музыкальные композиции, аудиокниги и подкасты, не скачивая их
class SpotifyApi {
 findAll();
}
создаем VK похожий класс яндекса 
class VKMusicApi{
 query(){}
}
общую функциональность интерфейса мы не выносим
нам нужно менять создание соответствующих класса
нам нужно менять вызов соответствующих методов
const MusicApp=()=>{
  const API = new SpotifyApi()
  API.findAll()
}

Мы решаем
одинаковые названия методов
получаем возможность заниматься полиморфизмом

  • создать общий интерфейс
  • добавляем метод getTracks в интерфейс
  • гиплементируем этот интерфейс в каждый класс
interface MusicApi{
 getTracks: () => void;
}
class YandexMusicApi implements MusicApi{
 getTracks: () => void {}
}
class SpotifyApi implements MusicApi{
 getTracks: () => void {}
}
class VKMusicApi implements MusicApi{
 getTracks: () => void {}
}

Если в определенном количестве разных файлов используем SpotifyApi и вдруг мы решили использовать YandexMusic
менять придётся руками

const MusicApp = () => {
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
...
API.getTracks()
}

Создание абстракции.
Звено между клиентом и различными видами Api для получения музыки

class MusicClient implements MusicApi {
 через конструктор мы получаем соответствующий клиент
 yandex,spotify,VK
 client: MusicApi;
 constructor(client: MusicApi){
  this.client=client;
}
 getTracks(){
  делегируем вызова метода соответcвующему Api
  this.client.getTracks();
 }
}
const MusicApp=()=>{
  все взаимодействие с api мы ведем через музыкальный клиент
  нам абсолютно все равно получаем мы музыку с yandex,spotify,VK
  но в любой момент мы это поведение можем изменить и при этом сделать это только в одном месте
  const API: MusicApi = new MusicClient(new SpotifyApi())
  API.getTracks()
} 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *