Relatório Técnico Padrões
Relatório Técnico Padrões
Relatório Técnico Padrões
1. INTRODUÇÃO ................................................................................................................................ 1
3. EXEMPLOS DE PADRÕES.......................................................................................................... 17
5. CONCLUSÃO ................................................................................................................................ 27
1. INTRODUÇÃO
Neste relatório técnico tratamos de uma técnica de representação do
conhecimento denominada padrões. Sua idéia original é atribuída ao arquiteto
Christopher Alexander, que no final da década de 60 e na década de 70, propôs uma
linguagem de padrões para utilização no projeto arquitetônico, com o objetivo de sanar
diversos problemas por ele apontados nestes projetos (LEA, 1994). A linguagem de
padrões1 proposta (vide seção 2.3) inicia num nível de abstração muito grande,
explicando como o mundo deveria ser dividido em nações, nações em regiões, e assim
por diante, descendo até o nível de projeto de estradas, estacionamentos, comércio,
lugares de trabalho, casas e templos de adoração. Os padrões vão apresentando foco
com nível de detalhe cada vez maior, passando por uma discussão de como arranjar os
quartos e salas de casas, até finalmente descrever o tipo de material a ser usado em
paredes, a decoração da casa e como tratar a iluminação.
A forma e as características de padrões, bem como os métodos e processos
associados, não são de modo algum especiais apenas para projetos arquitetônicos. A
interconexão cuidadosa entre contextos, forças do espaço de problemas e soluções
construtivas formam uma base ideal para a captura de outros tipos de conhecimento de
projeto e prática. GAMMA et al. (1995) afirmam que, apesar de se referir a prédios e
cidades, o que Alexander diz é verdade também em relação aos padrões de projetos
orientados a objetos, se diferenciando apenas por apresentar as soluções em termos de
objetos e interfaces, em vez de paredes e portas.
Para Alexander, um padrão é ao mesmo tempo uma coisa e a regra que diz como
criar esta coisa e quando devemos criá-la. Ralph Johnson afirma que os padrões de
Alexander aparentam ser um bom modelo para os tipos de planos necessários para o
desenvolvimento de software (JOHNSON, 1994a). Na Ciência da Computação, padrões
têm sido alvo de estudo desde o final da década de 80, tendo como inspiração o trabalho
de Alexander (JOHNSON, 1994b).
1
Um conjunto de padrões, cada um descrevendo como resolver um tipo específico de problema (vide
seção 1.4).
1
No capítulo introdutório da publicação dos trabalhos apresentados na primeira
conferência sobre padrões, a PLoP’942 (COPLIEN, 1994a), Ralph Johnson apresenta
como uma justificativa da inauguração desta conferência a contínua insatisfação do
grupo fundador com a literatura sobre desenvolvimento de software. Segundo Johnson, a
tendência a sempre se privilegiar o novo fomenta uma rejeição pelo usual, não
importando o quão útil possa ser. O grupo, pela sua experiência em Orientação a Objetos
e Reutilização, sabe que projetos falham, mesmo utilizando o que há de mais moderno
em tecnologia. Portanto, decidiram que era necessário concentrar a atenção na
disseminação de soluções.
A motivação do grupo fundador dos seminários anuais PLoP ilustra bem o
objetivo do uso de padrões. Como afirma JOHNSON (1994a), especialistas em projetos
têm uma grande quantidade de padrões na cabeça e utilizam-nos para produzir projetos
bem acabados, combinando-os e estendendo-os. O emprego de padrões tem sido,
portanto, no sentido de disseminar soluções, incorporando, além de soluções,
informações tais como descrições do problema e contexto de aplicação. Dessa maneira, a
experiência de especialistas passa a estar disponível para o uso disseminado, fornecendo
solução para problemas que assolam o desenvolvimento de software.
O objetivo principal dos fundadores da PLoP foi a criação de um manual para
engenheiros de software que informe como projetar software, para ser usado de maneira
semelhante aos de outras áreas de engenharia. A meta era permitir que um engenheiro de
software realizasse seu trabalho de forma semelhante a um engenheiro civil, por
exemplo, ao projetar uma ponte. Através da consulta a manuais específicos, ele seleciona
um tipo de ponte (por exemplo, estrutura metálica ou concreto), determina a estrutura,
os materiais, a forma, etc.
Na figura 1, encontra-se um gráfico estabelecendo uma escala de evolução de
conceitos sobre a representação de dados com que se lida no desenvolvimento de
software. O dado seria uma porção do mundo representado. A informação seria porções
relacionadas. O conhecimento seria a obtenção de nova porção a partir da Informação
existente. Finalmente, sabedoria seria a possibilidade de refletir, num novo contexto, um
conhecimento existente (PRESSMANN, 1992). O uso dos padrões facilita a efetivação
2
Realizada anualmente, desde então, dentro da conferência Conference on Object-Oriented
Programming, Systems, Languages, and Applications - OOPSLA.
2
da sabedoria. Até agora, o trabalho de especialistas só estava disponível através de
consultas a manuais que explicavam métodos de desenvolvimento, pela investigação de
produtos acabados ou consultas aos próprios especialistas. O uso de padrões pretende
tornar mais acessível este conhecimento.
LEA (1994), na análise que faz das possibilidades da conjugação dos conceitos
de orientação a objetos e padrões, lembra que a maior parte dos trabalhos de pesquisa
ainda estão na fase exploratória, e que, embora modelos de processos orientados a
objetos ainda não estejam maduros, sua sinergia com modelos baseados em padrões é
óbvia. Acaba por sugerir que é possível que as idéias, que isolaram Alexander do ramo
principal da arquitetura comercial, podem acabar por encontrar seu maior e mais
duradouro impacto na engenharia de software orientado a objetos.
ALFRED e MELLOR (1995) chegaram a afirmar que padrões iriam ser a
“revolução industrial” do desenvolvimento de software. Afirmaram que seria possível,
nos anos que faltam para o ano 2000, adotar um processo de desenvolvimento baseado
em padrões com as fases de projeto e implementação automatizadas, mesmo
considerando ser necessário ainda bastante trabalho para identificar, catalogar e
representar padrões de análise, de projeto e de arquitetura de sistemas, bem como para
definir formalismos para classificar restrições de aplicações e especificar políticas de
desenvolvimento. No entanto, isto parece ser demasiadamente otimista.
PREE (1994) e GAMMA et al. (1995) consideram os padrões como uma
extensão dos métodos de desenvolvimento de software orientados a objetos. COPLIEN
e SCHMIDT (1995) consideram os padrões como uma técnica importante para o
aperfeiçoamento da qualidade do software.
A pesquisa sobre padrões amadurece rapidamente. Sua introdução encontrou
uma comunidade ansiosa por discutir soluções, na medida em que os problemas já eram
3
de conhecimento generalizado, bem como as ferramentas para lidar com eles. Dessa
forma, na segunda conferência sobre padrões, a PLoP’95, observou-se que o valor de
um padrão não mais estava na sua descoberta, mas em sua relevância, qualidade e
impacto (VLISSIDES et al., 1996).
Nos trabalhos aqui abordados, encontramos padrões aplicáveis ao longo de todo
o processo de desenvolvimento de software. Há padrões específicos para a análise de
requisitos, para o planejamento e gerência do processo, bem como, com bastante
abundância, para o projeto de software.
A seguir, na seção 2, apresentamos uma conceituação teórica sobre os padrões.
Na seção 3, apresentamos exemplos encontrados na literatura. Na seção 4, discutimos o
desenvolvimento de software utilizando padrões. Por fim, na seção 5, concluímos o
relatório técnico.
4
2. O QUE SÃO PADRÕES
Nesta seção é apresentada a conceituação de padrões, algumas possíveis
aplicações, uma discussão sobre como encontrá-los e organizá-los, bem como as
diferentes formas de como são definidos na literatura. Discute-se, ainda, sobre as
diferenças, pouco claras em alguns trabalhos, entre padrões e frameworks. Por fim,
tratamos da questão da classificação dos padrões.
2.1. Conceituação
Segundo GAMMA et al. (1995), Alexander observa que cada padrão descreve
um problema que ocorre repetidamente em nosso meio, e inclui uma solução de forma
genérica para o mesmo, de tal maneira que se pode usar esta solução mais de um milhão
de vezes, sem nunca fazê-lo de maneira idêntica. LEA observa que alguns padrões são
simplesmente receitas, mas que, apesar disso, um especialista pode usá-lo da mesma
maneira que um cozinheiro usa uma receita, como auxílio na criação de uma visão
pessoal de uma realização particular, mas ainda mantendo os ingredientes e proporções
que são críticos (LEA, 1994).
A forma dos padrões é importante (uma discussão mais aprofundada pode ser
encontrada na seção 2.5). Uma forma simples para padrões foi apresentada por LEA
(1995), afirmando ser esta a mais comum dos padrões de Alexander:
SE
você se encontra no contexto CONTEXTO,
por exemplo, EXEMPLOS,
com PROBLEMAS,
conseqüentes às FORÇAS
ENTÃO
por algumas RAZÕES,
aplicar FORMATO E/OU REGRA DE PROJETO
para construir SOLUÇÃO
levando a NOVO CONTEXTO e OUTROS PADRÕES
5
• Nome: Uma identificação, de uma ou duas palavras, que se possa usar para descrever
o problema, suas soluções e conseqüências. A nomeação de padrões aumenta o
vocabulário de projeto e permite que se projete num nível de abstração mais alto.
Além disso, a existência de um vocabulário de padrões facilita sua comunicação e,
portanto, sua discussão e evolução;
• Problema: Descreve quando o padrão é aplicável, além de explicar o problema e o
contexto. Pode descrever problemas específicos de projeto, como por exemplo, de
que forma representar algoritmos como objetos. Pode, também, descrever estruturas
de objetos e classes que são sintomáticos de um projeto sem flexibilidade. Pode, às
vezes, incluir uma lista de condições para a aplicação do padrão;
• Solução: Descreve os elementos que compõem o projeto, seus relacionamentos,
responsabilidades e colaborações. Não descreve um projeto concreto ou uma
implementação em particular, já que um padrão é como um “template”, que pode ser
aplicado em várias situações diferentes. Ao contrário, um padrão apresenta uma
descrição abstrata de um problema de projeto e como um arranjo genérico de
elementos (classes e objetos) o soluciona; e
• Conseqüências: São os resultados e comprometimentos (“trade-offs”) da aplicação
do padrão. Apesar das conseqüências não serem consideradas quando se descreve
decisões de projeto, elas são críticas para a avaliação de alternativas, bem como para
compreensão de custos e benefícios da aplicação do padrão. As conseqüências em
software quase sempre se referem a comprometimentos (‘trade-offs”) de espaço e
tempo, mas podem abordar também questões de linguagem e implementação. Como a
reutilização é sempre um fator importante no projeto orientado a objetos, as
conseqüências de um padrão devem incluir o impacto na flexibilidade, estensibilidade
e portabilidade do sistema.
6
• Encapsulamento: Cada padrão encapsula um problema/solução bem definido.
Padrões são independentes, específicos e formulados precisamente (o suficiente para
deixar claro quando são aplicáveis e se capturam problemas relevantes). Além disso,
deve ser assegurado que o padrão faça sentido por si só e que seja útil na construção
de uma entidade reconhecível;
• Abstração: Padrões representam abstrações de experiência empírica e conhecimento
do dia a dia. São genéricos dentro do contexto especificado, mas não necessariamente
universais;
• Abertura: Padrões podem ser arbitrariamente estendidos em níveis de maior detalhe.
Por exemplo, os padrões escolhidos para atacar uma parte de um projeto podem
requerer sub-padrões; e
• Composição: Padrões são relacionados hierarquicamente. Padrões de maior
granularidade são estabelecidos sobre, se relacionam com, e restringem os de menor
granularidade.
Os padrões de COAD (COAD, 1992, COAD et al., 1995) são definidos como
uma combinação de um pequeno grupo de classes e objetos com relacionamentos entre
eles, ocorrendo repetidamente em diferentes modelos de análise e projeto orientados a
objetos, e aplicáveis múltiplas vezes numa mesma aplicação. COAD observa que
métodos orientados a objetos já enfatizam certos padrões de relacionamento, como
generalização-especialização, todo-parte, associação e troca de mensagens, que amarram
os blocos de construção de mais baixo nível. Observa ainda que também já foram
investigados frameworks de aplicação3, mas que combinações de classes, objetos e
relações entre classes e objetos, como encontradas nos padrões, ainda não haviam sido
investigadas (a diferença entre frameworks e padrões é tratada na seção 2.4).
3
Um esqueleto de classes, objetos e relacionamentos, agrupados para a construção de uma aplicação
específica.
7
Segundo LEA (1994), a construção de padrões é como a realização de uma
análise de domínio4, um processo social interativo de coleta, compartilhamento e
amplificação de experiência e conhecimento distribuídos. Algumas vezes padrões são
construídos de forma mecânica, a partir de outros, juntando-os e/ou transformando-os
para que se apliquem a um novo domínio. No entanto, alguns padrões são tão referentes
a conceitos universais que surgem da introspecção e intuição. LEA afirma que
heurísticas são também importantes.
Referindo-se a padrões para análise e projetos orientados a objetos, COAD
(1992) afirma que padrões são encontrados por tentativa e erro e por observação.
COAD et al. (1995) definem estratégias que poderiam ser consideradas como padrões de
desenvolvimento de modelos de objetos. Dentre as estratégias propostas, COAD et al.
apresentam algumas que visam a descoberta de novas estratégias e padrões. Para a
descoberta de novas estratégias, sugere “1) Preste atenção a cada pequeno passo dado
na construção de alguma parte do modelo de objetos. Que conselho poderia dar a outros
para que consigam realizar a mesma tarefa com menos passos, em menos tempo, com
mais regularidade?; e 2) Considere cada correção feita no modelo. Que conselho poderia
dar para ajudar outros a evitar o erro?” Com relação à descoberta de novos padrões,
sugere: “1) Verifique cada grupo de dois, três, quatro, n objetos que possuem interação;
2) Generalize os nomes de cada participante; e 3) Relacione-os, por analogia, a outros
domínios. Verifique se pode ser usado repetidamente.”
4
Análise de Domínio é o processo de identificar e organizar o conhecimento sobre alguma classe de
problemas - o domínio do problema - para dar suporte à descrição e solução destes (ARANGO e
PRIETO-DÍAZ, 1991).
8
Sobre os padrões de Alexander, LEA (1994) observa que a maioria dos padrões
podem ser compostos, assim como podem ser componentes, minimizando a interação
com outros. Observa-se ainda que padrões levam a outros padrões, num mesmo nível ou
num nível de detalhe maior (menor granularidade). A experimentação com possíveis
variantes e o exame de relacionamentos entre padrões, que juntos formam o todo,
adiciona restrições e ajustes, bem como especializações e refinamentos específicos à
situação. Como os detalhes das instanciações de padrões estão encapsulados, podem
haver variações dentro da faixa estabelecida pelas restrições.
BUSCHMANN e MEUNIER (1995) observam que um sistema de padrões
(como denominam sua linguagem de padrões), para ser útil, precisa considerar todas as
possíveis restrições relativas à combinação e composição dos padrões que compreende.
Apesar de cada padrão endereçar uma questão de projeto em particular, isolada e
completa, nenhum padrão pode ser visto como totalmente independente dos outros. Os
autores observam que, na realidade, um padrão é parte de uma estrutura maior e que
pode conter, estar contido, ou estar interligado com outros padrões, com os quais
também interagirá. Portanto, os padrões, quando combinados corretamente, devem
complementar-se, de modo a que não sejam introduzidos problemas, mais do que são
resolvidos. Ressaltam, ainda, que devem ser elaboradas orientações sob dois aspectos:
• Cada padrão deve especificar com quais padrões pode ser combinado e como,
fornecendo ainda instruções sobre sua integração em estruturas maiores, ou sua
composição a partir de estruturas menores; e
• Estruturas apresentam complexidade por si só, independentemente das questões de
projeto endereçadas pelos padrões que a compõem. Portanto, regras gerais e
instruções devem ser especificadas para sua composição e manipulação,
independentemente de orientações para seus padrões constituintes.
9
2.4. Frameworks x Padrões
JOHNSON (1992) apresenta uma discussão sobre a diferença entre padrões e
frameworks. JOHNSON afirma que:
• Framework: É um projeto reutilizável em soluções de problemas em algum domínio
específico.
• Padrão: São orientados a problemas e não a soluções. Cada padrão descreve como
resolver uma pequena parte de um problema de projeto. Padrões são, perfeitamente,
indicados para ensinar o uso de um framework.
10
objetos de reutilização de maior granularidade, seguidos em ordem decrescente do
framework de aplicação, da micro-arquitetura e, por fim, situados num mesmo nível,
classes, objetos, métodos ou código.
Os autores apresentam estas diferenciações baseados em suas definições de
frameworks e de padrões. Por exemplo, GAMMA et al. (1995), indicam os padrões
como sendo de menor porte que os frameworks, por que seus padrões (aplicáveis à
modelos de classes e objetos da fase de projeto) não compreendem mais do que uma
dúzia de classes e objetos e os frameworks que consideram são os de aplicação, que
normalmente apresentam um grande número de classes e objetos. No entanto,
considerando uma definição mais ampla, padrões podem conter um grande número de
classes e objetos e frameworks podem conter umas poucas classes e objetos. Portanto,
uma diferenciação que considere definições mais abrangentes, elaborada a partir dos
aspectos considerados acima, é apresentada a seguir:
• Um padrão pode encapsular um framework, apresentando-o como solução de algum
problema. São exemplo disso, todos os padrões que apresentam um modelo de classes
e objetos como solução. O framework pode ser tanto de pequeno porte (algumas
poucas classes e objetos) como de grande porte (framework de aplicação) e sua
especialização pode ser mais ou menos genérica. Apesar do objetivo dos padrões ser a
universalidade, é concebível que um padrão seja específico a ponto de ser aplicável
apenas em um domínio;
• Padrões são aplicáveis a frameworks, na medida em que apresentam melhoras em
parte, ou na totalidade, da organização de classes e objetos com um determinado
objetivo; e
• Um framework pode se prestar como o ponto de partida para a criação de um padrão.
Por outro lado, um framework pode ser construído a partir de alguns padrões.
11
• Identificação: Um nome, ou frase, descritivo, curto e familiar, normalmente sendo
mais indicativo da solução do que do problema ou contexto;
• Exemplo: Um ou mais casos ilustrando o emprego do padrão;
• Contexto: Delineamento de situações em que os padrões são aplicáveis. Geralmente
inclui informações de suporte, discussões sobre a necessidade de existência do padrão
e evidências de sua generalidade;
• Problema: Uma descrição das forças e restrições relevantes e como interagem;
• Solução: Uma apresentação da solução do problema, descrita de forma a ser útil, já
que esta é a parte reutilizável. Soluções podem se referenciar e se relacionar com
outros padrões de maior ou menor nível;
• Conseqüências: Uma descrição das implicações da aplicação do padrão, como
restrições e comprometimentos; e
• Padrões Relacionados: Outros padrões que têm alguma relação com este. Por
exemplo, aqueles que podem ser usados em conjunto ou que são semelhantes.
12
e colaborações. São apresentadas também informações bastante interessantes, para o
contexto de aplicação dos seus padrões, sobre a implementação do padrão, além de
fornecer código de amostra. São incluídas também a classificação do padrão com vistas a
auxiliar sua identificação.
Os padrões de BUSCHMANN e MEUNIER seguem um formato semelhante ao
dos padrões apresentados por GAMMA et al., destacando-se por empregar cenários
para a descrição do comportamento dinâmico do padrão (BUSCHMANN e MEUNIER,
1995).
Os padrões de MULARZ (1995) incluem uma análise do padrão sob o aspecto de
desempenho, com o objetivo de disponibilizar ao usuário a possibilidade de obtenção de
uma solução de compromisso entre funcionalidade e performance.
13
PROPÓSITO
Criativo Estrutural Comportamental
ESCOPO Classe Método Fábrica Adaptador (classe) Interpretador
Método Modelo
Objeto Construtor Adaptador (objeto) Cadeia de Responsabilidade
Fábrica Abstrata Composto Comando
Protótipo Decorador Iterador
Singular Fachada Mediador
Peso-Mosca Memorial
Ponte Observador
Procurador Estado
Estratégia
Visitador
Tabela 1 - Classificação de Padrões (GAMMA et al., 1995)
14
Destes trabalhos, o que se figura como o mais completo é o esquema de
BUSCHMANN e MEUNIER, por isso é apresentado a seguir com detalhes.
O trabalho de BUSCHMANN e MEUNIER (1995) é o único trabalho em que
uma classificação é apresentada, na qual é mencionado especificamente a preocupação de
facilitar a busca de um padrão. No entanto, BUSCHMANN e MEUNIER ressaltam que
seu esquema não tem a pretensão de permitir a determinação do padrão correto para
uma dada situação, mas sim diminuir o escopo da busca de padrões adequados.
Observam que seu esquema reflete apenas um ponto-de-vista. Além disso, observam que
é possível que um padrão possa merecer duas diferentes classificações, sugerindo que,
nestes casos, o padrão receba as diversas classificações adequadas.
Seu esquema de classificação prevê três categorias principais: granularidade,
funcionalidade e princípios estruturais, subdivididas em subcategorias.
A categoria Granularidade é apresentada como sendo necessária pelo fato de
problemas no desenvolvimento de software ocorrerem em diferentes níveis de abstração.
Os três níveis de granularidade previstos são:
• Framework de Arquitetura: Visa a estruturação de sistemas de software. Fornece
um conjunto de subsistemas pré-definidos, bem como a organização do
relacionamento entre eles;
• Padrão de Projeto: Descreve um esquema básico para a estruturação de subsistemas
e componentes de uma arquitetura de software, bem como os relacionamentos entre
eles; e
• Idioma: Descreve como implementar componentes específicos de um padrão, sua
funcionalidade ou seus relacionamentos com outros componentes. Em geral, são
específicos para uma determinada linguagem de programação.
15
• Acesso a Objetos: Descrever como ter acesso a serviços e estado de objetos
compartilhados ou remotos, de maneira segura, sem violar seu encapsulamento de
estado e comportamento; e
• Organização do Processamento de Tarefas Complexas: Especificar como distribuir
responsabilidades entre objetos, de forma a solucionar uma função ou tarefa mais
complexa.
16
3. EXEMPLOS DE PADRÕES
Apresentamos a seguir, resumidamente, algumas aplicações de padrões
encontradas na literatura. Em particular, descreveremos os trabalhos que se referem a
padrões de processos.
PREE (1994) apresenta padrões que esclarecem e permitem alternativas quanto à
implementação de modelos em que se deseje separar as áreas específicas do domínio das
que são genéricas. Seu objetivo é aperfeiçoar a construção de frameworks de aplicação.
Como seus padrões podem ser aplicáveis a quaisquer conjuntos de classes, também o
poderiam ser a padrões como os de GAMMA et al. e COAD. Por isto, os denomina
meta-padrões.
COPLIEN (1995) observa que os padrões dão suporte a técnicas emergentes no
projeto de software, fornecendo uma nova maneira de entender e criar programas de
computador. O autor considera-os como uma das mais promissoras abordagens
generativas, sendo particularmente adequados para a construção e evolução
organizacional. Os padrões organizacionais, como COPLIEN os denomina, seriam,
portanto, importantes para a implantação de novas técnicas de estruturação de
programas, uma vez que estas precisam receber o suporte de técnicas gerenciais e
estruturas organizacionais apropriadas.
COPLIEN ressalta que a análise de organizações sob a perspectiva de padrões
não é novidade, mas sim empregá-los de uma forma generativa. Considerando que toda
arquitetura é fundamentalmente preocupada com controle, sua proposta é a definição de
uma arquitetura baseada na estruturação necessária para realizar o negócio, ao invés de
uma arquitetura determinada pelo processo do negócio, como um meio de controlar
indiretamente as pessoas na organização. Afirma que os padrões auxiliam na construção
de novas organizações, além de ajudar a entendê-las, e que um bom conjunto de padrões
organizacionais pode ajudar indiretamente a gerar o processo correto.
O trabalho de WHITENACK (1995), apresenta uma linguagem de padrões para
dar orientação a analistas, desenvolvedores e gerentes de projeto envolvidos na definição
de requisitos, para aplicações comerciais a serem desenvolvidas num ambiente orientado
a objetos. Baseado em sua experiência, de que a análise de requisitos de um domínio de
problema complexo, em geral, é insuficiente para começar um projeto bem sucedido,
17
bem como para evitar uma retomada das atividades de análise e especificação de
requisitos, WHITENACK elaborou uma linguagem de padrões, que almeja os seguintes
objetivos:
• Guiar analistas e desenvolvedores do produto na aplicação apropriada de um conjunto
de técnicas e métodos, de modo que uma análise de requisitos e um entendimento do
problema mais completos sejam atingidos;
• Fornecer uma estrutura básica para a definição e captura de requisitos antes do
desenvolvimento, bem como para a avaliação, projeto, construção e teste de um
produto de software apropriado; e
• Fornecer um meio de rastrear o projeto de um sistema até os objetivos de sistema e de
negócio originais.
18
Em princípio, todos os padrões seriam interessantes, uma vez que, por definição,
resolvem problemas recorrentes no desenvolvimento de software. No entanto, o
interesse deste trabalho se estende sobre o planejamento e gerência de processos de
desenvolvimento, sendo a abordagem enfocada nesta seção restrita aos padrões que
tratam de temas destas áreas.
Uma das linguagem de padrões de processo encontradas na literatura trata apenas
da organização e gerenciamento de equipes (HARRISON, 1996). Por exemplo, um dos
padrões sugere algumas atitudes a serem tomadas pelo líder da equipe, de forma a
fomentar a unidade da equipe. As demais são apresentadas a seguir.
Os padrões de COPLIEN (1995) e WHITENACK (1995) sugerem possíveis
soluções para problemas da análise de sistemas, tais como: 1) formação da equipe; 2)
atribuição de responsabilidades; 3) duração do desenvolvimento; 4) planejamento de
testes; 5) gerência do projeto; 6) determinação do comportamento do sistema; 7)
determinação da natureza essencial do domínio do problema; e 8) avaliação dos
requisitos. Os padrões de COPLIEN ainda apresentam soluções para problemas tais
como: 1) dificuldade de obter especialistas no assunto; 2) dificuldades da equipe
decorrentes do grande número de mudanças; 3) dificuldade de manutenção da
documentação; 4) interferências em excesso de origem externa à equipe; e 5)
comunicação intra-equipe insatisfatória. Já os de WHITENACK incluem soluções aos
seguintes problemas: 1) previsão do funcionamento do sistema no suporte a um processo
de negócio; e 2) especificação de requisitos através de regras de negócio.
O trabalho de BUSCHMANN e MEUNIER (1995) apresentam um conjunto de
padrões para o desenvolvimento de software. Compreende padrões em vários níveis de
abstração, indo de paradigmas fundamentais, para a estruturação dos sistemas, até a
implementação de decisões de projeto específicas. Por exemplo, padrões classificados
como Frameworks de Arquitetura, abordam a estruturação de sistema em camadas ou
usando uma arquitetura baseada no modelo Modelo-Visão-Controlador (“Model-View-
Controller”).
COCKBURN (1996) apresenta uma linguagem de padrões composta de padrões
de princípio de projeto e de padrões de decisões de projetos derivadas dos princípios.
COCKBURN sustenta que os princípios de projeto que norteiam o desenvolvimento
precisam ser definidos, de maneira a serem seguidos durante todo o desenvolvimento,
evitando o aumento da complexidade do software. Por exemplo, um princípio de projeto
19
apresentado é a separação entre a interface do usuário e o modelo da aplicação. Isto
serviria para delimitar os impactos de mudanças na interface com o usuário, um item
reconhecidamente sujeito a mudanças ao longo do ciclo de vida do software. Como
decisões de projeto derivadas deste princípio de projeto, COCKBURN apresenta duas:
1) possibilidade de uso de ferramentas geradoras de interface do tipo “GUI”; e 2)
facilidade de comando da aplicação a partir de outras plataformas.
CUNNINGHAM (1996) apresenta uma linguagem de padrões que aborda
decisões a serem tomadas durante o desenvolvimento de software, por parte de um
agente (um indivíduo, um grupo, um departamento ou a gerência), relativas a uma tarefa
que envolve o produto, o desenvolvimento, a programação ou a operação. O objetivo da
linguagem de padrões é preparar a organização para decisões cruciais e necessárias, de
forma a diminuir o impacto destas decisões e manter o desenvolvimento num fluxo
contínuo. Por exemplo, um padrão estabelece as ações a serem tomadas no sentido de
esclarecer quais os objetivos específicos do produto. Um outro trata da elaboração de
um organograma que não venha a ter conseqüências negativas na equipe.
Em (VASCONCELOS, 1997) é apresentada uma abordagem que emprega os
padrões na extensão e organização de descrições de processos de desenvolvimento, no
contexto de um ambiente de desenvolvimento de software, provendo uma infra-estrutura
para definição e aplicação de padrões de processo. Desta forma, o conhecimento sobre
processos é disponibilizado durante a execução de um projeto de desenvolvimento,
facilitando sua reutilização pela gerência.
20
4. DESENVOLVIMENTO DE SOFTWARE UTILIZANDO
PADRÕES
Nesta seção, são apresentadas observações encontradas na literatura, com relação
ao desenvolvimento de software utilizando padrões. Estes trabalhos consideram a
produção de software ocorrendo a partir de consultas a catálogos de padrões. Os
trabalhos apresentados a seguir são os de ALFRED e MELLOR (1995), PREE (1994) e
BUSCHMANN e MEUNIER (1995).
A produção dos catálogos de padrões é uma dificuldade inicial que, após
resolvida, restará, ainda, a dificuldade da utilização destes catálogos. Como os padrões
são por definição genéricos, pode ser difícil reconhecer em um modelo de domínio (cuja
estrutura reflete conceitos e relações do domínio) um modelo genérico que reflete um
comportamento abstrato. Uma compreensão aprofundada do que está sendo modelado
no domínio pode ajudar, mas, certamente, é a experiência que vai facilitar. Por exemplo,
o fato da descoberta de que o problema sendo modelado possui uma estrutura capturada
por um padrão, permite que se faça uma análise crítica do modelo que estava sendo
gerando e que se façam as correções necessárias para evitar os problemas já detectados e
solucionados pelo padrão.
BUSCHMANN e MEUNIER (1995) apontam a necessidade de um método que
guie o arquiteto de software na utilização de um sistema de padrões durante todo o
projeto. Este guia precisa considerar esquemas de classificação que possibilitem a
identificação de padrões apropriados para uma situação de projeto e a sua integração no
software. Por exemplo, uma abordagem “top-down” pode não ser viável devido à
existência de requisitos de nível mais baixo que afetem a estrutura com um todo.
Baseado no esquema de classificação tridimensional proposto (descrito na seção
2.6), que considera como categorias a granularidade, a funcionalidade e os princípios
estruturais, os autores sugerem um procedimento para a seleção dos padrões candidatos.
A seguir são listados os passos e os comentários apresentados por BUSCHMANN e
MEUNIER (1995):
• Determinar a granularidade requerida do padrão: Os autores observam que
normalmente trata-se de uma tarefa fácil;
21
• Selecionar a funcionalidade desejada: Consideram que deveria ser igualmente fácil,
pois normalmente apenas uma categoria de funcionalidade é considerada para uma
situação de projeto. No entanto, pode ser necessário combinar vários aspectos
funcionais em uma única estrutura, o que acarretará a seleção de um único, ou de um
conjunto de padrões; e
• Determinar os princípios estruturais desejados: Considerado o passo mais difícil.
Será uma decisão de projeto, uma vez que normalmente mais de uma solução
estrutural é possível. O desenvolvedor será forçado a pensar que propriedade
estrutural é a mais útil e importante para a situação em consideração.
22
projeto, consideram a disponibilidade de uma base de conhecimento de projeto, que é um
banco de dados de padrões para domínios abstratos, contendo uma ou mais
implementações para cada padrão e as regras de seleção de uma implementação
específica.
O modo como ALFRED e MELLOR apresentam a influência dos padrões no
processo de desenvolvimento está descrita a seguir:
• Fase de Levantamento de Requisitos: Nesta fase, consideram fundamental a
seleção de padrões de uso adequados;
• Fase de Análise: É papel do analista ter conhecimento sobre os padrões disponíveis
na base de conhecimento de projeto (veja a seguir) e empregá-los na modelagem do
domínio sendo analisado. Ao padrão selecionado, o analista adiciona atributos e
comportamentos específicos do domínio; e
• Fases de Projeto: Para cada padrão do modelo de análise construído, o projetista
aplica as regras da base de conhecimento. Escolhe uma implementação apropriada,
consultando o conjunto de padrões de implementação, que irá adicionar ao modelo
uma estrutura, atributos e comportamentos específicos da implementação. A escolha
de um padrão de projeto vai depender dos padrões de uso selecionados na fase de
levantamento de requisitos, bem como dos objetivos de desempenho e escala.
23
ALFRED e MELLOR consideram que surgirão, tornando possível a
automatização das fases de projeto e implementação, as seguintes ferramentas:
• Geradores de aplicações capazes de produzir todo o código de uma aplicação,
baseados em notações lógicas de modelos de projeto;
• Bases de dados de políticas e de padrões de projeto, que serão a base para
automatização da produção de um modelo de projeto, a partir do modelo de análise e
de um conjunto de restrições de aplicação;
• Ferramentas CASE capazes de produzir modelos de análise completos, detalhados e
testáveis.
24
Identificar Objetos/Classes
Especialista do Domínio, Engenheiro de Software
Adaptar Framework
Especialista do Domínio, Engenheiro de Software
Sim
25
BUSCHMANN e MEUNIER advertem que não se trata de uma tarefa mecânica. É
necessária a habilidade de um arquiteto de sistemas para compor os blocos de construção
adequadamente, mas esta tarefa pode ser facilitada pelo emprego de orientações sobre a
composibilidade de cada padrão e sobre a construção de uma estrutura a partir de
padrões.
BUSCHMANN e MEUNIER apontam três questões a serem investigadas:
• Completeza da linguagem de padrões: Consideram importante discutir sobre a
possibilidade / necessidade da linguagem de padrões ser completa;
• Orientações sobre a construção de uma estrutura a partir de padrões: Por
exemplo, consideram que não é possível adotar uma abordagem “top-down”, já que
restrições de nível mais baixo podem afetar a estrutura como um todo; e
• Esquema de classificação: Consideram necessário aperfeiçoar o esquema de
classificação que apresentam, verificando as categorias previstas, no sentido de
corrigi-las e permitir um classificação mais exata. Ressaltam, ainda, que alguns
desenvolvedores sugerem como alternativa aos esquemas de classificação, o uso de
“mapas”, contendo uma breve descrição dos padrões e suas conexões e ligações.
26
5. CONCLUSÃO
O formato dos padrões pode ser considerado como a definição de uma estrutura
de dados para armazenar o conhecimento sobre problemas e suas soluções. Obviamente,
a evolução da Ciência da Computação, como de qualquer atividade científica, ocorre em
ciclos de: 1) levantar problemas; 2) propor soluções; e 3) aplicar as soluções, chegando
num novo contexto (com novos problemas). Portanto, a tarefa de descrever soluções
para problemas conhecidos, ou não, não tem nada de inovador. A inovação que os
padrões apresentam está na forma sistemática em que são dispostas as descrições. Dessa
forma, o conhecimento que contém fica valorizado, tendo sua aplicação facilitada. O
objetivo de se dispor de manuais para o desenvolvimento de software, de maneira
semelhante a que dispõe um engenheiro civil, pode ser difícil, no entanto, como se pode
verificar pelo crescente número de trabalhos sobre padrões encontrados na literatura,
haverá uma grande quantidade de conhecimento registrado de forma sistemática e
orientado à reutilização. Portanto, torna-se necessário o desenvolvimento de ferramentas
que auxiliem a aplicação dos padrões.
Tão importante quanto ter disponível o conhecimento sobre soluções de
problema, é poder aplicá-las de maneira efetiva. Num ambiente de suporte automatizado
ao desenvolvimento, uma ferramenta pode auxiliar na aplicação de um padrão. Os
padrões devem levar em conta o contexto em que suas soluções serão aplicadas, de
modo a permitir que a ferramenta possa realizar a implementação da solução.
Na medida em que possuem a preocupação básica de registrar de forma completa
o conhecimento sobre problemas, os padrões podem ser úteis para representar o
conhecimento de processos de desenvolvimento, considerando, por exemplo (como faz
WHITENACK (1995)), como problemas, as atividades a serem realizadas de maneira
correta. A utilização de padrões para este fim permite a criação de descrições de
processos que incorporam a bagagem da organização em termos de sua experiência
acumulada no desenvolvimento de software.
Por fim, deve-se fazer uma ressalva sobre o conhecimento capturado nos
padrões. Embora a idéia dos padrões seja já de indiscutível utilidade, o valor do
conhecimento que descrevem precisa ser examinado caso a caso. Os padrões tornaram-
se um incentivo à divulgação de soluções para problemas específicos, e dentre a
27
diversidade de padrões encontrados na literatura é possível encontrar alguns em que as
soluções apresentadas não representam o conhecimento de um especialista na área.
28
BIBLIOGRAFIA
29
Applications - OOPSLA’92, pp. 63-76, Vancouver, British Columbia, Canadá,
1992.
R. Johnson; “Why a Conference on Pattern Languages?”; ACM SIGSOFT Software
Engineering Notes, v. 19, n. 1, pp. 50-52, Janeiro/1994.
R. Johnson; “A Report on PLoP’94”; ROAD, v. 1, n. 4, pp. 54-56, Novembro-
Dezembro/1994.
R. Lajoie e R.K. Keller; “Design and Reuse in Object-Oriented Frameworks: Patterns,
Contracts and Motifs in Concert”; In: Proccedings of the 62nd Congress of the
Association Canadienne Française pour l’Avancement des Sciences -
ACFAS’94, Montreal, Canadá, 1994.
D. Lea; “Christopher Alexander: An Introduction for Object-Oriented Designers”; ACM
SIGSOFT Software Engineering Notes, v. 19, n. 1, pp. 39-46, Janeiro/1994.
D. Lea; Patterns-Discussion FAQ; Disponível por meio de ftp na Internet, Arquivo
ca.ps, Servidor g.oswego.edu; E-mail do autor: [email protected]; Versão de
Março/1995.
D. Mularz; “Pattern-Based Integration Architectures”; In: J. Coplien e D. Scmidt (eds),
Pattern Languages of Program Design; Addison-Wesley, Reading, MA, EUA,
pp. 441-452, 1995.
W. Pree; Design Patterns for Object-Oriented Software Development; Addison-Wesley,
1994.
R.S. Pressman; Software Engineering: A Practitioner’s Approach, McGraw-Hill
International Editions, 3a edição, 1992.
F.M. de Vasconcelos Jr.; Reutilização de Processos de Desenvolvimento de Software
Baseada em Padrões; Tese de Mestrado, Programa de Engenharia de Sistemas
e Computação, COPPE/UFRJ, Rio de Janeiro, RJ, Brasil, 1997.
J.M. Vlissides, J.O. Coplien e N.L. Kerth (eds); Pattern Languages of Program Design
2; Addison-Wesley; 1996.
B. Whitenack; “RAPPeL: A Requirements-Analysis-Process Pattern Language for
Object-Oriented Development”; In: J. Coplien e D. Scmidt (eds), Pattern
Languages of Program Design; Addison-Wesley, Reading, MA, pp. 259-291,
1995.
W. Zimmer; “Relationships Between Design Patterns”; In: J. Coplien e D. Scmidt (eds),
Pattern Languages of Program Design; Addison-Wesley, Reading, MA, pp.
345-364, 1995.
30