Применимы ли принципы объектно-ориентированного проектирования к Python?

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

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


person Jim    schedule 13.02.2009    source источник
comment
Не «очевидно»: плохо писать на языке А, как если бы это был язык Б ». Независимо от того, что есть что. Писать Python на Perl может быть так же плохо.   -  person Adriano Varoli Piazza    schedule 13.02.2009
comment
Сами шаблоны проектирования не зависят от языка - некоторые тексты могут использовать определенный язык для обсуждения реализаций, хотя шаблоны предназначены для того, чтобы быть на другом уровне абстракции.   -  person Geoglyph    schedule 13.02.2009
comment
См. stackoverflow.com/questions/127377/   -  person S.Lott    schedule 13.02.2009


Ответы (10)


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

person dsimcha    schedule 13.02.2009

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

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

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

Пример:

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

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

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

person user21714    schedule 13.02.2009

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

person Devin Jeanpierre    schedule 13.02.2009
comment
В любом случае ценность Синглтона остается спорной. По теме: шаблоны проектирования - это не что иное, как клейкая лента для исправления языковых недостатков. - person ; 13.02.2009

Шаблоны дизайна - это не более чем клейкая лента для исправления языковых недостатков.

person Community    schedule 13.02.2009
comment
Я пытался объяснить свои взгляды, но это было слишком долго, чтобы уместиться в комментариях, поэтому вместо этого: c2. com / cgi / wiki? AreDesignPatternsMissingLanguageFeatures - person ; 13.02.2009
comment
Список шаблонов дизайна и языковая функция, которая (в основном) их заменяет. Оба столбца представляют собой списки шаблонов проектирования. Слева - шаблоны "Банда четырех". Справа - другие шаблоны, которых нет в книге GoF. До сих пор не вижу, что выкройки - это изолента. - person S.Lott; 13.02.2009
comment
Если вы добавите языковую функцию для замены шаблона проектирования, вам просто нужно будет разработать новые шаблоны проектирования. Я не думаю, что языки будут развиваться до такой степени, что каждое решение будет уникальным. - person Robert Rossney; 13.02.2009
comment
С.Лотт: По общему признанию, мой комментарий может быть немного чрезмерно обобщенным, и, возможно, вы никогда не сможете создать язык, который не нуждается в шаблонах проектирования, но я действительно думаю, что это хаки кода, используемые для реализации отсутствующих языковых функций. Например, по словам Питера Норвига, Lisp исключает .. - person ; 13.02.2009
comment
.. необходимость или скрывает 16 шаблонов проектирования GoF: norvig.com/design-patterns/ img010.gif Я не утверждаю, что шаблоны проектирования бесполезны, просто некоторые языки не требуют некоторых из них, поскольку определенные языковые особенности устраняют их необходимость. Например, в Python я не использую шаблоны проектирования .. - person ; 13.02.2009
comment
... почти так же, как в Java или C ++, потому что функции языка Pythons (например, наиболее часто используемым, вероятно, являются итераторы) либо сводят на нет потребность в них, либо делают их прозрачными. Думаю, можно сказать, что они все еще используются, просто встроены в язык. - person ; 13.02.2009
comment
@Dan: Шаблоны проектирования встречаются повсюду, на всех уровнях абстракции, во всех человеческих начинаниях. Искусство, музыка, театр, литература, архитектура, инженерия. Паттерны дизайна повсюду. Перемещение чего-либо на язык ничего не меняет - это все еще повторяющийся образец. - person S.Lott; 14.02.2009
comment
Хотя Дэн был бойким, он прав. В частности, движение за шаблоны проектирования часто обращается к особенно проблемным «недостаткам» Java. Когда вещи встроены и спроектированы, идиома, вероятно, будет лучшим названием. - person Gregg Lind; 19.02.2009
comment
Для меня идиома означает хорошо понятный и используемый языковой трюк или конструкцию для выполнения некоторой общей задачи. Это ничем не отличается от шаблона проектирования, за исключением того, что он гораздо более универсален для языка и, следовательно, требует гораздо меньше работы и усилий для использования. - person ; 23.02.2009

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

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

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

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

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

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

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

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

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

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

person joel.neely    schedule 14.02.2009

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

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

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

person Geoglyph    schedule 13.02.2009

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

person David Z    schedule 13.02.2009

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

person Dustin Getz    schedule 13.02.2009

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

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

person Akbar ibrahim    schedule 13.02.2009

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

person orokusaki    schedule 21.01.2010