Andriy Shyrokoryadov

.Net developer, data scientist

Шаблонный метод. Шаблоны проектирования - видео №1. №36.

Текст к видео "#36 Шаблонный метод" на канале YouTube

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

  • вопросы о шаблонах проектирования на собеседовании встречаются довольно часто и данные вопросы можно разделить на 2 типа. Первый тип – вас просто спросят какие шаблоны проектирования Вы знаете и попросят объяснить работу одного из известных вам шаблона. Второй тип, более сложный – вам покажут пример кода и попросят назвать шаблон проектирования, который был использован в представленном примере.
  • зная шаблоны проектирования, вы будете в состоянии писать более качественный код, вы будете более продуктивны и, по большому счету, вы будете профессионалом своего дела.
  • также знание шаблонов проектирования поможет вам читать и понимать чужой код. Если вы работаете с чужим кодом и автор этого кода использовал шаблоны проектирования, вы быстро поймёте о чём идет речь, как устроена логика и как её можно расширить.

В данный момент я планирую создавать видео о шаблонах проектирования по следующей схеме:

  1. примеры сценариев, когда использование данного шаблона уместно;
  2. теоретическое объяснение как работает данный шаблон;
  3. практический пример с кодом, где будет показана имплементация данного шаблона, и, если это возможно, как данный шаблон позволяет быстро вносить изменения в код, по возможности ничего при этом не ломая;

Первым шаблоном проектирования, с которым мы познакомимся, будет Шаблонный Метод или Template Method на английском языке. Я начал именно с него потому, что данный шаблон проектирования мне нравится: он упорядочивает код, позволяет проследить его логику от начала до конца и я его очень часто использую в моей повседневной практике.

Если вы получили задание, которое представляет собой список определенных последовательных действий, то возможно здесь вы можете использовать Шаблонный Метод. Примером списка действий может быть следующий список:

  1. закипяти жидкость
  2. добавь в чашку основной ингредиент напитка
  3. залей основной ингредиент напитка горячей жидкостью
  4. добавь дополнительный ингредиент

Обратите внимание что я специально не указал о каком напитке идёт речь – это может быть чай, кофе, какао, чай с молоком в английском стиле или вообще простое молоко с сахаром. Давайте рассмотрим каждый из 4 пунктов и подумаем, что может быть под каждым из этих пунктов:

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

Итак – мы выделили 4 шага приготовления горячего напитка из которых один шаг является постоянным (3 шаг) для всех напитков и 3 шага являются изменяемыми. Давайте по этой схеме напишем 2 рецепта горячих напитков: черный чай и кофе с молоком.

Черный чай:

  1. закипяти воду
  2. добавь в чашку чай или пакетик с чаем
  3. залей чай кипятком
  4. добавь сахар по вкусу

Кофе с молоком:

  1. закипяти молоко
  2. добавь в чашку кофе
  3. залей кофе молоком
  4. добавь сахар или специи для кофе по вкусу

А теперь вернемся к программированию. Список последовательных действий, который мы получили от нашего начальства – можно назвать шаблоном. Аналогом шаблона в коде будет абстрактный класс. Каждое действие в списке — это метод. Названия методов должны быть как можно более абстрактными – обратите внимание какие формулировки я выбрал для списка действия для приготовления горячего напитка. Если метод в абстрактном классе общий для всех реализаций данного класса (в нашем случае для каждого напитка), то его можно реализовать в абстрактном классе. В нашем случае метод «залей основной ингредиент напитка горячей жидкостью» является общим для всех и его можно реализовать в абстрактном классе. Остальные 3 метода для каждого напитка уникальны и поэтому они будут обозначены как абстрактные методы в абстрактном классе. То есть реализовать данные методы необходимо в конкретных реализациях абстрактного класса «Горячий напиток», то есть «Чёрный чай» и «Кофе с молоком».

Итого, что мы имеем: 3 класса – 1 абстрактный класс «Горячий напиток», который содержит шаблон и 2 класса реализации абстрактного класса «Чёрный чай» и «Кофе с молоком».

Что мы сделали – то, что является постоянным для всех напитков, мы оставили в абстрактном классе, а то, что изменяется, мы обозначили ключевым словом abstract. То есть мы разделили постоянные и изменяемые части нашего кода.

Теперь давайте посмотрим как это работает в коде.

Пример кода из видео на GitHub

Для открытия файла проекта необходимо Visual Studio 2019.