Assine
22950 assinantes- Feeds completos
- Feeds dos comentários
- Feeds do fórum
- Receba o Meio Bit via e-mail
Mantenha-se informado sobre as nossas novidades com nosso newsletter semanal, todas as segundas-feiras
Se você está iniciando em um curso de computação, já programa há algum tempo em uma linguagem orientada a objetos de verdade, eventualmente entrará em contato com design patterns. O termo hoje em dia é usado livremente para definir de forma organizada padrões de solução de problemas comuns encontrados durante projetos.
O livro de referência no assunto, é o Padrões de Projeto: Soluções reutilizáveis de software orientado a objetos, escrito por 4 famosos projetistas de software, Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides. Nesse livro, eles documentaram alguns padrões que são largamente usados. O livro não é uma leitura fácil. É preciso ter um ótimo conhecimento de orientação a objetos e todos os seus conceitos, conhecer UML e para ler o código-fonte do livro, C++ e Smalltalk.
Por causa da velocidade com o qual as coisas devem ser produzidas hoje em dia, um pouco de pragmatismo e uso de uma linguagem moderna como o C# podem ser benéficos. Por exemplo, uma vez precisei criar um "desfazer" (undo em inglês) e pensei: alguém já deve ter tido esse problema. Procurando no livro, encontrei o padrão comportamental Memento que faz mais ou menos o que o cliente precisava. Partindo dele, foi possÃvel criar a funcionalidade desejada.
Mas o código do livro não ajuda muito quando o prazo está no nosso pescoço. Coloque no bookmark o website http://www.dofactory.com. O código em C# é tão ridiculamente parecido com Java que também serve para essa linguagem. Todos os padrões do Gang of Four estão lá.
Estou começando meus estudos em C# pra usar em XNA e vou consultar esse site.
É bem interessante a reutilização de programas já feitos e bem legal existir essas dicas de especialistas em como fazer um código reutilizável e até flexÃvel para projetos diversos.
[edit] Primeiro! finalmente!
Foi primeiro pois estive o dia todo muito ocupado consertando uns bugs de um projeto feito em VB6 em que o Crystal Reports 8.5 resolveu incomodar hoje...
_____________________
Muita Pimenta para sua vida!
Primeiro Pro-Commenter da Blogosfera Brasileira.
Nossa, nunca mais reclamo do meu trabalho.
Haha, blz! Fica tranqüilo que não vou competir com você! Era só pra ter o gostinho de estar no topo uma vez!
Abs!
Interessante, ja tinha lido um pouco sobre isso. Cada vez mais me sinto mais feliz por programar Python...
Nem sei mais ler código estaticamente tipado e com "{","}"...
Minha cabeça ja inverteu de vez para linguagens dinâmicas de alto-nÃvel.
Mas o dia que eu precisar programar em Java, C#, etc... vou dar uma olhada em Design Pattern, da pra ver que ajudam muito.
Valeu pelo artigo
[]s
E quem disse não serve para Python? Você não entendeu que Design Pattern são padrões para projetos de software? Cada programador que tem por aqui.
Claro que serve para Python, posso ter me expressado de forma errada, no fim quis dizer duas coisas:
1 - No momento não estou trabalhando com programação em um ambiente profissional ou em soluções complexas onde Design Patterns são muito úteis
2 - Quando eu trabalhar com Java e C#, provalmente será num ambiente profissional onde eu com certeza terei que utilizar Design Pattern, já que não me vejo utilizando essas linguagens somente por hobby
Agradeço pelo feedback onde eu vi que expressei tudo errado
[]s
PS: Se quiser posso mostrar Singletons e Iterators em Python, é bem divertido de se fazer, ainda mais utilizando Decorators de modo a reaproveitar o código para Singleton.
Padrão de projeto é algo universal, independente de linguagem.
Por exemplo, como você garante que um objeto só será instanciado uma única vez em Python? Em outras palavras, como você faz para reaproveitar um objeto de cor RGB, que pode ser usado várias vezes?
Se encontrou uma forma de fazer isso, é um padrão de projeto chamado Singleton.
Sem querer ser chato, e tentando ser o mais humilde possÃvel pra não ofender, mas apenas colocar uma informação que eu acho construtiva.
O C# é ridÃculamente parecido com java por que simplesmente o C# é BASEADO em java. O que pra mim é um ótimo começo pra uma linguagem de programação que quer ser séria e ter credibilidade.
--------------------------------------------------
Só a mudança é permanente.
"O C# é ridÃculamente parecido com java por que simplesmente o C# é BASEADO em java"
Da meneira que está dizendo, parace que as aplicações feitas em C# rodam em Java...
Estou dizendo que se começar a ler um livro de programação que ensina C#, uma das primeiras coisas que você vai aprender é que as pessoas que fizeram o C# basearam o alicerce da linguagem de programação em Java.
Como uma banda que se inspira em Beatles para compor suas músicas.
Como um Engenheiro que se inspira em Oscar Niemeyer para contruir um prédio.
Como um baterista que se inspira em Mike Portinoy pra montar suas linhas musicais.
Como um centro avante que se inspira no Romário pra se posicionar na área.
Isso não quer dizer que o centro avante incorpora o Romário, nem que o baterista incorpora o Portnoy, nem que o engenheiro incorpora o Niemeyer, nem que a banda vira Beatles, nem que C# roda em Java runtime.
--------------------------------------------
Só a mudança é permanente.
Coitado do engenheiro, se inspirar no Niemieyer! Ele vai ser banido da engenharia civil assim.
Não seria melhor um arquiteto se inspirar no Niemeyer?
Sério... eu preciso desenhar pra vocês entenderem o que eu quis dizer?
--------------------------------------
Só a mudança é permanente.
Concordo plenamente.
--
Evite a extinção de uma espécie ameaçada: use corretor ortográfico!
hehehe, eu tbm demorei pra entender, rss
cara, isso é que eu chamo de analogia, só faltou desenhar
Vou sériamente dar uma olhada nesse livro. Por não ser um programador profissional, o meu maior defeito é tentar sempre reinventar a roda e não ter um fluxo de processamento lá muito organizado.
Quando ao C#, eu acho que ele está meio que se tornando um padrão por mérito. Existem muitas linguagens e ambientes por aà que ainda tem as mesmas funcionalidades do C++ na década de 90.
--
Evite a extinção de uma espécie ameaçada: use corretor ortográfico!
Pior as que tiram algumas, como sobrecarga de operador. E deviam ter tirado de vez os tipos primitivos.
a = BigInteger(5)
b = BigInteger(10)
c = a.add(b)
Fala serio? Que tortura criar objetos que se comportam como numeros e nao poder somá-los com "+".
Na minha opinião, C# como linguagem está alguns passos a frente do Java. Agora sobre ser multi-plataforma e outras coisas mais Enterprise, não posso opinar.
Não tem muito tópico sobre Java aqui né? E de outras linguagens que estão chamando a atenção então?
Se deixarem, me disponho a falar de Python e Linux para somar os esforços com o Wallacy.
[]s
a = BigInteger(5) b = BigInteger(10) c = a.add(b)
Se isso foi para Java, pelo o que eu sei. Se você fizer c = a + b a VM entende que se trata de dois objetos representado numero e faz a soma normalmente.
Até onde eu sei e o google continua me confirmando, só com tipos primitivos numéricos e com a Classe String podem utilizar o operador "+" e outros. Você pode fazer uma Classe que permita seus objetos utilizarem operadores?
Se já pode ou se será possÃvel será uma ótima novidade.
[]s
No Java é possÃvel sim e se chama "autoboxing".
Exemplos:
Integer i = 5; // Boxing
int j = i; // Unboxing
--
"Uma pessoa inteligente resolve um problema, um sábio o previne." Albert Einstein
Isso provavelmente funciona em java(e em c#) mas isso é anti-pattern.
Somar-se a outro é reponsabilidade do objeto número ou de um hipotetico objeto 'calculadora', então nada mais obvio que chamar uma função(a.add(b)) para soma-lo com outro.
Imagina isso, de quem deve ser a responsabilidade de verificar se o divisor de uma operaçao é ou não zero? Simplesmete colocar no codigo:
c = new Integer(0);
a = b / c; dara erro,
entao voce teria que colocar uma logica de negocio(no nosso caso operaçoes matematicas) espalhada pelo código:
If(c<1) throw ZeroDivisionException
else a = b / c;
-----------------------------
Minha insatisfação com o Java se resume a 3 pequenos detalhes:
- Checked exception: http://www.mindview.net/Etc/Discussions/CheckedExc...
- Falta de sobrecarga de operadores (mas String pode)
- Tipos primitivos
Isso não incomoda mais ninguém? Ou ajuda em grandes projetos?
[]s
Checked exception: isso é uma das coisas que me agrada O.O,
quase nao consigo programar sem usar try ...
qual o problema dos tipos primitivos ?
voltando ao post:
Em java existe uma extrema necessidade de conhecer esse padroes citados (GOF) todos eles, quando falam que java é improdutivo, é porque não usam tais padroes de desenvolvimento, eu depois que aprendi eles, uso muitos, a maioria em conjunto... Command por ex, é bem util, mas cuidado para nao programar proceduralmente ....
J2EE Design Patterns Catalog
http://java.sun.com/blueprints/corej2eepatterns/Pa...
----
Pra min fanboysismo é igual religião e futebol, não se discute
Tinha uma coisa que me incomodava no código dos outros, não era Java e nem muito por causa da linguagem: checagens infindáveis para ver se estava tudo certo.
Screen tela = new screen(100,100);
if (tela == null) return false;
Canvas cv = tela.Canvas;
if (cv == null) return false;
Brush pincel = cv.Brush;
if (pincel == null) return false;
Dimension width = 100;
if (width == null) return false;
Dimension height = 100;
if (height == null) return false;
Isso é dar nos nervos, não? Já vi um programa que essa checagem era feita até para tipos primitivos, em todas as operações, porquê o compilador do cara não garantia que, mesmo depois de um int a=5;, a variável não tivesse valor nulo. Pior que isso só os:
HResult = FazBolo(farinha, açúcar); if (HResult != H_Ok) return false;
--
Evite a extinção de uma espécie ameaçada: use corretor ortográfico!
Se algum dia voce trabalhar numa instituição financeira, seu chefe pegará no seu pé por causa disso. Além disso há redundancia, há mesma checagem que foi feita no programa será refeita na stored procedure do banco de dados que se for disparar uma trigger novamente checará os valores. Se for em "n" camadas, daà varia, tem casos que houve checagem na aplicação e será novamente no servidor de aplicações, banco de dados,... voce viu um sapo ? tinha xor ? não ? então não vÃ. É assim que uma pessoa fica depois vários anos programando dessa forma.
O próprio tipo ou classe pode verificar a divisão por zero, no caso do C#:
IntNovo a, b, c;
b = 30;
c = 0;
a = b / c;
Quando essa operação (b dividido por c) for executada, o tipo vai chamar o operador / de uma divisão entre IntNovo e IntNovo. Ao ver que existe uma divisão por zero, o operador pode resolver dar o valor de +infinity para a variável a ou pode dar um throw new DivideByZeroException. Isso fica a cargo da classe IntNovo e não da pessoa que a está usando. Seres humanos erram, e deixar todos as checagens para dentro do código da chamada é pedir para o programador esquecer de alguma coisa.
Para isso serve a sobrecarga de operador, para transformar um IntNovo.Divide(IntNovo value) em um simples / .
--
Evite a extinção de uma espécie ameaçada: use corretor ortográfico!
Na boa, isso é preciosismo.
Em C# você sobrecarrega qualquer operador (+,-, etc) e implementa a logica na classe. Dessa forma posso ter , por exemplo,o seguinte
Salario sal1 = new Salario();
sal1.Valor = 1000;
Salario sal2 = new Salario();
sal2.Valor = 2000;
double totalFolha = sal1 + sal2;
//totalFolha esta agora com 3.000
quem faz essa magica ? a sobrecarga. Na sobrecarga eu falo que "quando estou somando dois salarios, deve se somar os valores da propreidade Valor"
abraços
Cassio R Eskelsen
Isso foi só um case pra exemplificar o encapsulamento da lógica de négocios numa aplicação de calculos aritmeticos(onde as regras de negocios são os algoritmos de calculos aritmeticos) ou seja, Numa aplicação real, voce colocaria sua logica de negocio nos metodos da classe.
Bacana, estou entrando no mundo do C#.NET agora, como já estou super familiarizado com o VB.NET vai ser fácil, ainda mais com esse site para pegar referencias....
Falando nisso, alguem conhece alguma componete pra gerar gráficos compatÃvel com o VS 2008
De preferencia gratuito...
_____________________
Muita Pimenta para sua vida!
Primeiro Pro-Commenter da Blogosfera Brasileira.
Falando nisso, alguem conhece alguma componete pra gerar gráficos compatÃvel com o VS 2008
tem o ZedGraph
http://zedgraph.org/
Minha humilde opnião é: Design Pattern é perda de tempo
Talvez em projetos enormes, com dezenas de programadores, analistas, arquitetos, etc, até que vai...
Gosto mais das coisas simples. Sem POG e sem regras bobas.
O que seria um projeto grande para você? E o que seria um projeto pequeno?
P.S.: É uma pergunta normal mesmo, não uma afronta ou provocação.
--
Evite a extinção de uma espécie ameaçada: use corretor ortográfico!
Design Pattern entra para resolver aquele problema que sem ele você resolveria usando POG.
A primeira definição que ouvir de Design Pattern foi: Soluções simples para problemas simples do dia-a-dia.
Uso sempre que possÃvel e estou feliz com isso.
Ahh! Vc tá doidão num é não???
Padrões de projeto não são regras bobas. Toda linguagem tem isso: das OO às procedurais como o C(sem complicar nada, pelo contrário).
Me pergunto se você ja fez algum projeto grande... para saber oque é trabalhar com ou sem Design Pattern...
Why Use Patterns?
They have been proven. Patterns reflect the experience, knowledge and insights of developers who have successfully used these patterns in their own work.
They are reusable. Patterns provide a ready-made solution that can be adapted to different problems as necessary.
They are expressive. Patterns provide a common vocabulary of solutions that can express large solutions succinctly.
---
Pra min fanboysismo é igual religião e futebol, não se discute
Respondendo a todos acima.
OpenOffice é um projeto grande, já gedit é pequeno.
Nunca estive em um projeto realmente grande, mas já usei Padrões de Projetos em empresas que eu trabalhei.
Sei bem o que é.
Eu sei que eu fui muito genérico no comentário que eu fiz. Existem ótimos padrões de projetos, feito por quem já põe a mão na massa e sabe como é o mundo real. Mas tem outros, criados por "Doutores de Harvard" que só engessam seu projeto.
Depois de ter comentado aqui, eu achei uma coisa muito interessante. Quem trabalha com Ruby on Rails já deve conhecer. É o livro chamado Getting Real (Caindo na Real). Não fala exatamente sobre padrões de projeto (RoR usa MVC), mas vai perceber que os caras lá não usam RUP, UML, etc. Vou colocar algumas partes aqui:
...Caindo na Real entrega exatamente o que os clientes precisam e elimina qualquer coisa que não precisam....
...Caindo na Real entrega melhores resultados porque o força a lidar com os problemas reais que está tentando resolver em vez de suas idéias sobre esses problemas. Ele o força a lidar com a realidade...
...Caindo na Real pula especificações funcionais e outras documentações transitórias em favor de construir telas reais. Uma especificação funcional é para inglês ver, uma ilusão de um acordo, enquanto uma página web pronta é realidade. É isso que seus clientes irão ver e usar. É isso que importa. Caindo na Real o leva lá mais rápido. E isso significa que está tomando decisões de software baseado na coisa real em vez de noções abstratas...
Ps.: Leia um pouco sobre Anti-Pattern e me explique como saber quando um padrão é bom ou ruim, antes de usá-lo. Isso sempre me pareceu uma faca de dois gumes.
Desculpe a ignorâcncia, mas o que Design Patterns tem a ver com UML ?
Uma coisa existe em um projeto sem a outra, perfeitamente.
---
Tecnologia deve ser o meio, não o fim.
Eu sabia que teria um que ia falar isso... Então, se você ler o texto novamente vai encontrar isso:
E RUP também não é um Padrão de Projeto, eu só estava exemplificando algumas coisas que eu não gosto.
Não apenas MVC... que é algo em engloba alguns padroes ...
---
Pra min fanboysismo é igual religião e futebol, não se discute
Desculpe informar, mas Design Patterns são usados por qualquer programador. Ou vai me dizer que mesmo em um programa ultra-amador não usaria um Singleton?
Você merece uma insignia de troll...
______________________________________________
"É uma cilada Bino"
Na verdade todo o programador usa design patters mesmo sem querer, inconcientemente. Isso não são regras bobas, são simplesmente dicas de como resolver de uma forma boa algum problema. Você não precisa amarrar o seu programa a "regras"desses padrões. Você simplesmente vai programando e quando vem um pepino no meio do desenvolvimento você dá uma olhada nos padrões prá ver se tem algo que te ajuda... Sempre que a tua solução, por algum motivo, é melhor no teu caso do que a solução apresentada nos padrões, você deve usar a sua ou adptar o padrão... é simples. Acho que se o livro se chamasse "Dicas de programação do Tio Domiro" as pessoas teriam melhor receptividade e maior simpaia.
Esse material do site dofactory.com é excelente, ja faz 2 anos que comprei ele, vale cada centavo.
SimpleCode
Gráficos para Vs2008?
http://zedgraph.org/
=D
Muito bom o post. Realmente POG se combate design patterns e com experiência em programação!
Todos meus projetos em C++ usam varias soluções propostas nesse livro... fica ate mais simples para outros pogramadores entenderem... mais esse tópico foi criado para promover o C#? Claro que da para implementar em C#, pelo menos tem ele sobrecarga de operador, ao contrario de certas linguagems novas que nao tem isso, alegando ofuscar o codigo para o programador (voce é um programador ou o que?) java mais se parece Delphi que C++ (só a sintaxe e outros detalhes) mais sua limitação é identica ao delphi hahaha
Tem linguagens que a definição ou sobrecargas de alguns métodos transformam o objeto num interador, por exemplo. Para mim, uma linguagem nunca deve limitar o que o programador quer fazer.
Aqui vai um anti-pattern que eu fiz em Python, mas foi a soluções mais direta:
Trazer o objeto que REQUEST para dentro de uma função de XML-RPC, ou seja, eu inspecionei os objetos dos escopos passados até achar o REQUEST. EM C# dá para fazer isso?
Era para autenticar por HTTP-AUTH uma chamada de função de XML-RPC sem ficar mexendo no meio do caminho do tratamento da requisição HTTP.
E essa função teria que saber que usuário foi passado e tratar a autenticação antes de retornar a resposta esperada.
Alguém saberia fazer isso em outra linguagem sem mexer no meio do caminho, somente de dentro da função?
[]s
O que vc quer dizer com "mexer no meio do caminho"?
Pelo que parece, vc causou acoplamento, atitude não recomendada em OO. Talvez não seja isso, mas pelo seu sucinto comentário deixou a entender isso.
Se eu entendi o que vc quis dizer, vc poderia usar o design pattern Intercepting Filter.
--
"Uma pessoa inteligente resolve um problema, um sábio o previne." Albert Einstein
Não.
Pascal é altamente tipado, isso evita erros amadorÃsticos ou o famoso tiro no pé.
Essa coisa de sobrecarga, ter ou não ter, eis a questão é uma filosofia de programação, onde é melhor evitar um possivel erro na fase de desenvolvimento ou concentrar-se na produtividade e deixar erros para depois ?
No cobol voce era muito procedural e nao havia problema em somar numeros e letras, desde que voce soubesse o que iria produzir. O transactSQL do MSSQL não deixa somar tipos diferentes a menos que voce faça uma conversão de um para o outro. Não deverÃamos discutir se a=a+1 é melhor que a++ ou melhor que a=+a,... porque é ilusão achar que uma linguagem é melhor que outra só por causa disso.
A linguagem mais desburocratizada de todas que conhecà é a LISP, quer me ver correr, é só me mostrar um código em LISP e me pedir para corrigir um "probleminha" que está acontecendo e ninguem ainda achou onde está o bug. Em PHP é algo similar, se nessas linguagens voce não usar uma técnica mais apurada não vai entender, nem corrigir bugs quando se passar dois ou mais anos. Pode ter doutorado naquela linguagem ou não.
Outro bom referencial de Design Patterns (onde a maioria do material inclusive é gratuito):
http://www.theserverside.com/patterns/index.tss (com enfase em Java, mas os conceitos apresentados ali transcendem linguagens)
Para quem não conhece: Design Patterns nada mais é do que um nome bonito para "não reinventar a roda para resolver problemas do dia-a-dia que acontecem em projetos de software, nao importa linguagem, metodologia ou tamanho". Sao solucoes praticas, utilizadas em muitos projetos bem-sucedidos, e portanto uma garantia de que voce nao vai perder tempo viajando na maionese e arriscando o sucesso do seu trabalho.
---
Tecnologia deve ser o meio, não o fim.
Ou seja: DRY (Don't Repeat Yourself)
--
"Uma pessoa inteligente resolve um problema, um sábio o previne." Albert Einstein
Meu.. eu torço nariz para programação.. mas vo ter que apreender.. :/
*******************************
Música eletrônica + atitude -> sabotagem.org
Vai ter que aprender a programar.
Leia este artigo para lhe dar motivação.
Cara, aqui na HP é requisito mÃnimo saber da existência destes padrões e como utilizá-los.
Olhem este site http://sourcemaking.com/ é parecido com o dofactory, porém contem mais conteúdo, fala sobre design patterns, refactoring, antipatterns.
Esse livro é a base de todos os padrões oficiais. Já li um outro, sobre padrões mais "modernos" e UML, e achei uma bosca...
O complicado mesmo é saber quando e onde aplicar ou não um padrão, principalmente pelo quesito performance. Todos sabem que se você aplicar a orientação a objetos ao extremo, precisará sair para tomar um cafezinho, principalmente com listas de banco de dados complexos.
E como frase do dia: "Até mesmo um POG pode ser chamado de padrão, caso seja usado com frequência...."
Bom ponto de vista.
[]s
Dá-lhe Bicalho, sempre mandando ver nos posts!
Tenho a curiosidade de saber o que você é. Trabalho, estudo...
Tu tens um blog pessoal?