Внедрение зависимостей — это шаблон проектирования приложений, также называемый DI, который был введен в angular dart 2, и совсем недавно мне пришлось ломать голову над ним, следуя руководству по обучению для тура по героям.
Я совершенно уверен, что некоторые разработчики angular dart столкнулись с некоторыми проблемами в понимании того, что такое внедрение зависимостей и насколько оно важно при написании крупномасштабных программ.
Я полностью хотел пропустить внедрение зависимостей в процессе обучения, но, посмотрев на него довольно хорошо с разных точек зрения, я хотел бы сообщить вам, что внедрение зависимостей не должно быть чем-то, чего вы должны избегать, но чем-то, что вы должны принять из-за его гибкость и организованность.
В этом кратком руководстве по внедрению зависимостей я собираюсь использовать сценарий Автомобиль, двигатель, шины и топливо, используемый в документации углового дротика, но с лучшим объяснением и описанием сценария из реальной жизни.
Давайте начнем.
Во-первых, создайте один файл дротика и внутри него создайте класс для Car и объявите переменную экземпляра типа String для двигателя, типа String для шин и типа Integer для топлива. .
Имя переменной Engine будет состоять из информации о типе двигателя, используемого классом Car, шины будут содержать информацию о названии шины, используемой автомобилем, и, наконец, топливо состоит из информации о том, литров топлива требуется для исправной работы автомобиля.
Теперь давайте посмотрим на это с другой стороны: автомобиль, по крайней мере, зависит от двигателей, шин и топлива, чтобы он функционировал хорошо, за исключением случаев, когда вы намерены стать суперменом в своей поездке. Переменные-зависимости здесь — это двигатель, шины и топливо, а класс Car зависит от них, поэтому наша программа выглядит так.
class Car{ String engine; String tires; int fuel; }
Мы все работали над классами и имеем достаточно опыта в том, как они работают.
Теперь переменная экземпляра класса Car или переменная зависимости не могут работать где-либо еще, потому что они предназначены просто для класса Car, но что, если нам нужен новый BugattiCar с другим значением для класса Car Двигатель и шины, но тот же литр топлива.
Мы не можем использовать переменную зависимости топлива в классе Car в классе BugattiCar, что означает, что мы должны создать другую переменную зависимости внутри класс BugattiCar. В простой программе это не имеет особого значения, но в больших программах имеет значение, отсюда и необходимость внедрения зависимостей в angular dart.
Поэтому мы собираемся решить эту проблему и сделать ее более подходящей для крупномасштабных приложений. Вернемся к реальному сценарию: нам нужны двигатели, шины и топливо для всех автомобилей, включая BugattiCar, но что, если мы хотим использовать одни и те же двигатели для разных автомобилей? например TeslaCar, MustangCar и т. д.
Чтобы решить эту проблему, мы создадим класс carBuildingRequirements и объявим все переменные зависимости в этом классе и избавимся от всех переменных зависимостей, объявленных в классе Car, поэтому наш код выглядит так:
class Car{ } class carBuildingRequirements{ String engine; String tires; int fuel; carBuildingRequirements(this.engine, this.tires, this.fuel); }
При этом, если мы создадим класс BugattiCar, TeslaCar или blahblahCar, мы сможем начать извлекать нужные нам детали из carBuildingRequirements, поэтому нам не нужно повторять код снова и снова.
Итак, внутри класса Car мы создаем экземпляр класса carBuildingRequirement, и наш код выглядит следующим образом:
class Car{ //Instance of class carBuildingRequirements carBuildingRequirements requirements = new carBuildingRequirements(‘4 cylinders’, ‘3 durex tires’, 20); } class carBuildingRequirements{ String engine; String tires; int fuel; carBuildingRequirements(this.engine, this.tires, this.fuel); }
Но проблема с этим приведенным выше кодом заключается в том, что если мы создаем автомобиль, мы застреваем с описанием двигателя, описанием шин и требуемыми литрами топлива в параметре carBuildingRequirements в классе Автомобиль. Возможно, со временем Car требует больше литра топлива для правильной работы, но у нас нет гибкости для внесения изменений, пока мы не перепишем параметр carBuildingRequirements в классе Car.
Вот где внедрение зависимостей весьма полезно; класс carBuildingRequirements является зависимостью класса Car, а также будет зависимостью любого другого произведенного автомобиля.
Итак, теперь мы не создаем экземпляр класса carBuildingRequirements до тех пор, пока не создадим экземпляр класса Car, поэтому мы можем добавить наш Car и передайте параметр для доступа к текущему вызову члена с помощью ключевого слова this. Итак, наш код выглядит так:
class Car{ carBuildingRequirements requirements; Car(this.requirements); } class carBuildingRequirements{ String engine; String tires; int fuel; carBuildingRequirements(this.engine, this.tires, this.fuel); }
Итак, у нас есть тип carBuildingRequirements с именем переменной requirements, и это будет зависимость в Конструктор >Car с синтаксическим сахаром.
Уф, довольно много работы, ну, мы почти закончили.
Таким образом, в основном методе экземпляр Car требует новых аргументов, поэтому мы создаем здесь экземпляр carBuildingRequirements. При этом наш основной метод выглядит так.
main(){ Car bugattiCar = new Car(new carBuildingRequirements(‘3 cylinder’, ‘durex tires’, 20)); print(bugattiCar.requirements.engine); }
Поэтому, когда мы создаем автомобиль, мы создаем требования к зданию, и благодаря этому у нас больше гибкости в нашем коде.
Давайте создадим teslaCar вместе с bugattiCar и посмотрим, как внедрение зависимостей делает наш код более гибким.
main(){ //Bugatti car Car bugattiCar = new Car(new carBuildingRequirements(‘3 cylinder’, ‘durex tires’, 20)); print(‘Bugatti car requires ‘ ‘${bugattiCar.requirements.engine},’ ‘ four ${bugattiCar.requirements.tires}’ ‘ and ${bugattiCar.requirements.fuel}’ ‘ liters of fuel to function well.\n’); //Tesla Car Car teslaCar = new Car(new carBuildingRequirements(‘8 cylinder’, ‘gold tires’, 80)); print(‘Tesla car requires ‘ ‘${teslaCar.requirements.engine},’ ‘ four ${teslaCar.requirements.tires}’ ‘ and ${teslaCar.requirements.fuel}’ ‘ liters of fuel to function well\n’); } class Car{ carBuildingRequirements requirements; Car(this.requirements); } class carBuildingRequirements{ String engine; String tires; int fuel; carBuildingRequirements(this.engine, this.tires, this.fuel); }
Здорово!!! , мы все знаем, как работает внедрение зависимостей, и позже мы рассмотрим, как его можно использовать в приложении angular dart.
Первоначально опубликовано на medium.com 26 ноября 2018 г.