Translate

29 de janeiro de 2010

Turbine seu Eclipse com plugins

Adicione novas habilidades ao Eclipse, basta ir em Help > install new software, e adicione o site do plugin.

Listas de plugins:
http://eclipse-plugins.2y.net/eclipse/index.jsp
http://www.eclipseplugincentral.com/

Seleções:
C++ IDE: http://download.eclipse.org/tools/cdt/releases/galileo
RSS Reader: http://morphine.sourceforge.net/presence/projects/rss/index.html
ByeCycle - Analisador de código: http://priki.org/svn/byecycle/trunk/updatesite
Subclipse - Para Subversion: http://subclipse.tigris.org/update
EclipseME - Mobile sites: http://eclipseme.org/updates/ 

Referência:
http://javafree.uol.com.br/topic-7238-Eclipse-Plugins-Instalacao-via-Update-Sites.html

Subversion - Controle de versões

Antes de alterar seu programa, para adicionar uma nova funcionalidade ou alguma correção, é importante ter uma cópia do código, caso precisemos recuperar a versão anterior.
O controle de versão é formado pela área de trabalho e o repositório das versões.
As principais operações realizadas são:
  • commit = envia o pacote da área de trabalho para o repositório (backup), cada commit gera uma nova versão;
  • update = atualiza a área de trabalho com as modificações do repositório.
Para quem trabalha em equipe, ter um controle das versões é indispensável, uma ferramenta muito utilizada para isso é o Subversion (linha de comando), RapidSVN(interface gráfica do SubVersion), e seu similar TortoiseSVN para Windows.
O SubVersion cria backups de pastas(projetos) e qualquer arquivo com controle de versões, sendo que, para cada nova versão cria cópias dos arquivos atualizados e links para os repetidos, evitando assim a duplicidade de arquivos.

Antes de ver como utilizar a ferramenta, vamos ver alguns conceitos  importantes:
  • Repositório: Local onde o(s) projeto(s) será(ão) armazenado(s).
  • Trunk: Diretório onde se encontrará o projeto em fase de desenvolvimento (Dia a dia). O desenvolvimento do projeto começa aqui dentro.
  • Branch: Diretório destinado às fases de testes. Vamos supor o seguinte cenário, enquanto a Equipe A trabalha no desenvolvimento de novas funcionalidades da versão 1.0 do projeto, a Equipe B já inicia alguns testes para adicionar na versão 2.0 do projeto. Este projeto é de grande importância. Tudo o que for feito como forma de testar algo, sem comprometer o projeto como um todo, deverá ser colocado dentro deste diretório.
  • Tags: Diretório destinado às atualizações do projeto. Sempre que novas funcionalidades são adicionadas ao projeto e/ou bugs são corrigidos novas versões surgem dentro do diretório TAGS. Apenas os arquivos alterados são copiados para esta pasta, e links apontam para os demais.
O Subversion armazena todos os dados versionados em um repositório central. Os diretórios Trunk, Branch e Tags são uma convenção para organização do seu projeto, ou seja, podem ter outros nomes ou podem nem existir.
Para começar na prática, crie um novo repositório:
$ svnadmin create /caminho/do/repositorio
$ ls /caminho/do/repositorio
conf/ dav/ db/ format hooks/ locks/ README.txt
Este comando cria um novo diretório em /caminho/do/repositorio que contém um repositório do Subversion. Este diretório contém (entre outras coisas) um conjunto de arquivos de base de dados.

O repositório apenas gerencia arquivos e diretórios, então é intuitivo interpretar diretórios específicos como “projetos”, tenha em mente que estamos apenas falando sobre algum dado diretório (ou conjunto de diretórios) dentro do repositório.

Comece organizando seus dados dentro de um único diretório chamado meuprojeto (ou qualquer outro nome de sua preferência). A estrutura da árvore de seu projeto deve conter três diretórios internos chamados de branches, tags, e trunk. O diretório trunk deve conter todos os seus dados, enquanto que os diretórios branches e tags são vazios.

Em seguida importe os dados para dentro do repositório com o comando svn import:
$ svn import /tmp/meuprojeto file:///caminho/do/repositorio/meuprojeto -m
Adding               /tmp/meuprojeto/branches
Adding               /tmp/meuprojeto/tags
Adding               /tmp/meuprojeto/trunk
Adding               /tmp/meuprojeto/trunk/foo.c
Adding               /tmp/meuprojeto/trunk/bar.c
Adding               /tmp/meuprojeto/trunk/Makefile
...
Committed revision 1.

