Принципы проектирования 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, скорее всего, будут шаблонами более высокого уровня, а не сложными задачами для какие шаблоны обычно необходимы.