Введение в шаблон стратегии | https://codewithshabib.com

При разработке программного обеспечения в реальной жизни мы постоянно сталкиваемся с проблемой, связанной с изменением требований. Любой, кто участвует в бизнес-игре программного обеспечения, знает, как часто и радикально спецификации программного обеспечения могут меняться в любое время. По этой причине в разработке программного обеспечения неизменной считается только одна вещь: ИЗМЕНЕНИЕ!

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

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

Предположим, что мы в софтверной компании BadAss Softwares Inc, где мы создаем несколько отличных программ. Теперь наш клиент, г-н Биг Босс, хочет сделать программное обеспечение для умной машины. Его первоначальные требования просты:

  • Я хочу умную машину.
  • Он может водить.
  • Оно может говорить.

Выполнить это требование, как считает наш звездный разработчик Джонни Доу, очень просто! Итак, он пишет следующий код.

Мистер Биг счастлив, он получил то, что просил. И мы тоже счастливы. Но теперь приходит вызов; кто-то подал мистеру Бигу идею, зачем только водить машину и говорить. Это чертовски умный автомобиль, он должен стремиться к большему! Итак, г-н Биг меняет это требование на следующее:

  • Да, я хочу умную машину, которая может делать все предыдущие вещи.
  • Я хочу еще одну супер умную машину, она должна ездить не только по дороге, но и по воде! (Ну, не смейся!)

Теперь Джонни умный. Ему нравится повторно использовать как можно больше частей кода. Итак, как бы он это спроектировал? А вот и наш милый друг Наследство! Итак, Джони создает подкласс SmartCar и добавляет новый метод driveOnWater. Круто, не правда ли?

Теперь мы снова осчастливили Мистера Бига! Как это круто!

Но у мистера Бига есть нечто большее, теперь он хочет сделать умный автомобиль, который может не только ехать по дороге, но и летать (но не может ехать по воде)! Теперь у Джонни небольшие проблемы, так как он не может просто создать еще один подкласс для поддержки этого. Как бы он справился с этим вопросом? Ну, как я уже сказал, Джонни умен! Он знает что-то под названием Интерфейс, отличный инструмент в ООП (который в нашем случае в Swift известен как протокол)! Так, как «езда по дороге» и другие черты общие, кроме «езды по воде». Он создает протокол с именем Flyable и создает еще один подкласс SmartCar.

Теперь у нас есть SmartCar, SuperSmartCar и FlyingSmartCar, которые могут бегать по дороге и разговаривать с вами! Мистер Биг доволен, наша компания довольна, а Джонни получил солидный бонус! Но хорошие дни не длятся долго. Из-за сложных функций автомобили мистера Бига не так хорошо зарекомендовали себя на рынке, поскольку людям это не нравится. Итак, мистер Биг проводит общественный опрос и выясняет, что людям не нужны все машины, они хотят машину, которая ездит по дороге, лодку, которая едет по воде, и самолет, который летает в воздухе. Итак, он снова звонит в нашу фирму и снова меняет требование:

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

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

  • Все продукты являются транспортными средствами и могут обмениваться сообщениями, поэтому он может написать класс транспортных средств с этой опцией.
  • Автомобиль может говорить и бегать по дороге, но не может летать или бегать по воде.
  • Лодка может говорить и бегать по воде, но не может летать или бегать по дороге.
  • Самолет может говорить и летать, но не может бегать по воде или дороге.

Теперь, когда Джонни узнал, что клиент может изменить требование в любое время, он также думает о следующем:

  • Что, если мистеру Бигу понадобится другой автомобиль, который снова сможет ездить как по воде, так и по дороге?
  • Что, если мистеру Бигу понадобится еще одно транспортное средство, способное летать и ездить по дорогам?
  • Что, если мистеру Бигу нужен другой автомобиль, который может делать все это?

Итак, теперь, чтобы ответить на эти вопросы, Джонни делает следующее:

  • Создает отдельные классы путем создания подкласса класса Vehicle, что гарантирует, что все транспортные средства умны и могут общаться.
  • Делает все поведения при запуске интерфейсами/протоколами, чтобы убедиться, что если возникнут какие-либо дополнительные изменения требований, ему нужно только реализовать протокол, чтобы обеспечить поддержку этой функции.

Теперь это последний код Джонни.

Теперь снова все счастливы, а Джонни получает еще один жирный бонус!

Шесть месяцев спустя г-н Биг решает, что рынок изменился, и людям снова нужны многофункциональные автомобили, поэтому он просит нашу компанию снова предоставить ему SmartCarBoat. Теперь у Джонни нет проблем с этим, потому что все, что ему нужно сделать, это реализовать протоколы!

С этой стратегией под рукой, независимо от того, сколько раз мистер Биг изменит свое требование, Джонни может убить его в любое время!

Надеюсь, мне удалось дать представление о том, как работает шаблон стратегии и как его использовать в сценарии реального времени. Конечно, мы можем улучшить это, используя другие способы; Я даю вам подсказку: абстрактный класс. Любые вопросы, отзывы или если вы думаете, что у меня есть некоторые улучшения, не стесняйтесь комментировать!

Удачного кодирования! 😁

Первоначально опубликовано на сайте codewithshabib.com 5 февраля 2017 г.