Agora o repositório contém esta árvore de dados. Como mencionado anteriormente, você não verá seus dados ao listar diretamente o conteúdo do repositório; os dados estão todos armazenados dentro de uma base de dados. Mas o sistema de arquivos imaginário do repositório agora contém um diretório
de alto nível chamado meuprojeto, que por sua vez contém seus dados.

Veja que o diretório /tmp/meuprojeto original não é alterado; o Subversion sequer tem conhecimento dele. (De fato, você pode até excluir esse diretório se quiser.) Para começar a manipular os dados do repositório, você precisa criar uma nova “cópia de trabalho” dos dados, que são uma espécie de espaço de trabalho particular. Solicite que o Subversion lhe entregue (“check out”) uma cópia de trabalho do diretório meuprojeto/trunk no repositório:
$ svn checkout file:///caminho/do/repositorio/meuprojeto/trunk meuprojeto
A meuprojeto/foo.c
A meuprojeto/bar.c
A meuprojeto/Makefile
...
Checked out revision 1.
Agora você tem uma cópia pessoal de uma parte do repositório em um novo diretório chamado meuprojeto. Você pode alterar os arquivos em sua cópia de trabalho e então submeter essas alterações de volta para o repositório.
• Entre em sua cópia de trabalho e modifique o conteúdo de algum arquivo.
• Execute svn diff para ver uma saída unificada de suas alterações.
• Execute svn commit para submeter a nova versão de seu arquivo ao repositório.
• Execute svn update para deixar sua cópia de trabalho “atualizada” com o repositório.
Para conhecer todas as coisas que você pode fazer com sua cópia de trabalho, leia Capítulo 2 do livro do Subversion, uso básico.


Referências:
conceitos_basicos_controle_versao_centralizado_e_distribuido
Controle de versão com Subversion no Eclipse no Windows
Subclipse - plugin do Subversion no Eclipse 
Livro do Subversion 
Tutorial resumido do Subversion
Criando um servidor de versões com Visual SVN Server 
Hospedando projetos no Google-code

10 de novembro de 2009

Java API - documentação

A API é uma biblioteca (coleção de classes) que desempenha as funções básicas de uma linguagem de programação, ela é essencial para implementar as funcionalidades que desejamos para nossa aplicação.

A biblioteca de classes (API java) está organizada em pacotes, por exemplo:
  • javax.swing - janelas para criar a interface de usuário com menus;
  • java.util - classes utilitárias;
  • java.math - cálculos matemáticos;
  • java.io - interações de entrada e saída;
Podemos introduzir nossas próprias classes e pacotes, criando nossa própria biblioteca reutilizando nossas funções em outros programas.

