Existem padrões de design desnecessários em linguagens dinâmicas como o Python?

97

Eu comecei a ler o livro de padrões de design pelo GoF. Alguns padrões parecem muito semelhantes com apenas pequenas diferenças conceituais.

Você acha que, dentre os muitos padrões, alguns são desnecessários em uma linguagem dinâmica como o Python (por exemplo, porque eles são substituídos por um recurso dinâmico)?

    
por Gerenuk 24.07.2012 / 09:18
fonte

8 respostas

89

Peter Norvig demonstra que 16 dos 23 padrões de design encontrados no livro do GOF são invisíveis ou mais simples em linguagens dinâmicas (ele se concentra em Lisp e Dylan).

Desde que você mencionou o Python, há uma apresentação interessante de Alex Martelli sobre o assunto. Também relacionado com o Python, há um post no blog demonstrando seis padrões de design no Python idiomático .

Eu também mantenho um repositório do github com implementações (por outras pessoas) dos padrões de design mais comuns no Python .

    
por 24.07.2012 / 21:48
fonte
59

Nenhum padrão de design é necessário. Em qualquer idioma.

Eu costumo me deparar com um monte de código escrito por pessoas que lêem padrões de design e depois acham que devem usá-los em todo o lugar. O resultado é que o código real fica enterrado sob toneladas de interfaces, wrappers e camadas e é muito difícil de ler. Essa é uma abordagem errada para projetar padrões.

Existem padrões de design para que você tenha um repertório de expressões úteis úteis quando se deparar com um problema. Mas você nunca deve aplicar nenhum padrão antes de identificar o problema. Keep It Simple Stupid deve ser sempre o princípio de governo superior.

Também ajuda pensar em padrões de design como um conceito para pensar sobre o problema em vez de um código clichê específico para escrever. E sobre muito do clichê como solução alternativa para o Java sem funções gratuitas e objetos de função padrão que você usa na maioria das outras linguagens que os possuem (como Python, C #, C ++ etc).

Eu poderia dizer que tenho um padrão de visitante, mas em qualquer idioma com funções de primeira classe, será apenas uma função que toma uma função. Em vez de classe de fábrica, geralmente tenho apenas uma função de fábrica. Eu poderia dizer que eu tenho uma interface, mas então é apenas um par de métodos marcados com comentários, porque não haveria nenhuma outra implementação (claro que em python uma interface é sempre apenas comentários, porque é um tipo de pato). Eu ainda falo do código como usando o padrão, porque é uma maneira útil de pensar sobre isso, mas na verdade não digito todas as coisas até que eu realmente precise delas.

Então, aprenda all os padrões como conceitos . E esqueça as implementações específicas. A implementação varia e deve variar no mundo real, mesmo em Java.

    
por 24.07.2012 / 09:57
fonte
13

Padrão de fábrica abstrata é desnecessário em linguagem com tipos de pato, como Python, praticamente construído na linguagem.

    
por 24.07.2012 / 12:34
fonte
13

O único que vem à mente é o padrão Singleton.

Como o Python não o força a usar classes para tudo , você pode simplesmente usar uma estrutura de dados global. Essa estrutura de dados global poderia ser gerenciada por uma instância, mas você não precisa controlar a instanciação dessa classe, basta criar a instância na importação e deixá-la assim.

Principalmente, Singletons em Python são substituídos por um módulo. Módulos em python são, por sua própria natureza, Singletons; o interpretador python cria uma vez e apenas uma vez.

Todos os outros padrões em Padrões de Design que usei no Python de uma vez ou outra, e você encontrará exemplos deles em toda a biblioteca padrão do Python e no próprio Python.

    
por 24.07.2012 / 09:24
fonte
8

Padrões de design são para o programador, não para o idioma. Os programadores tendem a usar padrões que os ajudam a entender o problema em questão. Nenhum padrão de design é estritamente necessário, mas pode ser útil para ajudar a simplificar o que você está tentando fazer.

Python, e tipagem de pato especificamente, fornece um fim em torno de muitos padrões e práticas comuns, e muitas das restrições impostas por alguns padrões (privacidade, imutabilidade, etc.) só se mantêm na medida em que o programador concorda para quebrá-los. Mas ainda assim, eles fazem o trabalho enquanto o programador joga junto. Uma porta ainda é uma porta, mesmo que seja emoldurada por paredes imaginárias.

O Python é considerado uma linguagem "multiparadigmática"; você pode usar os padrões que quiser. Isso é intencional. Ele fornece hierarquias de classes complexas, por exemplo, embora sejam completamente desnecessárias e um pouco artificiais. Mas para algumas pessoas essa abstração particular é útil. Não porque o problema exige isso, mas porque o programador o faz. Então lá vai você.

    
por 24.07.2012 / 09:46
fonte
4

O livro original "Design Patterns" documentou e nomeou algumas expressões comuns úteis em linguagens orientadas a objeto, como C ++ e Smalltalk. Mas o Smalltalk é uma linguagem tipada dinamicamente, então não pode ser estritamente uma questão de ser dinâmico.

No entanto, a resposta à sua pergunta ainda é "sim": alguns desses padrões de design serão irrelevantes para os idiomas modernos e dinamicamente tipados. Mais genericamente, haverá padrões de design diferentes em diferentes idiomas, especialmente em diferentes tipos de idiomas.

Para reiterar: um "padrão de design" é simplesmente um nome para um idioma de programação: uma solução comum para um problema freqüentemente encontrado. Idiomas diferentes requerem idiomas diferentes, porque o que é um problema para um idioma pode ser trivial para outro. Nesse sentido, os padrões de design tendem a apontar fraquezas nas linguagens às quais se aplicam.

Assim, você pode procurar outros recursos que tornam as linguagens dinâmicas modernas (ou antigas como o Lisp) mais poderosas, tornando irrelevantes alguns desses padrões de design clássico.

    
por 24.07.2012 / 23:19
fonte
1

Padrões de design são formas de resolver problemas específicos. Se um problema não for atendido, o padrão de resolução não terá uso.

As pessoas estão tentando adaptar os padrões de design em todos os lugares, como se fosse uma prática recomendada ter padrões de design em seu projeto. Isso é outro caminho. Você encontra um problema que pode ser resolvido com um padrão de fábrica? Legal. Adapte-o. Não procure seu código e tente encontrar o lugar certo para implementar um singleton (ou fábrica, ou fachada, ou o que for ...).

Talvez o Python tenha seus próprios padrões de design não disponíveis para pessoas Java e .NET (devido à natureza dessas linguagens)?

    
por 24.07.2012 / 10:48
fonte
1

Eu diria que os padrões são sempre dependentes do idioma. Que a maioria dos padrões de python se parecem com aqueles definidos no GoF é por causa do OOP de Python, o que foi dito OOP não é como OOP (não há duas linguagens definem objetos e sua manipulação é 100% semelhante).

Portanto, não há dúvidas de que alguns padrões não serão aplicáveis "como estão", alguns podem não fazer sentido e existem alguns padrões que podem ser significativos para o Python.

Para voltar exatamente à sua pergunta: os padrões só são necessários se você precisar deles . Você não precisa usá-los se não houver necessidade deles (como Jan Hudec já disse).

Além disso, existem muito mais padrões do que aqueles mencionados no GoF. Veja na wikipedia outros padrões

    
por 10.10.2012 / 16:04
fonte