Применяются ли принципы проектирования ОО к Python? - PullRequest
25 голосов
/ 13 февраля 2009

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

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

Ответы [ 10 ]

36 голосов
/ 13 февраля 2009

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

12 голосов
/ 13 февраля 2009

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

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

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

Пример:

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

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

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

4 голосов
/ 14 февраля 2009

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

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

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

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

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

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

  • «Вот ошибка, которую мы продолжаем писать на наших текущих языках.»

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

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

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

4 голосов
/ 13 февраля 2009

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

4 голосов
/ 13 февраля 2009

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

3 голосов
/ 13 февраля 2009

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

Шаблон итератора также используется в Python, хотя и в несколько ином виде.

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

1 голос
/ 13 февраля 2009

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

1 голос
/ 13 февраля 2009

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

0 голосов
/ 21 января 2010

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

0 голосов
/ 13 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...