2009-02-13 3 views
25

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

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

+3

Не «очевидно»: плохо писать на языке А, как если бы это был язык B ». Независимо от чего есть. Написание Python в Perl может быть столь же плохим. –

+3

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

+0

См. Http://stackoverflow.com/questions/127377/programming-languages-and-design-patterns –

ответ

36

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

4

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

+0

Значение Singleton является спорным в любом случае. По теме: шаблоны проектирования - это не что иное, как проточная лента, чтобы исправить недостатки языков. – Dan

12

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

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

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

Пример:

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

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

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

1

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

0

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

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

1

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

4

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

+0

Действительно? Любые примеры? –

+0

Я попытался объяснить свои взгляды, но было очень долго, чтобы разумно вписываться в комментарии, поэтому вместо этого: http://c2.com/cgi/wiki?AreDesignPatternsMissingLanguageFeatures – Dan

+0

«Список DesignPatterns и языковая функция, которая (в значительной степени) заменяет их ". Эти два столбца являются списками шаблонов проектирования. Слева - «Банда четырех моделей». Направляемые справа - это другие шаблоны, которые не входят в книгу GoF. Все еще не вижу, что узоры - это клейкая лента. –

3

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

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

Дункан Бут написал an article on patterns in python.

4

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

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

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

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

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

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

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

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

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

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

0

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

Смежные вопросы