Принципы проектирования OO применимы к Python?

Кажется, что во многих дискуссиях OO используются примеры Java или С# (например, Head First Design Patterns).

Соответствуют ли эти шаблоны одинаково для Python? Или, если я буду следовать шаблонам проектирования, я просто закончу писать Java на Python (что, по-видимому, очень плохо)?

Ответ 1

Самые большие различия заключаются в том, что Python является утиным, что означает, что вам не нужно планировать иерархии классов так подробно, как в Java, и имеет функции первого класса. Стратегия, например, становится намного проще и очевиднее, когда вы можете просто передать функцию, а не создавать интерфейсы и т.д., Чтобы просто имитировать функции более высокого порядка. В более общем плане Python имеет синтаксический сахар для множества общих шаблонов проектирования, таких как итератор и вышеупомянутая стратегия. Возможно, было бы полезно понять эти шаблоны (я прочитал Head First и нашел, что это очень полезно), но подумайте о путинских способах реализации, а не просто делать то же, что и в Java.

Ответ 2

У Python есть собственные идиомы дизайна. Некоторые стандартные шаблоны применяются, другие - нет. Что-то вроде стратегии или фабрик поддерживают на языке, что делает их прозрачными.

Например, с первоклассными типами все может быть factory. Нет необходимости в типе factory, вы можете использовать класс непосредственно для построения любого объекта, который вы хотите.

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

Пример:

x = list
my_list = x(range(0,5)) #creates a new list by invoking list constructor

Назначая тип класса вызываемому объекту, вы можете по существу удалить все типы < factory 'в коде. Вы остаетесь только с вызывающими, которые создают объекты, которые должны соответствовать определенным соглашениям.

Кроме того, в Python есть шаблоны проектирования, которые просто не могут быть представлены на других статически типизированных языках эффективно. Хорошими примерами этого являются метаклассы и декораторы функций.

Ответ 3

Это зависит от шаблона. Некоторые вещи трудно сделать в Python: пример Singleton. Вы заменяете этот шаблон другим, например, в случае Singleton, Borg.
Это не безумно использовать шаблоны проектирования в Python - например, шаблон Iterator интегрирован в синтаксис. Однако многие вещи просто не выполняются как OO- или тяжелые вещи. Python считается процедурным или функциональным, когда он лучше всего подходит для задачи, и OO тоже.
В целом, я бы сказал, чтобы использовать ваше лучшее суждение. Если кажется, что использование шаблона проектирования Alpha-Gamma является излишним и чрезмерным, то это, вероятно, так. Если кажется, что образец идеально подходит для того, что вы хотите, это, вероятно, есть.

Ответ 4

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

Ответ 5

Короткий ответ: Да; Python - это язык OO.

Слегка длинный ответ: Да; вы можете проектировать с использованием принципов OO, а затем реализовать на любом языке (даже ассемблере).

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

Длинный, многословный, скучный ответ: (Разработка языков программирования не простая линейная прогрессия, но позвольте мне упростить и игнорировать этот факт, чтобы сделать наблюдение который охватывает около 40 лет опыта программирования.)

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

  • "Здесь проблема, которую мы продолжаем решать вручную на нашем текущем языке (языках)".

  • "Здесь ошибка, которую мы продолжаем писать на нашем текущем языке (языках)".

  • "Вот некоторые хорошие практики, которые мы наблюдаем в наших лучших программах".

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

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

Ответ 6

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

Итератор-шаблон также используется в Python, хотя и в несколько иной форме.

Дункан Бут написал статью о шаблонах в python.

Ответ 7

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

Ответ 8

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

Ответ 9

Использование Java или С#, вероятно, связано с популярностью языка.

Но принцип дизайна и/или шаблоны дизайна применяются независимо от языка, который вы используете. Реализация одного и того же шаблона проектирования в Python, очевидно, была бы иной, чем в Java или С#.

Ответ 10

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