Padrões não são gambiarras
Categories: Design Patterns, Engenharia de software -
Ultimamente vi uma série de posts no meu feed reader coincidentemente encadeados falando sobre padrões de projeto e os considerando genericamente gambiarras.
Tudo comecou no post do Giovane Roslindo Kuhn falando como é legal usar patterns para a comunicação da equipe. O entendimento que se dá no código quando ele é estruturado seguindo convenções estabelecidas em padrões. Claro que esse não é uma das características de se usar um padrão, mas sim um beneficiamento dele (mesmo quando evidentemente não necessitaria haver a presença de um padrão).
Motivado por esse post, o Vítor Ferreira Pamplona escreveu um outro dedicado aos anti-patterns e a prejudicial característica da comunidade java ser reconhecida como a comunidade pattern. Evidenciou a necessidade que programadores empolgados com uma nova linguagem agirem como se essa linguagem fosse uma bala-de-prata e resolvesse todos e quaisquer problemas.
Os próprios padrões de projeto conhecidos podem se tornar um anti-pattern se forem usados para um contexto diferente do que se propõe inicialmente. Quem nunca viu aí uma estrutura cheia de commands para simular MVC em um sistema web levante a mão.
Após o post do Vítor o Thiago Arrais publicou um artigo chamando os padrões de "gambiarra com nomes" que acabou gerando outro artigo do Marcos Tapajós no blog da Improve It na mesma linha.
Concordo com muitos pontos colocados por ambos mas quero fazer uma ressalva, uma gambiarra é uma solução improvisada (deveria também ser temporária) e fora dos procedimentos legais. Um padrão pode ser uma gambiarra mas em essência não é.
Gambiarra "Orientação a Objetos"
Se levarmos ao pé da letra essa consideração podemos então supor que Orientação a objetos seria uma gambiarra, porque os desenvolvedores C já simulavam os conceitos de orientação antes do surgimento do C++, que apenas forneceu ADTs nativos específicos para o desenvolvedor. Linguagens como Smalltalk que foram concebidas tendo em mente a orientação a objetos seria únicas verdadeiras OO mesmo que internamente seu interpretador faça algo parecido com uma linguagem não pura. Mas a única diferença entre as duas é a familiaridade da arquitetura interna da linguagem com o padrão/conceito que se deseja implementar. Uma esconde do desenvolvedor a implementação a outra temos que criar nosso próprio dialeto e não se beneficiar das otimizações e checagens que por ventura a plataforma faça.
Vícios
Temos programadores que acham que podem viver conhecendo apenas uma linguagem e que esta deve servir para tudo, com isso aceitam estruturas estabelecidas mesmo que sejam nocivas.
A Sun criou o conceito de Java Beans para componentes visuais e extendeu esse conceito para sua plataforma Enterprise para designar ADTs que encapsulam suas propriedades.
Hoje a maioria dos desenvolvedores quando codificam suas classes o fazem com um passo-a-passo em mente:
- Cria uma classe que representa uma tabela no banco de dados;
- Cria as propriedades referentes as colunas nessa tabela;
- Atribui private para todas as propriedades;
- E por fim cria métodos "set" e "get" para todas as propriedades indiscriminadamente.
Se voce criar uma construção que acesse "objeto.propriedade" é pecado mortal em java, não segue a "convenção".
Em linguagens que implementam o ECMAscript voce tem no BOM (Browser Object Model) o método setProperty(chave, valor) nativo que atribui um valor à propriedade indicada e não necessita implementar um atribuidor para cada método. Sabiamente não existe um getProperty, voce acessa diretamente.
Em java se uma propriedade é read-only tem coerência voce aplicar um private no qualificador e criar um método getX, outra situação é se voce deseja manipular o valor em tempo de execução, então um método get e ou set tem necessidade. Fora isso é desnecessário e a propriedade é pública.
Generalidade vs Especificidade
O problema maior com padrões é querer extender uma linguagem além do que ela foi arquiteturada. Como simular Continuations que é nativo da linguagem Scheme, ou Design By Contract do Eiffel. Voce pode fazer ambos em Java, tanto Continuations como DbC podem ser feitas mas com gambiarras, não são inerentes da arquitetura concebida na plataforma Java. Existem até Framework e Container Java que implementam continuations, mas sofridamente.
Inclusive alguns entusiastas do Ruby mais afoitos (A.K.A novatos) fazem bastante algazarra em listas de discussões de como conseguem fazer uma iteração ou outra operação específica com menos linha de código que linguagens como Java ou C++. Claro que é perda de tempo total tentar dialogar e mostrar a necessidade da escolha ideal para o determinado propósito, os programadores de verdade sabem que Ruby também não será o fim dos tempos, conceitos surgirão e retornarão dependendo da situação.
Outra situação depende do ambiente, como simular MVC em uma ambiente web, devido a diferença de contexto do ambiente http em detrimento ao ambiente standalone de um desktop surgiu o famigerado MVC model 2 que deu cria a aberrações como Struts e derivados. Isso hoje pode ser contornado mas ainda é incipiente.
Na mesma forma acontece com padrões, como o contexto de uma linguagem está atrelada a determinado ambiente é vital incorporar conceitos deste contexto na sua semântica e deixar a extensão para o desenvolvedor do que ser genérica e causar improdutividade com tarefas repetitivas, vide sucesso do ruby na construção de aplicações web com o Ruby On Rails.
Em diversas épocas os padrões como Singleton e Factory vão e voltam com desenvoltura, em momento amado e indispensável, outro odiado e suplantado. Mas são padrões universais para resolver um determinado problema, catalogado e disponível para quando forem requisitados.
Padrões são assim, como quase tudo na vida, desnecessários as vezes e se usados com moderação são benéficos. Como dizia minha vó, "tudo demais é veneno".
13 Responses to “Padrões não são gambiarras”
-
Átila Says:
March 12th, 2007 at 12:02 pmconcordo com vc M ilfont, acho que quem diz que pattern é gambiarra não está sabendo o que está dizendo e quem utiliza-os levianamente é pior ainda..
-
Thiago Arrais Says:
March 12th, 2007 at 12:21 pmMuito bom! Você toca num ponto interessante: os padrões são as gambiarras boas, soluções improvisadas para problemas para os quais a linguagem base não possui solução e que acabam sendo aceitas pela comunidade. São simplesmente parte do nosso processo evolutivo como programadores. Se não houver nenhuma gambiarra, não surgem boas gambiarras e tudo fica na mesma. Padrões não estão na mesma classe de gambiarras que as variáveis globais. Os primeiros vão ser selecionados para se reproduzir e florescer enquanto as últimas estão condenadas à extinção lenta.
Que venham novas gambiarras das boas e que possamos continuar evoluindo sempre.
-
Marcos Tapajos Says:
March 12th, 2007 at 4:05 pmÁtila, uma das coisas que eu citei no meu post é que eu questiono justamente a forma como eu vejo os patterns sendo usados.
Nunca disse que são coisas ruins, justamente mostram a evolução das linguagens e quando digo evolução não me refiro a que uma seja melhor do que a outra, mas sim que uma resolveu atender a um propósito que a outra não havia se proposto a fazer.
Acho que o nome gambiarra acaba tendo um tom pejorativo demais e por isso tem sido interpretado como uma coisa ruim, mas são mecanismos bons, pois levam a evolução.
Se você me perguntar porque eu usei esse termo já que concordo com o tom pejorativo te digo que é porque também é provocativo e chama atenção para o assunto que me inspirou a escrever o post.Um abraço
-
Marcos Tapajos Says:
March 12th, 2007 at 4:34 pmCMilfont, compartilhamos opiniões bem parecidas com relação a saber identificar que as linguagens tem propósitos diferentes e não são balas-de-prata. Já estava para escrever um post sobre isso tem muito tempo só que o post do Thiago Arrais me motivou a fazer isso logo e resolvi pegar o gancho dos patterns para servir como argumento que nenhuma linguagem é perfeita e que as supostas falhas mostram exactamente o propósito de cada linguagem.
Achei muito bom o seu post pois mostra claramente que existem gambiarras boas e são delas que surgem os novos conceitos e as novas linguagens. Como eu disse esse é um termo bem pejorativo, que tal chamarmos os patterns de mecanismos de contorno ?
Brincadeiras a parte entendi seu ponto de vista e não deixo de te dar razão.Um abraço
Tapajós -
Thiago Arrais Says:
March 12th, 2007 at 6:15 pmMarcos, algumas outras opções são “soluções técnicas alternativas”, “técnicas complementares” ou “soluções de fronteira”. Tenho certeza que podemos chegar a alguns termos mais politicamente corretos ou corporativos se nos concentrarmos nisso.
-
cmilfont Says:
March 13th, 2007 at 6:27 amThiago e Marcos, acho que não fui claro no meu post, futuramente quando sobrar um tempinho vou especificar um artigo melhor sobre padrões.
O que quero deixar claro é que padrões não podem ser chamados de gambiarra ou outro nome qualquer porque são simplesmente… “padrões”, normas estabelecidas para se resolver um problema identificado.
Pode existir mais de um padrão para resolver um mesmo problema em u m mesmo contexto, não se prendam apenas ao clássico conhecimento sobre padrões como GoF ou PoEAA por exemplo.
Em resumo, padrões são como as coisas são feitas e gambiarras são emendos que são provocados pelo mau uso dos padrões ou a não compreensão.
Não existe isso de gambiarra boa, se é gambiarra não é padrão.
Padrão é a norma, é como se deve fazer. -
cmilfont Says:
March 13th, 2007 at 6:31 amThiago, acho que o ponto de entender está aqui: “não são soluções alternativas nem complementares”. São simplesmente a solução.
Todo desenvolvimento/linguagem requer um padrão, nada flutua no vácuo nesse sentido, se voce senta e abre um notepad para criar algo voce no minimo seguirá um padrão, ninguem desenvolve nada sem um padrão. É essa a diferença que creio que voces não entenderam.Quando voce cria um domain model por exmeplo vboce está seguindo um padrão, se voce implenta uma linguagem seja de propósito geral ou uma DSL voce criou e/ou segue um padrão.
-
cmilfont Says:
March 13th, 2007 at 6:34 amPara deixar mais claro ainda, Dependency injection e Orientação a objetos são design patterns, a diferença é o foco/contexto onde são aplicados. São modelos de desenho a um determinado requisito identificado.
-
Thiago Arrais Says:
March 13th, 2007 at 7:25 amPadrões não são a solução, são uma solução. Outra solução é que a linguagem resolva esse problema para você e forneça uma construção idiomática para isso, como no caso dos objetos de 1972 que viraram as classes, objetos, métodos e construtores de 2007.
Toda linguagem requer um padrão, até Lisp tem seu Dialeto de Domínio (não adianta procurar esse nos catálogos, batizei agora). A sacada é que eles não precisam ser padrões para sempre, a linguagem pode evoluir para não precisar mais de alguns deles. Mas, como diria o Tapajós, não existe canivete suíço. Nem mesmo os padrões são canivetes suíços. Muito pelo contrário: são soluções (em geral muito boas quando chegam ao ponto de serem chamadas de padrões) para problemas específicos.
Os padrões são muito importantes à medida que nos ajudam a identificar um problema comum e ao mesmo tempo fornecem uma solução, mas não devem ser vistos como soluções definitivas. Isso iria paralizar completamente a evolução. E não é isso que queremos, certo?
-
cmilfont Says:
March 13th, 2007 at 8:03 am“Padrões não são a solução, são uma solução. Outra solução é que a linguagem resolva esse problema para você e forneça uma construção idiomática para isso, como no caso dos objetos de 1972 que viraram as classes, objetos, métodos e construtores de 2007.”
Mas não deixa de ser um padrão, não é porque o padrão passou a fazer parte da linguagem que ele deixou de se padrão, apenas está encapsulado, se por algum erro de implementação voce precisar corrigir algo voce sabe como funciona porque está catalogado.
“Toda linguagem requer um padrão, até Lisp tem seu Dialeto de Domínio (não adianta procurar esse nos catálogos, batizei agora). A sacada é que eles não precisam ser padrões para sempre, a linguagem pode evoluir para não precisar mais de alguns deles. Mas, como diria o Tapajós, não existe canivete suíço. Nem mesmo os padrões são canivetes suíços. Muito pelo contrário: são soluções (em geral muito boas quando chegam ao ponto de serem chamadas de padrões) para problemas específicos.”
aí que está o ponto, como diria nosso presidente estamos chegando no “ponto G” da questão