Para utilizar a API basta fazer o download da ultima versão, e mostrar o caminho de onde foi salvo para o IDE (editor de programas), assim podemos acessar as classes da biblioteca usando o comando import no início do código:
import java.util.arraylist;
import javax.swing.*;
public class minha {

A melhor maneira de conhecer todo o potencial de uma linguagem de programação é ler a documentação de sua API, que em java está disponível no seu site oficial (em inglês):
http://java.sun.com/javase/6/docs/api/

Introdução à C. da Computação com Java e Orientação a Objetos

O livro evoluiu da experiência dos autores no ensino da disciplina de Introdução à Ciência da Computação ministrado no Instituto de Matemática e Estatística da Universidade de São Paulo. Suas características principais são um estilo informal e o uso, desde a primeira aula, de conceitos de Orientação a Objetos.

Este livro já foi adotado como livro-texto da disciplina introdutória de Computação para alunos do Bacharelado em Ciência da Computação, Bacharelado em Matemática, Licenciatura em Matemática, Bacharelado em Sistemas de Informação, Bacharelado em Física e Licenciatura em Física da USP.

Para baixar o livro clique em IntroCCcomJavaeOO.pdf

Alguns exemplos de código-fonte em Java podem ser encontrados em nossa pasta de Exemplos.
Professores: os arquivos para a produção do Teatro de Objetos estão disponíveis neste site.

Referência:
http://introjava.incubadora.fapesp.br/portal

5 de novembro de 2009

TIOBE - ranking das linguagens mais usadas

O índice da comunidade de programação TIOBE dá uma indicação da popularidade das linguagens de programação. O ranking (índice) é atualizado mensalmente e é baseado na qualificação de engenheiros no mundo inteiro, cursos e fornecedores. Google, MSN, Yahoo!, Wikipedia e YouTube são utilizados para calcular os votos. Observe que o índice TIOBE não é sobre a melhor linguagem de programação ou a línguagem em que a maioria das linhas de código têm sido escrito, mas é para verificar a popularidade das linguagens de programação.

O índice pode ser usado para verificar se suas habilidades de programação são ainda actualizados ou para tomar uma decisão estratégica sobre a linguagem de programação deve ser adotada quando começar a construir um novo sistema de software. A definição do índice TIOBE pode ser encontrada aqui.

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

LUA - a linguagem brasileira

Lua é uma linguagem de programação poderosa, rápida e leve, projetada para estender aplicações.
Lua combina sintaxe simples para programação procedural com poderosas construções para descrição de dados baseadas em tabelas associativas e semântica extensível. Lua é tipada dinamicamente, é interpretada a partir de bytecodes para uma máquina virtual baseada em registradores, e tem gerenciamento automático de memória com coleta de lixo incremental. Essas características fazem de Lua uma linguagem ideal para configuração, automação (scripting) e prototipagem rápida.

Lua é usada em muitas aplicações industriais (e.g., Adobe's Photoshop Lightroom), com ênfase em sistemas embutidos (e.g., o middleware Ginga para TV digital) e jogos (e.g., World of Warcraft). Lua é atualmente a linguagem de script mais usada em jogos. Lua tem um sólido manual de referência e existem vários livros sobre a linguagem. Várias versões de Lua foram lançadas e usadas em aplicações reais desde a sua criação em 1993.

Lua é rápida

Lua tem uma merecida reputação de ótimo desempenho. Outras linguagens de script aspiram ser "tão rápidas quanto Lua". Vários benchmarks mostram Lua como a linguagem mais rápida dentre as linguagens de script interpretadas. Lua é rápida não só em programas específicos para benchmarks, mas no dia-a-dia também. Porções substanciais de aplicações grandes são escritas em Lua.

Lua é portátil

Lua é distribuída via um pequeno pacote e compila sem modificações em todas as plataformas que têm um compilador ANSI/ISO C. Lua roda em todos os tipos de Unix e Windows, e também em dispositivos móveis (como computadores de mão e celulares que usam BREW, Symbian, Pocket PC, etc.) e em microprocessadores embutidos (como ARM e Rabbit) para aplicações como Lego MindStorms.

Lua é embutível

Lua é uma engine rápida e pequena que você pode facilmente embutir na sua aplicação. Lua tem uma API simples e bem documentada que permite uma integração forte com código escrito em outras linguagens. É simples estender Lua com bibliotecas escritas em outras linguagens. Também é simples estender programas escritos em outras linguagens com Lua. Lua é usada para estender programas escritos não só em C e C++, mas também em Java, C#, Smalltalk, Fortran, Ada, e mesmo outras linguagens de script, como Perl and Ruby.

Lua é poderosa (e simples)

Um conceito fundamental no projeto de Lua é fornecer meta-mecanismos para a implementação de construções, em vez de fornecer uma multidão de construções diretamente na linguagem. Por exemplo, embora Lua não seja uma linguagem puramente orientada a objetos, ela fornece meta-mecanismos para a implementação de classes e herança. Os meta-mecanismos de Lua trazem uma economia de conceitos e mantêm a linguagem pequena, ao mesmo tempo que permitem que a semântica seja estendida de maneiras não convencionais.

Lua é pequena

Incluir Lua numa aplicação não aumenta quase nada o seu tamanho. O pacote de Lua 5.1.4, contendo o código fonte, documentação e exemplos, ocupa 212K comprimido e 860K descompactado. O fonte contém cerca de 17000 linhas de C. No Linux, o interpretador Lua contendo todas as bibliotecas padrões de Lua ocupa 153K e a biblioteca Lua ocupa 203K.

Lua é livre

Lua é software livre de código aberto, distribuída sob uma licença muito liberal (a conhecida licença MIT). Lua pode ser usada para quaisquer propósitos, incluindo propósitos comerciais, sem qualquer custo ou burocracia. Basta fazer um download e usá-la.

Lua tem importância global

O projeto e a evolução de Lua foram apresentados em junho de 2007 na HOPL III, a 3a Conferência da ACM sobre a História das Linguagens de Programação. Essa conferência ocorre a cada 15 anos (a primeira foi em 1978 e a segunda em 1993) e somente poucas linguagens são apresentadas a cada vez. A escolha de Lua para a HOPL III é um importante reconhecimento do seu impacto mundial. Lua é a única linguagem de programação de impacto desenvolvida fora do primeiro mundo, estando atualmente entre as 20 linguagens mais populares na Internet (segundo o índice TIOBE).

Referência:
site oficial: http://www.lua.org/portugues.html

28 de outubro de 2009

Python a linguagem acadêmica americana

Como educador, pesquisador e autor de livros, regozija-me ver completo este trabalho. Python é uma linguagem de programação divertida e extremamente fácil de usar que tem ganho forte popularidade nestes últimos poucos anos. Desenvolvida dez anos atrás por Guido van Rossun, a sintaxe simples do Python e seu sentido geral são grandemente derivados do ABC, uma linguagem didática que foi desenvolvida nos anos 80.

Entretanto, Python também foi criado para solucionar problemas reais e tomou emprestado uma grande quantidade de características de linguagens de programação como C++, Java, Modula-3 e Scheme. Por causa disso, uma das mais notáveis características do Python é o grande apelo que tem junto a desenvolvedores profissionais de software, cientistas, pesquisadores, artistas e educadores.

A Despeito deste apelo do Python junto às mais variadas comunidades, você pode ainda estar pensando por que Python? Ou por que ensinar programação com Python? Responder à estas perguntas não é uma tarefa fácil, especialmente se a opinião pública está do lado de alternativas mais masoquistas como C++ e Java. Entretanto, eu acho que a resposta mais direta é que programar com Python é um bocado divertido e mais produtivo.
Quando ministro cursos de ciências da computação, o que desejo é cobrir conceitos importantes além de tornar a matéria interessante e os alunos participativos. Infelizmente, existe uma tendência entre os cursos introdutórios de programação a focar atenção demais em abstrações matemáticas, e de frustração entre os alunos com problemas enfadonhos e inoportunos relacionados a detalhes de sintaxe em baixo nível, compilação e a imposição de regras que aparentemente só um expert pode compreender (enforcement of seemingly arcane rules XXX). Embora alguma abstração e formalismo sejam importantes para engenheiros profissionais de software e estudantes que planejam continuar seus estudos em ciências da computação, escolher tal abordagem em um curso introdutório faz da ciência da computação algo entediante. Quando ministro um curso, não desejo uma sala cheia de alunos sem inspiração. Em vez disso, preferiria muito mais vê-los tentando solucionar problemas interessantes explorando idéias diferentes, trilhando caminhos não convencionais, quebrando regras, e aprendendo a partir de seus erros. Fazendo assim, não pretendo desperdiçar metade de um semestre tentando explicar problemas obscuros de sintaxe, mensagens ininteligíveis de compiladores ou as várias centenas de maneiras pelas quais um programa pode gerar uma falha geral de proteção.

Uma das razões pelas quais eu gosto de Python é que ele oferece um equilíbrio realmente bom entre o lado prático e o lado conceitual. Sendo Python interpretado, os iniciantes podem pegar a linguagem e começar a fazer coisas legais quase imediatamente sem se perderem em problemas de compilação e ligação (linking XXX). Além disso, Python vem com uma grande biblioteca de módulos que podem ser utilizados para fazer todo tipo de tarefa, desde a programação para a web até gráficos. Com tal enfoque prático temos uma bela maneira de alcançar o engajamento dos alunos e permitir que eles finalizem projetos significativos. Entretanto, Python também pode servir de excelente embasamento para a introdução de conceitos importantes em ciência da computação. Já que Python suporta plenamente procedimentos (procedures) e classes, os alunos podem ser gradualmente introduzidos a tópicos como abstração procedural, estruturas de dados, e programação orientada a objetos, todos aplicáveis em cursos posteriores de Java ou C++. Python ainda toma emprestado certas características de linguagens de programação funcionais e pode ser usado para introduzir conceitos cujos detalhes poderiam ser aprofundados em cursos de Scheme e Lisp.

Lendo o prefácio de Jeffrey, fiquei impressionado com seu comentário de que Python o fez ver um maior nível de sucesso e um menor nível de frustração, o que lhe permitiu progredir mais depressa com resultados melhores. Embora estes comentários refiram-se aos seus cursos introdutórios, eu às vezes uso Python exatamente pelas mesmas razões em cursos avançados de pós-graduação em ciência da computação na Universidade de Chicago. Nestes cursos, enfrento constantemente a assustadora tarefa de cobrir muitos tópicos difíceis em um rapidíssimo trimestre (quarter XXX) de nove semanas. Embora me seja possível inflingir um bocado de dor e sofrimento pelo uso de uma linguagem como C++, tenho percebido muitas vezes que este enfoque é contraproducente especialmente quando o curso é sobre um tópico não relacionado apenas com programar. Acho que usar Python me permite um melhor foco no tópico em questão, enquanto permite que os alunos completem projetos substanciais em classe.

Embora Python seja ainda uma linguagem jovem e em evolução, acredito que tem um futuro brilhante em educação. Este livro é um passo importante nessa direção.

David Beazley
Universidade de Chicago
Autor de Python Essencial Reference

 Texto extraído da apresentação do livro:
Como pensar como um Cientista de Computação usando Python

24 de outubro de 2009

Python

Python é uma linguagem de altíssimo nível, orientada a objetos, de tipagem dinâmica e forte, interpretada e interativa. Foi criada em 1990 por Guido van Rossum, no Instituto Nacional de Pesquisa para Matemática e Ciência da Computação da Holanda (CWI) e tinha como foco original usuários como físicos e engenheiros. O Python foi concebido a partir de outra linguagem existente na época, chamada ABC.

O Python possui uma sintaxe clara e concisa, que favorece a legibilidade do código fonte, tornando a linguagem mais produtiva.
A linguagem inclui diversas estruturas de alto nível (listas, tuplas, dicionários, data / hora, complexos e outras) e uma vasta coleção de módulos prontos para uso, além de frameworks de terceiros que podem ser adicionados. Também possui recursos encontrados em outras linguagens modernas, tais como: geradores, introspecção, persistência, metaclasses e unidades de teste. Multiparadigma, a linguagem suporta programação modular e funcional, além da orientação a objetos. Mesmo os tipos básicos no Python são objetos.
A linguagem é interpretada através de bytecode pela máquina virtual Python, tornando o código portável. Com isso é possível compilar aplicações em uma plataforma e rodar em outras ou executar direto do código fonte.

Python é um software de código aberto (com licença compatível com a General Public License (GPL), porém menos restritiva, permitindo que o Python seja incorporados em produtos proprietários) e a especificação da linguagem é mantida pela Python Software Foundation2 (PSF).
Python é muito utilizado como linguagem script em vários softwares, permitindo
automatizar tarefas e adicionar novas funcionalidades, entre eles: BrOffice.org,
PostgreSQL, Blender e GIMP. Também é possível integrar o Python a outras linguagens, como a Linguagem C. Em termos gerais, o Python apresenta muitas similaridades com outras linguagens dinâmicas, como Perl e Ruby.

Exemplo:
# Exemplo de programa em Python
# Uma lista de instrumentos musicais
    instrumentos = ['Baixo', 'Bateria', 'Guitarra']
# Para cada nome na lista de instrumentos
   for instrumento in instrumentos:
 # mostre o nome do instrumento musical
   print instrumento
Saída:
Baixo
Bateria
Guitarra
Bytecode
O código fonte é traduzido pelo interpretador para o formato bytecode, que é
multiplataforma e pode ser executado e distribuído sem fonte original.
Por padrão, o interpretador compila os fontes e armazena o bytecode em disco, para que a próxima vez que o executar, não precise compilar novamente o programa, reduzindo o tempo de carga na execução. Se os fontes forem alterados, o interpretador se encarregará de regerar o bytecode automaticamente, mesmo utilizando o shell interativo.
Quando um programa ou um módulo é evocado, o interpretador realiza a análise do código, converte para símbolos, compila (se não houver bytecode atualizado em disco) e executa na máquina virtual Python.

O bytecode é armazenado em arquivos com extensão “.pyc” (bytecode normal) ou “.pyo” (bytecode otimizado).
O bytecode também pode ser empacotado junto com o interpretador em um executável, para facilitar a distribuição da aplicação.

Modo interativo
O modo interativo é uma característica diferencial da linguagem, pois é possível testar e modificar o código de um programa antes da inclusão do código nos programas, por exemplo.
Exemplo do Python sendo usado de forma interativa (com o shell PyCrust4): 

Referências:
http://www.python.org/
Livro: Python para desenvolvedores (formato PDF)
Computação Gráfica em Python (formato PDF)
http://www.python.org/download/

29 de setembro de 2009

Grade Ciências da Comp. 2007 UeVa

Analise os pré-requisitos com foco em programação:

Analise os pré-requisitos com foco em matemática e Hardware:


Universidade Estadual do Vale do Acaraú

Grade curricular do curso de Ciências da Computação - 2006.1 - 2007.1

Nº / código / nome / pré-requizito / nº de créditos / horas-aula

1 LPROG137 Lógica de programação n 8 120
2 CETIC137 Ética n 4 60
3 CIUNI137 Introdução a universidade n 2 30
4 CPORT137 Português n 4 60
5 CINGL137 Inglês n 4 60
6 CMTCI137 Metodologia do trabalho científico n 4 60

7 ALGLI237 Álgebra linear n 4 60
8 CCAL1237 Cálculo I n 6 90
9 CIRDI237 Circuitos digitais 1 4 60
10 MATDI237 Matemática discreta n 6 90
11 LPRO1237 Linguagem de programação I 1 4 60
12 LABPR237 Laboratório de programação 1 4 60

13 CCAL2337 Cálculo II 8 6 90
14 FISIC337 Física 8 4 60
15 ESTDA337 Estrutura de dados 12e11 8 120
16 LOGMA337 Lógica matemática 10 6 90
17 ARQCO337 Arquitetura de computadores 9 4 60

18 BADA1437 Banco de dados I 15e11 6 90
19 TEOGR437 Teoria dos grafos 15 4 60
20 ADMSS437 Administração de sistemas e serviços n 4 60
21 PROBJ437 Programação orientada a objeto 11 8 120
22 ESAPC437 Estatística com apoio computacional n 6 90

23 HARDB537 Hardware básico n 4 60
24 CALNU537 Cálculo numérico 7,13e11 4 60
25 ANPSI537 Análise e projeto de sistemas 18,11e21 6 90
26 CONAA537 Construção e análise de algoritmo 11e19 6 90

27 BADA2637 Banco de dados II 18 6 90
28 REDCO637 Rede de computadores 17e14 6 90
29 SISTO637 Sistemas operacionais 17 6 90
30 LIFAU637 Linguagens formais e automatos 11,10e19 6 90

31 COPIL737 Compiladores 30 6 90
32 ENGSO737 Engenharia de software 25 4 60
33 INTAR737 Inteligência artificial 16e11 6 90
34 SISDI737 Sistemas distribuídos 28 4 60

35 COMPS837 Computadores e sociedade 2 4 60
36 ESTA1837 Estágio supervisionado I n 12 180

37 COMPG937 Computação gráfica 24e11 6 90
38 ESTA2937 Estágio supervisionado II 36 20 300

Optativas
CONGR037 Contabilidade geral n 4 60
DILEG037 Direito e legislação n 4 60
EMPRE037 Empreendedorismo n 4 60
INETC037 Introdução a economia n 4 60
PROLI037 Programação linear n 4 60
GERDC037 Gerenciamento de rede de computadores 28 4 60
LPRG2037 Linguagem de programação II 11 4 60
MACFI037 Matemática comercial e financeira n 4 60
INTAD037 Introdução a administração n 4 60
TOAVC037 Tópicos avançados em computação s 4 60

18 de setembro de 2009

Padrões de projeto - Design Pattern

Design Pattern é uma forma padrão de organizar classes e objetos, nomes para soluções que você já modelou, uma forma de compartilhar conhecimentos sobre POO, soluções de POO para problemas que incidem em diversos cenários de desenvolvimento, etc.
Quando adotamos o uso de Design Patterns seu código fica mais organizado, aumenta a qualidade, menor complexidade, aumenta a comunicação dentro da equipe de desenvolvimento, etc.
A definição de um pattern pode conter:
            O nome: identifica o padrão;
            O problema: explica o problema e o seu contexto;
          A solução: descreve a maneira de melhorar o desenvolvimento, relacionamentos, responsabilidades, colaborações, de maneira ser implementada em diferentes situações;
     • As consequências: os resultados de aplicarmos o padrão;

Família de Patterns GoF
GoF (Quatro criadores) é uma familia de Design Patters, são 23 padrões, veja alguns:
            Criação: Abstract Factory, Builder, Factory Method, Prototype, Singleton
            Estrutura: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy
          Comportamento: Chain Of Response, Command Interpreter, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor.

Familia de Patterns J2EE
            • J2EE: Busness Delegate, Composite Entity, Composite View, Data Access Object, Fast Lane Reader, Front Controller, Intercepting Filter, Model-View-Controller, Service Locater, Session Facade, Transfer Object, Value List Handler, View Helper
Você pode consultar o catalogo de Patterns do J2EE no endereço abaixo.

Patterns e Certificação
As seguintes certificações Sun exigem conhecimentos de Patterns:
            • Sun Certified Web Component Developer
            • Sun Certified Enterprise Architect;

Para quem pretende tirar uma destas certificações é necessário estudar todos os patterns, aplicar na prática os principais GoF e conhecer a teoria básica;
Alguns Patterns
Service Locator
            Definição: simplifica o acesso a recursos J2EE em um aplicativo centralizando lookups com JNDI em classes específicas de localização de serviços.
            • Evita que sua solução tenha alto acoplamento com JNDI Naming Service;
            • Tomar cuidado com Service Locates e cluster!
            • Utilize sempre que possível ENC.
            • Exemplo no JAREF(J2EE Architecture, Research and Education Framework);

Data Access Object
            Definição: centraliza o serviço de persistência de objetos em um pequeno conjunto de classes, evitando por exemplo que o código SQL se espalhe pelo código da solução.
            • Mesmo utilizando framework de persistência, utilize Data Access Object
            • Exemplo no JAREF(J2EE Architecture, Research and Education Framework);

Model View Control
            Definição: divide o aplicativo em dados, comportamento e apresentação.
            • Aplicando o MVC podemos reaproveitar o mesmo dado para múltiplas visualizações;
            • Podemos reaproveitar o comportamento(eventos) da solução;
            • É um pattern de arquitetura, criado há muito tempo. Pode ser aplicado em qualquer linguagem, mais facilmente com OOP.
            • Struts, WebWork, Spring, PicoContainer são exemplos de frameworks J2EE.
            • Link comparativo de frameworks MVC: https://equinox.dev.java.net/framework-comparison/WebFrameworks.pdf

Front Controller
            Definição: centraliza requests em um ponto central na solução.
            • No lugar de um JSP submit para ouro JSP todos os JSP’s “subments” para um Servlet Controller que será responsável por processar as requisições.
            • Exemplo no JAREF(J2EE Architecture, Research and Education Framework);

Command / Action
            Definição: encapsula uma requisição ao software em um objeto.
            • Transforma métodos em classes
            • Facilita o desenvolvimento de undo/redo
            • Aumenta a granularidade do código, permitindo o reuso
            • Action do Struts é o principal exemplo de implementação deste pattern

Factory
            Definição: instancia classes conforme demanda, recebendo parâmetros indicativos do objeto a ser instanciado.
            • É comum o Controller “inchar”, pois nele incide todas as solicitações externas. Como uma maneira de resolver esse tipo de crescimento desordenado, é sugerido que o Command seja criado sob demanda, e deixa por conta de uma Factory a instanciação das classes Command necessárias.

Dispatcher to views
            Definição: gerencia a saída de informações para a interface desejada pelo cliente. Desatrela a forma de se enxergar os dados para múltiplas visões.
            • É uma maneira de se implementar M. V. C. na sua essência, como o Smalltalk pregava.

Intercepting Filter
            Definição: forma para executar pré e pós processamento em request da solução.
            • Um Servlet Filter é um exemplo de implementação de um Intercepting Filter para interceptar requests no Web Container;

View Helper
            Definição: simplifica a “redenrização” de objetivos em views com formatação.
            • Uma Custom Tag pode representar uma View Helper;
            • Uma simples classe convencional com métodos estáticos também;
            • Exemplo no JAREF(J2EE Architecture, Research and Education Framework);

Business Delegate
            Definição: em aplicações distribuídas, o acesso remoto/local a EJB’s via JNDI Naming Service e tratamento de erros podem se tornar complexo à medida que o projeto cresce.
            Solução: criar uma classe intermediaria para acessar os EJB’s que contempla as regras de nomes de componentes para lookups, propriedades do servidor J2EE, tratamento de exceptions, etc;
Conclusão
            • Os patterns (padrões) previnem erros comuns evitando problemas recorrentes;
        • Utilizando patterns você cria soluções padronizadas, facilitando a troca de programadores;
            • Você pode criar seus próprios patterns;