<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-10162639.post4356312413466721053..comments</id><updated>2009-04-21T17:45:21.334-03:00</updated><category term='ruby'/><category term='classic paper'/><category term='scheme'/><category term='theory'/><category term='scala'/><category term='design patterns'/><category term='java'/><category term='REST'/><category term='security'/><category term='smalltalk'/><category term='soa'/><category term='culture'/><category term='economy'/><category term='information'/><category term='UI'/><category term='metaprogramming'/><category term='music'/><category term='event'/><category term='lisp'/><category term='concurrency'/><category term='book'/><category term='gui'/><category term='component'/><category term='misc'/><category term='mvc'/><category term='exceptions'/><category term='software architecture'/><category term='Sun'/><category term='agile'/><category term='oo'/><category term='DSL'/><category term='tips'/><category term='rails'/><category term='software engineering'/><category term='functional programming'/><category term='coding'/><category term='programming languages'/><category term='review'/><category term='usability'/><category term='rant'/><category term='subversion'/><category term='database'/><title type='text'>Comments on Rafael rambling: Design Patterns are not Recipes</title><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.rafaelferreira.net/feeds/4356312413466721053/comments/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default'/><link rel='alternate' type='text/html' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html'/><author><name>Rafael Ferreira</name><uri>https://profiles.google.com/111735374328481001879</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-uPn1e9oH3dU/AAAAAAAAAAI/AAAAAAAAAAA/YiTmAAqz4Ns/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10162639.post-3163947720452095584</id><published>2009-04-21T17:45:00.000-03:00</published><updated>2009-04-21T17:45:00.000-03:00</updated><title type='text'>Very interesting this discussion about PAtterns! T...</title><content type='html'>Very interesting this discussion about PAtterns! Thanks a lot for you all! ;-)</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/3163947720452095584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/3163947720452095584'/><link rel='alternate' type='text/html' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html?showComment=1240346700000#c3163947720452095584' title=''/><author><name>Cristiano</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html' ref='tag:blogger.com,1999:blog-10162639.post-4356312413466721053' source='http://www.blogger.com/feeds/10162639/posts/default/4356312413466721053' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-316908696'/></entry><entry><id>tag:blogger.com,1999:blog-10162639.post-9069606009345776216</id><published>2007-09-07T11:51:00.000-03:00</published><updated>2007-09-07T11:51:00.000-03:00</updated><title type='text'>Hello! I read this article! Big thanks to author, ...</title><content type='html'>Hello! I read this article! Big thanks to author, very interesting. Write more.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/9069606009345776216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/9069606009345776216'/><link rel='alternate' type='text/html' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html?showComment=1189176660000#c9069606009345776216' title=''/><author><name>&lt;a href="http://erniz.com"&gt;Hilbert&lt;/a&gt;</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html' ref='tag:blogger.com,1999:blog-10162639.post-4356312413466721053' source='http://www.blogger.com/feeds/10162639/posts/default/4356312413466721053' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-2084977217'/></entry><entry><id>tag:blogger.com,1999:blog-10162639.post-6160150943790092885</id><published>2007-06-16T03:07:00.000-03:00</published><updated>2007-06-16T03:07:00.000-03:00</updated><title type='text'>"Internacionalizado" que nada... Termos mais adequ...</title><content type='html'>"Internacionalizado" que nada... Termos mais adequados são "indeciso" ou "esquizofrenico", com essa alternação inconsistente entre português e inglês (mais certo seria eu manter blogs separados, mas ja tenho dificuldade em levar esse e o da sun; mais um é a ultima coisa que eu quero :). Falando no assunto, acho que já ta na hora de vc abrir um seu, hein?&lt;BR/&gt;&lt;BR/&gt;Vamos por partes, como diria Leibniz:&lt;BR/&gt;1) Ainda não encontrei Delegate descrito em forma de padrao, mas eu concordaria com o Iterator e o Observer (muito embora, o observer de margem a uma variedade grande de implementacoes; veja a descricao dele no POSA).&lt;BR/&gt;2) Blz.&lt;BR/&gt;3)Toda arvore eh um grafo; todo grafo eh um conjunto de arestas, que sao pares ordenados, que tb são conjuntos. Logo toda lista ligada eh um conjunto. Se ela for finita então dá ate para provar que não passa de superconjuntos aninhados do conjunto vazio. Por isso que ciência da computação é diferente de engenharia de software (se é q isso existe). Volto ao intent: uma lista ligada tem a intenção de representar "whole-part hierarchies"? Eu acho que a resposta e não, e por isso trata-la como se fosse um composite não ajuda em nada.&lt;BR/&gt;4)Vou deixar o &lt;A HREF="http://www.research.ibm.com/designpatterns/pubs/ph-apr98.pdf" REL="nofollow"&gt;John Vlissides&lt;/A&gt; responder essa:&lt;BR/&gt;&lt;I&gt;“It seems you can’t overemphasize that a pattern’s Structure diagram is just an example, not a specification. It portrays the implementation we see most often. As such the Structure diagram will probably have a lot in common with your own implementation, but differences are inevitable and actually desirable. At very least you will rename the participants as appropriate for your domain. Vary the implementation trade-offs, and your implementation might start looking a lot different from the Structure diagram. &lt;BR/&gt;As for whether one is following the pattern or not, who cares? The pattern is a means to an end, not an end itself. Following it in any strict sense is immaterial. If the pattern solves your problem directly, that’s great; if you have to bend it a bit, that’s great too. Even if the pattern merely inspires you toward an altogether different solution, it has still proven useful. The only potential problem here lies in the documentation phase, when you’re describing your solution in terms of patterns. You don’t want to mislead someone with irrelevant patterns. If you identify a set of classes as adhering to a pattern, make sure they fulfill the pattern’s intent. If the connection is tenuous, don’t mention the pattern; otherwise you’re sure to confuse more than clarify. ”&lt;/I&gt;&lt;BR/&gt;5 e 6) Vou reler o Decorator e te respondo depois ;)&lt;BR/&gt;7) Eu acho que interface em java serve para muito mais coisa do que só implementar o strategy. Primeiro, serve para o State também, que eh quase um padrão irmao. Depois, junto com creation methods*, eh muito util para separar a definição de uma API de sua implementação, tipo os métodos da classe java.util.Collections. Estes são os usos que me passaram pela cabeça agora, mas não tenho duvida que existem muitos mais que não se encaixam bem como sendo “strategies”.&lt;BR/&gt;&lt;BR/&gt;&lt;BR/&gt;*Que eu normalmente chamaria de factory methods, mas quero eviter confusao com o factory-method do GoF que e um conceito bem mais especifico)</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/6160150943790092885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/6160150943790092885'/><link rel='alternate' type='text/html' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html?showComment=1181974020000#c6160150943790092885' title=''/><author><name>Rafaeldff</name><uri>http://www.blogger.com/profile/03350776762967743057</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html' ref='tag:blogger.com,1999:blog-10162639.post-4356312413466721053' source='http://www.blogger.com/feeds/10162639/posts/default/4356312413466721053' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1552232444'/></entry><entry><id>tag:blogger.com,1999:blog-10162639.post-3469614744218277476</id><published>2007-06-15T22:21:00.000-03:00</published><updated>2007-06-15T22:21:00.000-03:00</updated><title type='text'>Rafael,&lt;br&gt;&lt;br&gt;Você é figura cara. E certamente um...</title><content type='html'>Rafael,&lt;BR/&gt;&lt;BR/&gt;Você é figura cara. E certamente uma pessoa bem esclarecida sobre o controverso assunto: "design patterns". Sim, sim... Eu mudei muito minha opinião depois da minha última postagem. Mas faço aqui algumas observações, talvez defendendo meu pensamento anterior:&lt;BR/&gt;1) Ok! Concordamos que alguns padrões podem vir pré-implementados. Eu arrisco citar  Strategy, Iterator, Observer e o  Delegate. &lt;BR/&gt;2) Outros a receita não ajuda muito como no caso do Prototype.&lt;BR/&gt;3) (Mas, e o que eu acho mais interessante é que) eu reforço minha opinião sobre o Composite e as listas ligadas.&lt;BR/&gt;(1) Toda lista é uma árvore.&lt;BR/&gt;(Um caso particular de árvore onde cada nó possui um único filho.)&lt;BR/&gt;(2) Pela intenção, uma lista ligada utiliza uma estrutura em árvore (conforme (1),) para representar a hierarquia parte-todo. &lt;BR/&gt;CQD.&lt;BR/&gt;Vou adiante: Por (2), posso sugerir uma implementação da "intenção" do Composite em C, dessa forma:&lt;BR/&gt;struct node {&lt;BR/&gt;   struct* node next;&lt;BR/&gt;   int value;&lt;BR/&gt;} &lt;BR/&gt;Lindo, né!? Eu fico até emocionado... &lt;BR/&gt;4) Agora, faço a seguinte pergunta: Eu devo julgar os padrões pela intenção ou pela "implementação" (isto é, a descrição do Padrão no GoF,  "obsessivo" por heranças). Se você me disser que devo julgar pela implementação então a conclusão que chego é que meu tipo node não é um Composite, mas seria do contrário.&lt;BR/&gt;5) Como eu disse, acho o GoF obsessivo por heranças. Implementações mais simples satisfazem perfeitamente as intenções propostas. Dou outro exemplo: Decorator&lt;BR/&gt;Em java...&lt;BR/&gt;public class Component {&lt;BR/&gt;}&lt;BR/&gt;public class RodrigoDecorator extends Component {&lt;BR/&gt;    private Component component;&lt;BR/&gt;}&lt;BR/&gt;Nada de classes "concretas" que herdem de Decorator. Meu RodrigoDecorator já é uma classe concreta. O dia que eu tiver a necessidade de mudar isso, eu refatoro. &lt;BR/&gt;&lt;BR/&gt;6) E qual seria a vantagem de utilizar implementações mais simples para descrever um padrão? Porque assim seria mais óbvio o "padrão". No caso do Decorator, toda utilização de composição + agregação seria um exemplo de RodrigoDecorator. O exemplo complicado do GoF de Decorator também teria um RodrigoDecorator.&lt;BR/&gt;7) Claro que continua fazendo sentido dizer que uma Interface específica é um Strategy... É uma forma de comunicar aos leitores daquela Interface que o autor tinha em mente uma seleção de Algoritmos (talvez em tempo de execução). Mas eu acho que seria mais "honesto" validar que Interface é a implementação de Strategy em Java ( afinal, toda vez que você utiliza uma interface, você permite uma seleção de implementações em tempo de execução).&lt;BR/&gt;&lt;BR/&gt;&lt;BR/&gt;É isso ai!&lt;BR/&gt;&lt;BR/&gt;&lt;BR/&gt;(Me desculpe poluir seu blog internacionalizado com outro post em português :(   )</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/3469614744218277476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/3469614744218277476'/><link rel='alternate' type='text/html' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html?showComment=1181956860000#c3469614744218277476' title=''/><author><name>Rodrigo</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html' ref='tag:blogger.com,1999:blog-10162639.post-4356312413466721053' source='http://www.blogger.com/feeds/10162639/posts/default/4356312413466721053' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1379965'/></entry><entry><id>tag:blogger.com,1999:blog-10162639.post-4357320281424539141</id><published>2007-05-20T15:00:00.000-03:00</published><updated>2007-05-20T15:00:00.000-03:00</updated><title type='text'>Oi anonymous. Vamos la, então.&lt;br&gt;&lt;br&gt;Primeiro ten...</title><content type='html'>Oi anonymous. Vamos la, então.&lt;BR/&gt;&lt;BR/&gt;Primeiro tenho que deixar claro que eu procuro refutar a tese "todos os padroes sao templates". Isso nao implica em que eu  afirme que "nenhum padrao eh um template". Ao contrario: Iterator, por exemplo, tem uma estrutura bastante rigida e sem muita latitude para o implementador.&lt;BR/&gt;&lt;BR/&gt;Os outros exemplos sao mais complicados. Blocks em Smalltalk facilitam muito a aplicacao do padrao Command, mas dizer que eles "substituem o papel de commands" eh errado. Por um lado, blocks servem para mais coisas do que commands (sao otimos para implementar Strategies, por exemplo). Por outro, as vezes faz sentido programar explicitamente uma classe para o Command, um exemplo, citado no GoF, eh quando se deseja guardar estado no command para permitir Undo.  Prototype eh um padrao bastante obvio (o primeiro uso citado eh do Sutherland em 1963!), e, acredito eu, vale mais pela adicao ao vocabulário do que pela estrutura (portanto, nao faz sentido considera-lo como um template). Nisso ele eh similar ao Facade, que eu mencionei no post, e ao Mediator.&lt;BR/&gt;&lt;BR/&gt;Quanto ao Composite, acho dificil que uma lista ligada se encaixe como uma realizacao do padrao. Veja o Intent: "Compose objects into tree structures to represent part-whole hierarquies". A heranca no caso, serve para distinguir o comportamento das folhas dos demais nos, usando polimorfismo para isso. Me parece uma aplicacao perfeitamente adequada de heranca. E "acusar" de obsessao por hereditariedade a obra que tornou famosa a expressao "favor composition over inheritance" eh meio estranho.&lt;BR/&gt;&lt;BR/&gt;[Peco desculpas pelos acentos, problemas tecnicos]</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/4357320281424539141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/4357320281424539141'/><link rel='alternate' type='text/html' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html?showComment=1179684000000#c4357320281424539141' title=''/><author><name>Rafaeldff</name><uri>http://www.blogger.com/profile/03350776762967743057</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html' ref='tag:blogger.com,1999:blog-10162639.post-4356312413466721053' source='http://www.blogger.com/feeds/10162639/posts/default/4356312413466721053' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1552232444'/></entry><entry><id>tag:blogger.com,1999:blog-10162639.post-1282425986844365486</id><published>2007-05-20T01:44:00.000-03:00</published><updated>2007-05-20T01:44:00.000-03:00</updated><title type='text'>E vamos nós para uma série de "padrões = templates...</title><content type='html'>E vamos nós para uma série de "padrões = templates". &lt;BR/&gt;Blocks em Smalltalk substituem o papel de comands. Subprojeto commands da Jakarta oferecem commands e chains.&lt;BR/&gt;Iterator é uma classe em Java. Prototype é uma implementação de Cloneable com deep copy. O Listener é uma implementação do padrão Observer no AWT/Swing/SWT do Java. &lt;BR/&gt;&lt;BR/&gt;Outros padrões são implementados de uma maneira ou de outra. Por exemplo, qualquer aluno de primeiro de computação esbarra no padrão composite (listas ligadas, árvores, grafos, etc) com a diferença que a implementação pode ou não possuir herança, enquanto que o padrão descrito no GoF usa obrigatoriamente (seria algum tipo de obsessão por heredidade!?).</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/1282425986844365486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/1282425986844365486'/><link rel='alternate' type='text/html' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html?showComment=1179636240000#c1282425986844365486' title=''/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html' ref='tag:blogger.com,1999:blog-10162639.post-4356312413466721053' source='http://www.blogger.com/feeds/10162639/posts/default/4356312413466721053' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1241261925'/></entry><entry><id>tag:blogger.com,1999:blog-10162639.post-5539421400512952093</id><published>2007-03-29T01:32:00.000-03:00</published><updated>2007-03-29T01:32:00.000-03:00</updated><title type='text'>Só para contribuir um pouco, com meu vastíssimo co...</title><content type='html'>Só para contribuir um pouco, com meu vastíssimo conhecimento em inglês.&lt;BR/&gt;Já notou que a linguagem java dá de graça o padrão Strategy com interfaces? Que o Java 5 implementa um padrão de metadados que é o annotation. O C# já trás um observer de bandeja. É interessante ver que certos recursos de linguagem não esbarram nos padrões por acidente.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/5539421400512952093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10162639/4356312413466721053/comments/default/5539421400512952093'/><link rel='alternate' type='text/html' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html?showComment=1175142720000#c5539421400512952093' title=''/><author><name>Rodrigo</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.rafaelferreira.net/2007/02/design-patterns-are-not-recipes.html' ref='tag:blogger.com,1999:blog-10162639.post-4356312413466721053' source='http://www.blogger.com/feeds/10162639/posts/default/4356312413466721053' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1379965'/></entry></feed>