Não é porque uma determinada linguagem embutiu um determinado padrão que esse padrão deixou de existir.
Não é porque uma determinada linguagem NÃO embutiu um determinado padrão que ela está errada, é que não compensa na maioria dos casos por conta de sua arquitetura, essa linguagem embutir esse padrão. Mas o padrão é para sempre, se ninguem mais o utilizará é outra história (que em informática é quase impossível, quase, padrões sempre vem e vão, vivenciei muito disso)“Os padrões são muito importantes à medida que nos ajudam a identificar um problema comum e ao mesmo tempo fornecem uma solução, mas não devem ser vistos como soluções definitivas. Isso iria paralizar completamente a evolução. E não é isso que queremos, certo? ”
São soluções definitivas para o que ele é catalogado, a diferença é que novos padrões vão surgindo e outros vão sendo relegados, mas os que são relegados hoje podem ser resgatados no futuro, como por exemplo o uso do singleton e do factory que evidenciei no artigo, outro exemplo comum é na construção de OS, padrões de implementação de gerenciamento de memória, disco e processos vão e vem dependendo da arquitetura da máquina e do propósito desejado.
Falamos as mesmas coisas, só que com um enfoque diferente, acredito que um ponto comum seria chamar seu artigo de “Cuidado para um padrão não se tornar uma gambiarra”.
-
CMilfont » Porque usamos Frameworks? Says:
July 19th, 2007 at 11:10 am[...] Vamos exemplificar em alguns contextos. Os conceitos são importantes para a escolha dos frameworks necessários, quando voce desconhece ou relega isso fica muito mais difícil ter o feeling necessário para avaliar uma situação como essas. [...]
-
CMilfont » Sou Programador! Says:
April 18th, 2008 at 4:54 am[...] O academicismo as vezes é benéfico, te desregula da própria não-regra, evita que voce considere padrões como gambiarras e abres os olhos do programador para questões mais profundas. [...]
-
CMilfont » O que acham do nível superior? Says:
April 18th, 2008 at 4:58 am[...] Diploma não garante conhecimento, tem muitos que possuem diploma e não conseguem distinguir o básico. http://www.milfont.org/blog/archives/111 [...]


