Шаблоны проектирования в Python

27 марта, 2020

Подписывайся на наш канал в Telegram, чтобы ежедневно совершенствоваться в Python. Там выходят задачи, полезные советы и сливы платных курсов - перейти

Перевод статьи Design Patterns in Python

Вступление

Шаблоны проектирования – это многоразовые модели для решения известных и распространенных проблем в архитектуре программного обеспечения.

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

Хорошая презентация шаблона проектирования должна включать в себя:

  • Имя
  • Мотивирующая проблема
  • Решение
  • Последствия

Эквивалентные Проблемы

Если бы вы думали, что это довольно расплывчатое понятие, Вы были бы правы. Например, мы могли бы сказать, что следующий “паттерн” решает все ваши проблемы:

  • Соберите и подготовьте необходимые данные и другие ресурсы
  • Сделайте необходимые расчеты и выполните необходимые работы
  • Сделайте журналы того, что вы делаете
  • Освободите все ресурсы
  • ???
  • Прибыль

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

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

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

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

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

Паттерны, которые могут быть применены к такого рода проблемам, – это то, что мы можем осмысленно назвать паттернами проектирования.

Зачем использовать шаблоны проектирования?

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

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

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

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

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

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

Шаблоны проектирования в Python

Традиционно модели проектирования были разделены на три основные категории: креативные, структурные и поведенческие. Есть и другие категории, такие как архитектурные шаблоны или шаблоны параллелизма, но они выходят за рамки этой статьи.

Существуют также специфические для Python шаблоны проектирования, которые создаются специально вокруг проблем, которые предоставляет сама структура языка, или которые решают проблемы специальными способами, которые разрешены только из-за структуры языка.

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

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

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

Порождающие Паттерны

Структурные шаблоны

  • Adapter
  • Bridge
  • Composite
  • Decorator
  • Facade
  • Flyweight
  • Proxy

Поведенческие шаблоны

  • Chain of Responsibility
  • Command
  • Iterator
  • Mediator
  • Memento
  • Observer
  • State
  • Strategy
  • Visitor

Специфичные Для Python Шаблоны Проектирования

  • Global Object Pattern
  • Prebound Method Pattern
  • Sentinel Object Pattern

Совершенствуй знания каждый день у нас в Телеграм-каналах

Вопросы, реклама — VK | Telegram