BREVE ESTUDO SOBRE ENGENHARIA DE COMPONENTES
1. INTRODUÇÃO .................................................................................................................... 02
2. ESTUDO SOBRE ENGENHARIA DE COMPONENTES................................................... 03
2.1 ENGENHARIA DE SOFTWARE................................................................................................. 03
2.1.1 Conceitos.................................................................................................................... 03
2.1.2 Fases e Atividades Principais e de Apoio .................................................................. 04
2.1.3 Qualidade de Software............................................................................................... 04
2.2 ENGENHARIA DE COMPONENTES........................................................................................... 05
2.2.1 Histórico...................................................................................................................... 06
2.2.2 Conceitos.................................................................................................................... 07
2.2.3 Reuso ......................................................................................................................... 07
2.2.4 Design Patterns.......................................................................................................... 08
2.2.5 UML Components ...................................................................................................... 09
2.3 ENGENHARIA WEB............................................................................................................... 12
2.3.1 Modelagem de Aplicações Web com UML ................................................................ 13
2.4 PROCESSO DE DESENVOLVIMENTO DE SOFTWARE................................................................. 17
2.4.1 Processo Unificado .................................................................................................... 17
2.4.2 Rational Unified Process (RUP) ................................................................................. 18
2.4.2.1 Fases ............................................................................................................................... 18
2.5 PLATAFORMA TECNOLÓGICA................................................................................................ 20
2.5.1 Java ............................................................................................................................ 20
2.5.1.1 Histórico........................................................................................................................... 20
2.5.1.2 A linguagem de programação Java .................................................................................. 21
2.5.1.3 A plataforma tecnológica Java.......................................................................................... 23
2.5.2 Sistema Gerenciador de Banco de Dados................................................................. 24
2.5.2.1 Conceito de SGBD............................................................................................................ 24
2.5.2.2 Uma breve história do PostgreSQL .................................................................................. 25
2.5.2.3 Características técnicas do PostgreSQL .......................................................................... 27
2.6 SISTEMA DISTRIBUÍDO ......................................................................................................... 28
2.6.1 Conceito de Sistemas Distribuídos, Segurança e Telecomunicações....................... 28
2.7 ARQUITETURA WEB............................................................................................................. 32
2.7.1 Arquitetura Java EE e Design Patterns...................................................................... 33
2.7.2 Componentização da camada de visualização com JSF .......................................... 36
2.7.3 Componentização da camada de negócios com EJB ............................................... 37
REFERÊNCIAS BIBLIOGRÁFICAS........................................................................................... 41
Jean Wagner Kleemann
Campo Grande - 2010
2
1. INTRODUÇÃO
No processo desenvolvimento de software, uma questão muito discutida é
a produtividade. Os sistemas estão a cada dia mais complexos e muitos
padrões de desenvolvimento e gerenciamento de processos não atendem as
expectativas desejadas.
Na busca de novas metodologias e práticas de desenvolvimento de
software, algumas soluções como a orientação a objetos e padrões de projeto,
ainda deixam distante da sonhada reutilização e rápida implementação de
sistemas complexos. Contudo a componentização é uma alternativa capaz de
lidar com problemas ligados ao reaproveitamento, não somente de código, mas
também de funcionalidades e interfaces, independentemente de plataforma,
diminuindo custos e tempo de desenvolvimento.
Com o desenvolvimento baseado em componentes, surge a idéia de "crie
uma vez, use onde quiser". Neste conceito não é necessário escrever uma nova
aplicação codificando linha a linha, mas consiste em montar sistemas utilizando
componentes já implementados. Proporcionando assim o rápido
desenvolvimento, facilidade de manutenção e maior qualidade dos sistemas.
Entretanto, encontrar componentes que se encaixam em domínios de
negócios distintos é algo difícil, sendo sugerido então a implementação de seus
próprios componentes. Para isso é essencial a utilização de padrões em todo
processo de desenvolvimento de componentes de software.
Este estudo descreve assuntos relacionados à componentização, que
devem ser analisados antes de um estudo mais aprofundado neste universo da
componentização de software. Os conceitos tratados serão a Engenharia de
software, engenharia web e engenharia de componentes, bem como a
tecnologia Java, Design Patterns, PostgreSQL, RUP e Sistemas distribuídos.
3
2. ESTUDO SOBRE A ENGENHARIA DE COMPONENTES
2.1 Engenharia de software
Segundo Friedrich Ludwig Bauer (1969, p. 231), "Engenharia de
Software é a criação e a utilização de sólidos princípios de engenharia a fim de
obter software de maneira econômica, que seja confiável e que trabalhe
eficientemente em máquinas reais".
2.1.1 Conceitos
A engenharia de software é uma área do conhecimento da computação
voltada para a especificação, desenvolvimento e manutenção de sistemas de
software aplicando tecnologias e práticas de gerência de projetos e outras
disciplinas, objetivando organização, produtividade e qualidade.
Essas práticas e tecnologias envolvem linguagens de programação,
banco de dados, ferramentas, plataformas, bibliotecas, padrões, processos e
qualidade de software, entre outros.
Os fundamentos científicos para a engenharia de software envolvem o
uso de modelos abstratos e precisos que permitem ao engenheiro especificar,
projetar, implementar e manter sistemas de software, avaliando e garantindo
suas qualidades. Além disso, a engenharia de software deve oferecer
mecanismos para se planejar e gerenciar o processo de desenvolvimento de
um sistema de informação Sistema Computacional, pois ambos se confundem.
O fundamento da engenharia de software é a camada de processo. O
processo de engenharia de software mantém unidas as camadas de tecnologia
e permite o desenvolvimento racional e oportuno de software para computador
(PRESMMAN, 2002).
4
2.1.2 Fases e Atividades Principais e de Apoio
Indiferente do escopo a ser aplicada, a engenharia de software divide o
processo de desenvolvimento em três fases distintas: Definição (Análise do
sistema, planejamento do projeto de software e análise de requisitos),
Desenvolvimento (projeto de software, codificação e realização de testes do
software), Manutenção (correção, adaptação e melhoramento funcional).
Estas fases ainda são complementadas por Atividades de apoio, como
por exemplo: Controle de Configuração, Controle de Qualidade, Verificação e
Validação, Auditorias, Gerenciamento de Riscos, Acompanhamento e Controle
do Projeto de Software.
2.1.3 Qualidade de Software
Segundo o Software Engineering Body of Knowledge (SWEBOK, 2004),
a qualidade de software pode ser dividida em três tópicos para melhor
entendimento, sendo eles:
• Fundamentos de qualidade de software: Cultura e ética de
engenharia de software,Valores e custos de qualidade, Modelos e
características de qualidade, Melhoria da qualidade.
• Gerência do processo de qualidade de software: Garantia de
qualidade de software, Verificação e validação, Revisões e
auditorias,
• Considerações práticas: Requisitos de qualidade para aplicações,
Caracterização de defeitos, Técnicas de gerência de qualidade de
software, Medidas de qualidade de software.
Ao contrário de alguns autores que se apóiam em testes de software
para garantir qualidade, o SWEBOK esclarece que essa área não exige a
execução do software para avaliá-lo, em contraposição á área de conhecimento
teste de software.
5
Tendo em vista que a qualidade não é incorporada ao produto depois de
concluído, essa atividade é aplicada durante todas as etapas de
desenvolvimento, pois os fatores relacionados ao produto dependem
diretamente e indiretamente do processo.
A qualidade de software também pode ser definida como a integração
entre os requisitos funcionais, requisitos de desempenho, padrões de
desenvolvimento claramente documentados e demais características implícitas.
Podemos citar algumas práticas características de qualidade de
software:
• Prototipação.
• Testes de Aceitação como Especificação.
• Testes Unitários.
• Revisão de Código.
• Integração Contínua.
• Análise de Risco.
• Análise Estática.
• Automação de Processos.
2.2 Engenharia de componentes
A Engenharia de componentes é uma derivação da engenharia de
software, focada na decomposição dos sistemas, em componentes funcionais e
lógicos com interfaces bem definidas, usadas para comunicação entre os
próprios componentes, que estão em um nível mais elevado de abstração do
que os objetos, com isso a comunicação se dá por meio de mensagens.
A engenharia de software baseada em componentes (component-based
software engineering, CBSE) é um processo que enfatiza o projeto e a
6
construção de sistemas baseados em computador usando "componentes" de
software reutilizáveis (PRESMMAN, 2002).
A prática da tecnologia de software baseado em componentes, baseia-se
no desenvolvimento através de componentes reutilizáveis, levando a redução
de tempo de desenvolvimento, e facilitando as mudanças e a implantação de
novas funcionalidades.
Dessa forma, o processo de engenharia de software baseada em
componentes tem mudado o modo pelo qual sistemas são desenvolvidos, pois
desloca a ênfase da programação do software para a composição de sistema
de software com base em componentes (PRESMMAN, 2002).
2.2.1 Histórico
Durante a Conferência de Engenharia de Software da OTAN realizada
em 1968, Mcilory sob o titulo "Mass Produced Software Components"
(Produção de Componentes de Software em Massa), expõe a idéia de que o
desenvolvimento de software deve empenhar-se em desenvolver componentes
reusáveis com o intuito de proporcionar aos desenvolvedores a possibilidade de
escolher quais componentes utilizar, conforme as suas necessidades. Nasce aí
o interesse em desenvolver software através da integração de componentes de
software. Em seguida, como primeira implementação da infra-estrutura de sua
idéia, incluiu pipes (para comunicação entre processos) e filtros no sistema
operacional Unix.
Em 1976, DeRemer propôs um paradigma de desenvolvimento, que
consistia na idéia do sistema ser construído como um conjunto de módulos
independentes e depois interligados. Já na década de 80, com o surgimento da
orientação a objetos e a possibilidade de reutilização, fortaleceu ainda mais a
proposta de desenvolver componentes.
Podemos citar alguns componentes bastante conhecidos atualmente,
7
como: CMM (CORBA Component Model) do OMG (Object Management
Group), DCOM (Distributed Component Obejct), COM/COM+ (Component
Object Model) da Microsoft, e JavaBeans e Entreprise JavaBeans (EJB) da
Sun.
2.2.2 Conceitos
A engenharia baseada em componentes possui as etapas de coleta de
requisitos e passa por um projeto arquitetural, da mesma forma que a
engenharia se software tradicional. Porém a partir desse ponto começa se
diferenciar, pois começa a ser analisado os requisitos com objetivo de buscar
módulos que sejam mais adequados à composição, ao invés de iniciar a
construção e partir para tarefas de projeto mais detalhadas.
Ao fazer essa análise dos subconjuntos ou módulos do sistema, pode se
fazer o uso de componentes já existentes, sendo componentes próprios ou
comerciais.
Segundo Desmond D'Sousa (1998) um componente é um pacote
coerente de artefatos de software que pode ser desenvolvido
independentemente e entregue como unidade e que pode se composto, sem
mudança, com outros componentes para construir algo maior.
2.2.3 Reuso
O Reuso é o objetivo principal da engenharia de software baseada em
componentes. Não se trata somente de reutilização de código, pois abrange
também os artefatos envolvidos durante o todas as etapas de desenvolvimento.
Dentro da engenharia de componentes, são observadas algumas
características positivas e outra nem tanto, mas que valem ser destacadas:
• Os riscos são menores ao usar um componente já existente em
8
relação ao desenvolvimento de algo a partir do zero.
• O aumento da produtividade, tendo em vista a redução de esforços
pela equipe de desenvolvimento. Seguindo a idéia “Crie uma vez,
use onde quiser”.
• A qualidade e confiabilidade do produto e são maiores, pois o
componente reutilizado já foi testado e aprovado.
• No caso de componentes comercias, pode-se não ter acesso ao
código fonte ou depender de direitos autorais e licenças.
• Resistência da parte das equipes de desenvolvimento, pois exige
forte padronização (investimento de tempo e controle de qualidade)
e documentação (investir mais tempo nos artefatos). A adoção de
novas práticas de desenvolvimento geralmente encontra forte
resistência a mudanças por parte da equipe.
2.2.4 Design Patterns
Dedign Patterns ou padrões de projeto significa um grupo de práticas
para definir o problema, a solução e em qual situação aplicar esta solução e
suas conseqüências no desenvolvimento de software.
Os padrões são desenvolvidos a partir de experiências práticas em
projetos reais. É resultado da experiência de arquitetos com experiência, que
aplicam usam estes padrões e experimentam o resultado em seus próprios
problemas. A experiência desses arquitetos certamente proporciona a
abordagem correta para um problema específico, da forma mais indicada.
Fazendo uso de tais padrões, temos como resultado uma qualidade de
código, permitindo a reutilização de forma flexível e expansível. Por se tratar de
questões que nasceram de um problema real, e a solução foi testada e
documentada, os padrões aumentam de forma significativa a produtividade e
qualidade, pois a solução já está definida.
9
2.2.5 UML Components
A UML pode ser definida como uma linguagem de diagramação da
metodologia orientada a objetos, que serve de apoio à análise de sistemas,
desde o levantamento dos requisitos até a implantação de um sistema.
É composta por diversos elementos básicos que representam as
diferentes partes de um sistema, como por exemplo: Classe, Interface, Nota,
Pacote, Caso de Uso, Atividades, dentre outros. Além disso, a UML permite a
criação de elementos próprios através dos estereótipos, valores de etiqueta e
restrições, de acordo com Melo (2004).
A UML na versão 2.0 é composta por treze diagramas, divididos nas
categorias estruturais (características que não mudam com o tempo) e
dinâmicos (mostram como o sistema evolui durante o tempo), conforme
mencionado por Melo (2004) e representado abaixo pela Figura 1.
Figura 1 – Diagramas da UML 2.0.
10
A UML possui uma série de diagramas para representação de
componentes e suas especificações, interações e integração com demais
sistemas. Segundo RUBIRA (2008), a UML Components, atende todas as fases
de elaboração de componentes de software, desde o levantamento de
requisitos até o sistema em funcionamento, conforme a Figura 2, abaixo
representada.
Figura 2. Processo UML Components.
Na fase de especificação dos requisitos, que é independente de
tecnologia a ser utilizada, ocorre a modelagem lógica do negócio. O processo
UML Components mostra os artefatos envolvidos nesta fase, mas não descreve
como devem ser produzidos, sendo eles:
• Processo do Negócio (Bussines Process): Se trata de uma
11
representação gráfica, através de um diagrama de atividades,
descrevendo as atividades que representam o funcionamento do
negócio em si. Serve para melhor compreensão do domínio,
envolvendo várias funcionalidades do sistema e mostrando a
relação entre elas, e separando as atividades manuais e
automáticas.
• Modelo Conceitual do Negócio (Business Concept Model):
Representa as entidades do negócio de uma forma geral. Serve
para entender o papel do sistema, contextualizando os
desenvolvedores a partir de entidades e relacionamentos.
• Modelo de Casos de Uso (Use Cases Model): É o detalhamento
das funcionalidades do sistema e seu relacionamento com os
atores. Representa graficamente as principais funcionalidades e o
relacionamento entre elas através de diagramas de casos de uso.
Na Fase seguinte, de especificação dos componentes, também
independe de tecnologia, e nesta fase são levantadas as interfaces de sistema
e de negócio, bem como o detalhamento da seqüência de atividades para
desenvolver os componentes. Essas atividades São descritas em três etapas,
sendo elas: a identificação dos componentes, interação entre os componentes e
especificação final.
O processo de Identificação dos componentes é baseado nas interfaces
do sistema, através de um procedimento intuitivo. Também é feito o uso de
diagramas de casos de uso específicos e diagramas de fluxo e operação. O
modelo de tipos do negócio (Business Type Model) é indicado nesta fase, pois
restringe as entidades relevantes para o domínio da solução, focado nas
responsabilidades do sistema e não dos atores.
Na Interação entre os componentes é necessário descobrir as operações
de negócio que estão ligadas ao relacionamento entre os componentes, através
de diagramas dinâmicos, como de colaboração, de seqüência ou de atividades.
12
Na especificação final dos componentes, cabe o Modelo de Informação
das Interfaces (Interface Information Model), que porve a relação entre cada
interface e as entidades do modelo de negócio. Dessa forma ajuda o
entendimento do contexto de cada interface e auxilia na troca de conhecimento
entre a equipe de desenvolvimento.
Já a fase de provisionamento dos componentes depende diretamente de
tecnologia, pois define como os componentes serão adquiridos, localizados,
reutilizados ou implementados. O processo UML Components lista possíveis
maneiras de criar os componentes de software, mas não detalha cada uma
delas.
• Aquisição dos componentes: Reutilização de componentes prontos
ou a utilização de novos componentes.
• Localização de componentes prontos: buscar por serviço fornecido
pelo componente, considerando a semelhança de seus conteúdos.
• Reutilização de componentes: Pode ser necessário adaptar os
componentes reutilizados ou até mesmo as funcionalidades do
sistema (renegociação dos requisitos).
• Implementação dos Componentes: Deve-se utilizar um modelo de
componente já existente, tais como: EJB, COM+, etc.
Por ultimo, na montagem do sistema, também dependente da tecnologia,
é feita a implementação dos conectores e a ligação entre os componentes e os
conectores do sistema. Nessa fase é observada a adaptação e comportamento
dos componentes, requisitos de qualidade, disponibilidade, escalabilidade,
confiabilidade, entre outros.
2.3 Engenharia Web
MURUGESAN (1999) define a engenharia Web como o estabelecimento
e uso de princípios de engenharia e abordagens disciplinadas para o
desenvolvimento, implantação e manutenção de aplicações baseadas na Web.
13
O ambiente Web possui diversas características, valendo destacar a
concorrência, carga imprevisível, disponibilidade, sensibilidade ao conteúdo,
evolução dinâmica, imediatismo, segurança e estética, que impulsionaram uma
nova dinâmica aos processos já existentes, dando origem a uma nova subárea
da Engenharia de Software, a Engenharia Web (PRESSMAN, 2005).
Os webistes podem variar de páginas estáticas até verdadeiros sistemas
baseados na Web(lojas virtuais, ambientes cooperativos, sistemas de gerência
empresarial, etc.). Este tipo de website é definido como Sistemas de Informação
Web (Web-based Information Systems - WISs) e ao conjunto amplo de todas as
aplicações Web como Web Applications (WebApps).
O capítulo seguinte apresenta uma visão geral das metodologias e
práticas da UML que podem ser aplicadas na modelagem de sistemas WEB.
2.2.3.1 Modelagem de Aplicações Web com UML
A metodologia Engenharia Web Baseada em UML (UML-based Web
Engineering – UWE) (KOCH, 2002) define um conjunto de modelos a serem
construídos no desenvolvimento de uma aplicação Web, uma linguagem de
modelagem para a elaboração desses artefatos e um processo para construção
dos modelos.
As principais atividades no processo de modelagem são: análise de
requisitos, projeto conceitual, projeto de navegação, projeto de apresentação,
modelagem de tarefas e modelagem de implantação.
A abordagem UWE apóia o desenvolvimento de aplicações Web com foco
especial na sistematização, personalização e geração automática de código.
Indica também a utilização de casos de uso para a especificação de requisitos
e, baseado nos casos de uso especificados, o projeto conceitual produz um
modelo conceitual do problema, definido em termos de classes e associações
14
entre classes relevantes do domínio.
O projeto de navegação utiliza o modelo conceitual como base e é definido
em duas etapas: definição do modelo de espaço de navegação e construção do
modelo de estrutura de navegação. O primeiro modelo mostra quais objetos
podem ser vistos através da navegação pela aplicação Web e é, portanto, um
modelo de análise. O segundo modelo é baseado no primeiro e define como os
objetos são visitados, sendo construído na fase de projeto.
O projeto de apresentação consiste na modelagem de interfaces com o
usuário abstratas, mostrando como a estrutura de navegação definida
anteriormente é apresentada ao usuário.
Ele é dividido em uma parte estática e outra dinâmica. A parte estática é
representada por uma forma particular de diagrama de classes que usa uma
notação de composição de classes. Elementos de apresentação são
representados por classes estereotipadas e suas partes internas são
representadas graficamente dentro do elemento de modelo “classe”, podendo
ter vários níveis de “aninhamento de elementos gráficos”.
Para refinar os casos de uso, diagramas de atividade podem ser
utilizados, modelando de forma mais detalhada a interação com o usuário. Por
fim, diagramas de implantação podem ser usados para documentar a
distribuição dos componentes da aplicação Web.
As Extensões de Aplicações Web (Web Application Extensions – WAE)
(CONALLEN, 2002) são extensões ao meta-modelo da UML para a
modelagem de características específicas de aplicações Web. A WAE define
extensões apropriadas para modelar diversos componentes típicos do
desenvolvimento de aplicações Web, usando elementos do meta-modelo da
UML adicionados de estereótipos pré-definidos para simbolizar os conceitos
necessários.
Além dos estereótipos, a WAE prevê a definição de valores etiquetados
15
(tag values), representados entre colchetes, e restrições (constraints),
representadas entre chaves, para alguns elementos.
A WAE é voltada para apoiar a elaboração de modelos de projeto, tendo
em vista que essa fase é mais suscetível à tecnologia. A fase de projeto é
dividida em duas visões: a visão lógica, que está em um nível mais alto de
abstração, definindo classes e associações, e a visão de componentes, que
trata dos arquivos que efetivamente comporão o sistema implementado
(páginas e diretórios).
Para a visão lógica, são definidos três estereótipos principais aplicados
sobre o elemento classe do meta-modelo da UML e diversos estereótipos de
associação, como mostram as tabelas 1 e 2, respectivamente. Tais estereótipos
podem ser utilizados para a criação de diagramas de classes que representem
os elementos Web que compõem o sistema, chegando a um nível de detalhes
maior do que os diagramas de classe da fase de análise (pois já incluem
informações da plataforma de desenvolvimento), mas ainda num nível de
abstração lógico.
Estereótipo O que a classe estereotipada representa
<<server page>> Uma página Web dinâmica que efetua processamento no
servidor e gera um resultado possivelmente diferente a
cada requisição. Suas operações representam funções
do script e seus atributos representam variáveis visíveis
no escopo da página.
<<client page>> Uma página Web estática que é simplesmente retornada
ao cliente quando requisitada, sem gerar processamento.
Pode conter scripts do lado do cliente (client-side),
portanto seus atributos e operações referem-se a tais
scripts.
<<HTML form>> Formulários HTML para entrada de dados. Seus atributos
representam os campos do formulário. Tais formulários
não possuem operações. Qualquer operação que interaja
com o formulário deve ser propriedade da página que o
contém.
Tabela 1: Estereótipos de classe utilizados na visão lógica do projeto
16
Além desses elementos básicos, para o que Conallen chama de “Projeto
Avançado”, existem estereótipos para representação de outros elementos da
visão lógica da camada Web, a saber: conjunto de quadros (classe com
estereótipo <<frameset>>), alvo de link (classe com estereótipo <<target>>),
link de destino (associação múltipla com estereótipo <<target link>>), ibliotecas
de script (classe com estereótipo <<script library>>) e objeto de script (classe
com estereótipo <<script object>>).
Estereótipo O que a associação estereotipada representa
<<link>> Um link normal entre páginas, representado em HTML pela
tag <a>. Parâmetros codificados como parte da URL segundo
o protocolo http podem ser representados como atributos da
associação.
<<build>> Relacionamento direcional entre uma server page e uma
client page que indica que a saída HTML do processamento
da página do servidor é a página do cliente.
<<submit>> Relacionamento direcional entre um html form e uma server
page, representando o envio dos dados dos campos do
formulário para a página do servidor para processamento.
<<redirect>> Ação de redirecionamento de uma página para outra.
<<forward>> Ação de delegação de uma página para outra. Difere do
redirecionamento por manter o contexto da requisição feita à
primeira página.
<<object>> Relacionamento de confinamento entre uma página e um
objeto, como uma Applet ou controle ActiveX.
<<include>> Uma associação direcional entre uma server page e uma
outra página que indica que o conteúdo desta última será
processado (somente no caso de uma página do servidor) e
incluído na primeira.
Tabela 2: Estereótipos de associação utilizados na visão lógica do projeto
Para a visão de componentes, são definidos três estereótipos para o
elemento de modelo componente da UML: <<static page>>, componente que
representa páginas estáticas, ou seja, sem processamento no lado do servidor;
<<dinamic page>>, componente que representa páginas dinâmicas; e
<<physical root>>, pacote de componentes representando uma abstração de
uma hierarquia de arquivos que contém recursos disponíveis à solicitação no
servidor Web.
17
Por meio de diagramas de componentes, a visão de componentes busca
modelar o mapeamento entre os arquivos físicos (representados pelos
componentes com os três estereótipos citados) e as representações lógicas
apresentadas na visão lógica (representadas por classes estereotipadas,
conforme discutido anteriormente).
2.4 Processo de desenvolvimento de software
O processo de desenvolvimento de software, basicamente determina
uma estrutura para cada área ou etapa no período de desenvolvimento,
relacionando as tecnologias e procedimentos a serem utilizados.
Estas áreas dentro do processo de desenvolvimento serão usadas como
alicerce para controlar o desenvolvimento do projeto, determinando em que
fase as técnicas devem ser aplicadas. Em síntese o processo de
desenvolvimento de software determina uma forma para executar as fases de
criação, implantação e manutenção.
2.4.1 Processo Unificado
O processo unificado PU é resultado de três processos de
desenvolvimento e notações, reunindo as vantagens de cada um. Este
processo unificado estabeleceu uma notação conhecida como UML (Unified
Modeling Language).
O processo unificado é direcionado a casos de uso, centrado na
arquitetura e usa os ciclos iterativo e incremental para a construção de
softwares, baseado na construção de artefatos de software através da UML, e
não apenas em documentação, é também baseado em componentes.
Como os artefatos são produzidos em fases distintas, e refinados ao
longo do tempo, eles ajudam a organizar as iterações e a direcionar o projeto,
18
uma vez que o PU é baseado em casos de uso durante praticamente todas as
fases. Portanto estes artefatos são primordiais para orientar a condução do
projeto.
2.4.2 Rational Unified Process (RUP)
O Rational Unified Process (RUP) foi desenvolvido pela IBM, sendo uma
ramificação mais detalhada do PU, possuindo um grande conjunto de manuais
e modelos de artefatos a serem produzidos ao longo do processo, além de
tutoriais da ferramenta Rational Suite (conjunto de ferramentas construídas em
torno do RUP).
O processo do RUP disponibiliza uma abordagem baseada em
disciplinas para atribuir tarefas e responsabilidades dentro de uma organização
de desenvolvimento e, assim como o PU. Também é baseado em casos de
uso, orientado pela arquitetura, iterativo e incremental, apresentando uma gama
de papéis, disciplinas, tarefas e artefatos.
Integrado ao RUP estão algumas práticas de desenvolvimento de
software, sendo elas:
• Desenvolvimento de software de forma iterativa.
• Gerenciamento de requisitos.
• Arquitetura baseada em componentes.
• Modelagem de software por meio de diagramas.
• Analise da qualidade de software.
• Gerenciamento de mudanças de software.
2.4.2.1 Fases
O RUP herda quatro fases do PU, sendo elas:
• Concepção: É definida a viabilidade do projeto como negócio,
19
através da delimitação de seu escopo, e de estimativas de
custo, cronograma e retorno sobre o investimento (ROI).
Riscos são identificados e gerenciados, são definidos os
requisitos funcionais e não funcionais, e é traçado um esboço
da arquitetura do sistema, que servirá como alicerce para sua
construção. São definidas as primeiras versões do modelo de
negócio, do modelo de casos de uso, da lista de riscos e suas
prioridades, do plano de projeto, da arquitetura do sistema.
• Elaboração: Refinamento do sistema, com a identificação de
quase todos os casos de uso, com o detalhamento da
arquitetura traçada na fase anterior e com o gerenciamento
contínuo dos riscos envolvidos. Estimativas realistas feitas
nesta fase permitem preparar um plano para orientar a
construção do sistema nas fases posteriores. É possível que
se tenha a uma versão completa do modelo de negócios.
• Construção: Nesta fase o sistema é efetivamente
desenvolvido e, em geral, tem condições de ser operado,
mesmo que em ambiente de teste, pelos clientes. Ao final da
fase de construção tem-se um software executável, a
atualização de artefatos do sistema refletindo o estado atual
do sistema, e um manual do usuário detalhado.
• Transição: O sistema é entregue ao cliente para o uso em
produção. Nesta fase testes são realizados, e um ou mais
incrementos do sistema são implantados, e se necessário,
defeitos podem ser corrigidos. É também nessa fase que os
usuários recebem treinamento para a operação do sistema.
20
2.5 Plataforma tecnológica
2.5.1 Java
O Java é uma plataforma de desenvolvimento que chama a atenção de
analistas, projetistas e programadores, pois é resultante de um grande trabalho
de pesquisa científica e tecnológica que será descrito nos tópicos seguintes.
2.5.1.1 Histórico
Segundo Peter Jandl Junior, 2007, em 1991 um pequeno grupo de
projeto da Sun Microsystems denominado Green, pretendia criar uma nova
geração de computadores portáteis inteligentes, capazes de se comunicar de
muitas formas, ampliando suas potencialidades de uso. Para tanto se decidiu
criar também uma nova plataforma para o desenvolvimento destes
equipamentos de modo que seu software pudesse ser portado para os mais
diferentes tipos de equipamentos. A primeira escolha de uma linguagem de
programação para tal desenvolvimento foi C++, aproveitando suas
características e a experiência dos integrantes do grupo no desenvolvimento de
produtos. Mas mesmo o C++ não permitia realizar com facilidade tudo aquilo
que o grupo visionava.
James Gosling, um dos líderes do projeto, decidiu pela criação de uma
nova linguagem de programação que pudesse conter tudo aquilo considerado
importante e que ainda fosse simples, portátil e fácil de programar. Surgiu então
a linguagem interpretada Oak (carvalho em inglês), batizada assim em razão da
existência de uma destas árvores em frente ao escritório de Gosling. Para dar
suporte à linguagem também surgiram o Green OS e uma interface gráfica
padronizada.
Devido a problemas de direitos autorais, o Oak recebe o novo nome
Java, mas continua sem uso definido até 1994, quando, estimulados pelo
grande crescimento da internet, Patrick Naughton e Jonathan Payne
21
desenvolveram o programa navegador WebRunner, capaz de efetuar o
download e a execução de código Java via internet. Este navegador, sob o
nome HotJava, e a linguagem Java foram apresentados formalmente pela Sun
em maio de 1995 no SunWorld'95, então o interesse pela solução se mostrou
explosivo. Logo no início de 1996 a Netscape Corp. lança a versão 2.0 de seu
navegador, o qual incorpora as capacidades de efetuar o download e realizar a
execução de pequenas aplicações Java denominadas applets.
Numa iniciativa inédita, a Sun decide disponibilizar um conjunto de
ferramentas de desenvolvimento Java gratuitamente para a comunidade de
software, embora detenha todos os direitos relativos à linguagem e às
ferramentas de sua autoria. Surge assim, em meados de 1996, o JDK 1.02 (Kit
de Desenvolvimento Java). As plataformas inicialmente atendidas foram: Sun
Solaris e Microsoft Windows 95/NT. Uma vez que a especificação da linguagem
e do ambiente de execução também foram disponibilizados publicamente,
progressivamente foram aparecendo kits para outras plataformas, tais como
IBM OS/2, Linux e Apple Mac.
Um ano após seu anúncio, ocorre o primeiro grande evento da linguagem
Java, o JavaOne Conference, que, desde então, vem sendo usado para
apresentar as novas características, casos de sucesso, produtos e tecnologias
associadas. Foi assim que se iniciou a história de sucesso do Java.
2.5.1.2 A linguagem de programação Java
A linguagem Java possui algumas características que, em conjunto,
diferenciam-na das demais linguagens de programação. Dentre os diversos
autores da literatura Java como Horstmann (2000), Newman (1996), entre
outros, destacam características que são alguns pontos-chave da Linguagem:
• Orientada a Objetos – Tudo em Java são classes ou instancias de
classes, por isso Java é totalmente orientada a objetos, pois,
possui mecanismos para abstração de dados (através das
classes), encapsulamento (ocultar do usuário o funcionamento
22
interno de uma classe), herança (criar uma nova classe a partir de
outra) e polimorfismo (diferentes classes podem definir métodos
de mesmo nome).
• Independente de Plataforma – Os programas em Java utilizam
uma forma de compilação intermediária que resulta em uma
codificação denominada bytecode, um tipo de linguagem de
máquina (baixo nível) que é destinado a JVM (Maquina Virtual
Java). Dessa forma a JVM interpreta os bytecodes, independente
da plataforma, permitindo assim, que um programa Java seja
executado da mesma forma em qualquer arquitetura.
• Gerenciamento Automático de Memória - A JVM possui um
mecanismo chamado de Garbage Collector (Coletores) que é
responsável por alocar e liberar os dados da memória
automaticamente. Com isso não é necessário que o
desenvolvedor realize tais procedimentos manualmente,
eliminando algumas falhas comuns como: tentar acessar um
objeto que já foi liberado da memória ou esquecer de liberar um
objeto.
• Desempenho – Nas primeiras versões, o Java apresentava certa
limitação quanto a performance, mas isto foi superado com
algumas adaptações na JVM. Um compilador JIT (Just In Time)
foi incorporado na JVM que passou a interpretar os bytecodes
durante a execução do programa. Conforme as novas gerações
de compiladores como, por exemplo, o HotSpot da Sun
combinado com a JVM, a performance vem melhorando de forma
muito significativa, podendo concorrer até mesmo com o C++
(Carmine Mangione, on-line).
• Tratamento de exceções: Em alguns casos, a ocorrência de
algum erro durante a execução de um programa pode fazer com
que o computador “trave” sendo necessário reinicia-lo. Com a
utilização do Java este tipo de evento não acontece, pois, a JVM
verifica em tempo de execução um conjunto de eventos (acesso a
memória, abertura de arquivos, etc.) e ao encontrar algum
23
impedimento ou inconsistência gera uma exceção (uma espécie
de mensagem com a descrição do erro).
• Segurança: Diferente das demais linguagens, em Java a
aplicação não se comunica com o Sistema Operacional, e sim
com a JVM que por sua vez interage com o Sistema. O bytecode
gerado pela aplicação deve passar primeiro por alguns requisitos
de segurança da JVM, que caso encontre alguma irregularidade
impede a execução do código.
• Multithread: Capaz de executar várias tarefas (conjunto de
instruções) ao mesmo tempo dentro da aplicação. Cada uma
destas tarefas é conhecida como thread.
Vale destacar que para desenvolver programas em Java, primeiramente
é necessário um editor que permita salvar o programa fonte com a extensão
“.java”, como por exemplo o JEdit, JCreator ou até mesmo o bloco de notas do
Microsoft Windows. Uma alternativa mais interessante é o uso de uma IDE
(Integrated Development Environment) própria para Java, como o NetBeans ou
Eclipse. Posteriormente com base no arquivo “.java”, o compilador Java é
responsável por gerar o arquivo de extensão “.class”, que é o bytecode
propriamente dito. Então a JVM interpreta e executa os arquivos de classe
fazendo o uso do código nativo (usado para comunicar-se com o hardware) do
Sistema Operacional.
Dessa forma o código Java é o mesmo para diferentes arquiteturas, pois
o que muda são as distribuições da JVM, livrando o desenvolvedor de ajustar o
código conforme a plataforma.
2.5.1.3 A plataforma tecnológica Java
Os ambientes de desenvolvimento ou plataformas Java (ALECRIM,
2007, on-line):
• JSE (Java Standart Edition): Pode-se dizer que é o ambiente
24
principal, pois o JEE e o JME são aprimorados do JSE.
Desenvolvido para aplicações baseadas em cliente/servidor.
• JEE (Java Enterprise Edition): As aplicações WEB são
fundamentadas nesta plataforma. As implementações neste
padrão são muito complexas, contém bibliotecas exclusivas para o
acesso a servidores, banco de dados, sistema de e-mails, entre
outros.
• JME (Java Micro Edition): Corresponde ao JSE reduzido, para
dispositivos móveis (telefones celulares, palmtops,...).
2.5.2 Sistema Gerenciador de Banco de Dados
Segundo Abraham Silberschatz, um sistema gerenciador de banco de
dados (SGBD) é constituído por um conjunto de dados associados a um
conjunto de programas para acesso a esses dados.
2.5.2.1 Conceito de SGBD
Um SGBD possui estruturas de dados otimizadas, que permitem a
manipulação de grandes quantidades de informação, e apresentam um modelo
que define o esquema dos dados armazenados no sistema. Os quatro modelos
mais conhecidos são:
• Hierárquico.
• Em Rede.
• Relacional.
• Orientado a Objetos.
Existem também outros modelos, variando com o autor:
• O modelo relacional estendido é uma adição de características
do modelo orientado a objetos ao relacional.
25
• O semi-estruturado é dedicado a documentos em formatos
semi-estruturados, normalmente em XML.
Um SGBD deve apresentar algumas características e responsabilidades,
tais como:
• Integridade semântica (garantia de dados sempre corretos
com relação ao domínio de aplicação)
• Segurança (evitar violação de consistência dos dados,
segurança de acesso por usuários e aplicações, segurança
contra falhas).
• Gerenciamento de Concorrência (evitar conflitos de acesso
simultâneo a dados por transações).
2.5.2.2 Uma breve história do PostgreSQL
O PostgreSQL é um dos resultados de uma ampla evolução que se
iniciou com o projeto Ingres, desenvolvido na Universidade de Berkeley,
Califórnia. O líder do projeto, Michael Stonebraker, um dos pioneiros dos
bancos de dados relacionais, deixou a universidade em 1982 para comercializar
o Ingres, porém retornou a ela logo em seguida. Após seu retorno a Berkeley,
em 1985, Stonebraker começou um projeto pós-Ingres com o objetivo de
resolver problemas com o modelo de banco de dados relacional. O principal
problema era a incapacidade do modelo relacional compreender “tipos”
(atualmente, chamados de objetos), ou seja, combinações de dados simples
que formam uma única unidade.
O projeto resultante, chamado Postgres, era orientado a introduzir a
menor quantidade possível de funcionalidades para completar o suporte a tipos.
Estas funcionalidades incluíam a habilidade de definir tipos, mas também a
habilidade de descrever relações - as quais até este momento eram
amplamente utilizadas, mas completamente mantidas pelo usuário. No
Postgres, o banco de dados "compreendia" as relações e podia obter
26
informações de tabelas relacionadas utilizando regras.
Iniciando em 1986, a equipe divulgou uma série de documentos
descrevendo a base do sistema e em 1988 o projeto possuía um protótipo
funcional. A versão 1 foi liberada para um grupo pequeno de usuários em junho
de 1989, seguida pela versão 2 com um sistema de regras reescrito em junho
de 1990. Para a versão 3, liberada em 1991, o sistema de regras foi reescrito
novamente, mas também foram adicionados suporte para múltiplos
gerenciadores de armazenamento e um melhorado motor de consultas. Já em
1993, Postgres havia crescido imensamente em popularidade e possuía uma
grande demanda por suporte e por novas funcionalidades. Após a liberação da
versão 4, a qual era uma simples versão de limpeza, o projeto foi oficialmente
abandonado pela Universidade de Berkeley.
Entretanto, devido ao fato do seu código fonte estar sob uma licença
BSD, o seu desenvolvimento foi continuado. Em 1994, dois estudantes de
Berkeley, Andrew Yu e Jolly Chen, adicionaram um interpretador SQL para
substituir a linguagem QUEL (desenvolvida para o Ingres) e o projeto foi
renomeado para Postgres95. Com a divulgação de seu código pela Internet,
Postgres95 iniciou uma nova vida como software open source.
Em agosto de 1996, Marc Fournier, Bruce Momjian e Vadim B. Mikheev
lançaram a primeira versão externa da Universidade de Berkeley e deram início
à tarefa de estabilizar o código herdado. Também em 1996, o projeto foi
renomeado para PostgreSQL a fim de refletir a nova linguagem de consulta ao
banco de dados: SQL. A primeira versão de PostgreSQL, a 6.0, foi liberada em
janeiro de 1997. Desde então, um grupo de desenvolvedores e de voluntários
de todo o mundo, coordenados pela Internet, têm mantido o software e
desenvolvido novas funcionalidades.
As principais características acrescentadas nas versões 6.x são o
en:MVCC (Multiversion Concurrency Control – Controle de Concorrência
Multiversões), melhorias no SQL e novos tipos de dados nativos (novos tipos de
27
datas e hora e tipos geométricos).
Em maio de 2000 foi liberada a versão 7.0. As versões 7.x trouxeram as
seguintes novas funcionalidades: Write-Ahead Log (WAL), esquemas SQL,
outer joins, suporte a IPv6, indexação por texto, suporte melhorado a SSL e
informações estatísticas do banco de dados.
A versão 8.0 foi lançada em janeiro de 2005 e entre outras novidades, foi
a primeira a ter suporte nativo para Microsoft Windows (tradicionalmente, o
PostgreSQL só rodava de forma nativa em sistemas Unix e, em sistemas
Windows - através da biblioteca Cygwin). Dentre as muitas novidades da versão
8.x, pode-se destacar o suporte a tablespaces, savepoints, point-in-time
recovery, roles e Two-Phase Commit (2PC). Em Julho de 2009 foi lançada a
versão mais recente: 8.4.
2.5.2.3 Características técnicas do PostgreSQL
• Licença BSD (Berkeley Software Distribution). Portanto pode
ser utilizado, modificado e distribuído por qualquer pessoa ou
empresa para qualquer finalidade, sem encargo, em quaisquer
dos sistemas operacionais suportados.
• Grande número de recursos, tais como: Comandos
complexos, Chaves estrangeiras, Gatilhos, Visões, Integridade
de Transações, Controle de Simultaneidade Multi-versão,
(MVCC), Suporta múltiplas transações online concorrentes
entre usuários, Suporte a Rules (sistema de regras que
reescreve diretivas SQL), Suporte ao modelo híbrido objetorelacional,
Linguagem Procedural em várias linguagens
(PL/pgSQL, PL/Python, PL/Java, PL/Perl), Indexação por
texto, Estrutura para guardar dados Georeferenciados
PostGIS, entre outros.
• Opções de extensão através do usuário: Tipos de dados,
Funções, Operadores, Funções de Agregação (Agrupamento),
28
Métodos de Índice por texto, Linguagens Procedurais (Stored
Procedures).
• Capacidade de lidar com grandes volumes de dados.
2.6 Sistema Distribuído
Segundo Tanenbaum (1995), um sistema distribuído é um conjunto de
computadores independentes que aparentam aos usuários um sistema único.
Outra definição também é apresentada por Coulouris (2005), que defende a
idéia de um sistema distribuído ser componentes de hardware e software
conectados em rede que comunicam suas ações somente através de trocas de
mensagens.
Um sistema distribuído pode possuir diversos elementos de hardware e
software de forma distribuída, mas a distribuição de apenas um dos elementos
já o caracteriza como sistema distribuído.
Neste capítulo serão descritas algumas características de sistemas
distribuídos e aspectos importantes sobre segurança e telecomunicações.
2.6.1 Conceito de Sistemas Distribuídos, Segurança e Telecomunicações.
Apesar de um sistema apresentar conceitos relacionados à distribuição,
nem todos podem ser considerados como sistemas realmente distribuídos. É o
caso de terminais inteligentes, por exemplo.
Os terminais inteligentes possuem baixa capacidade de armazenamento
e processamento e executam tarefas limitadas e pouco flexíveis transferindo
dados para um sistema principal. Por não possuírem autonomia operacional
suficiente, estes não podem ser caracterizados como sistemas distribuídos.
Os sistemas realmente distribuídos devem apresentar a distribuição de
controle, processamento e dados. Dessa forma um sistema que utiliza das vias
29
de tele processamento, não é necessariamente um sistema distribuído de fato.
A distribuição do processamento quer dizer que em cada nodo da rede
deve existir capacidade de processamento independente. Em outras palavras,
deve ser capaz de executar um processo em cada nodo e de gerenciar os
recursos locais de forma autônoma. Este processamento pode ser constituído
desde um mainframe até por uma estação de trabalho, e é o componente de
mais fácil de ser identificado, sendo necessário a existência de múltiplos
processadores.
A distribuição de dados é a possibilidade de localizar os arquivos ou
banco de dados próximos aos locais onde são mais acessados. Para isto deve
existir um gerenciador de arquivos ou de banco de dados local e um
mecanismo que permita o acesso remoto a estes recursos. Um sistema
distribuído permite que os dados armazenados sejam compartilhados pelos
diversos nodos onde existe capacidade de processamento. Este
compartilhamento pode ser obtido pela transferência de arquivos ou pelo
acesso remoto aos dados.
A distribuição do controle significa que os processos executados nos
diferentes nodos interagem de forma cooperativa para satisfazerem um
determinado objetivo. Esta cooperação é definida por um protocolo que
especifica completamente os serviços a serem executados.
O controle é o de mais difícil domínio e, ao mesmo tempo, o de maior
importância para o funcionamento de um sistema distribuído. Os diferentes
computadores do sistema distribuído podem ser heterogêneos e possuir, cada
um, o seu próprio sistema operacional. Porém o conjunto deve operar como um
todo integrado e apresentando um comportamento homogêneo. A integração
destes sistemas locais heterogêneos em um único sistema homogêneo não é
uma tarefa trivial.
O controle distribuído de uma aplicação é, por natureza, diferente e mais
30
complexo do que o controle de um sistema centralizado. Em um local único
todos os dados necessários ao controle estão imediatamente disponíveis e o
sistema operacional local tem completa autonomia para gerenciar os recursos.
A sincronização dos processos que operam simultaneamente em um sistema
centralizado é realizada por meio do compartilhamento de áreas de memória.
A característica essencial do controle de um sistema distribuído é a
coordenação entre os diferentes processos por meio de mensagens. Esta
característica implica na impossibilidade da manutenção de informação
completa e atualizada sobre cada processo de um sistema distribuído. Os
algoritmos utilizados para a sincronização das atividades distribuídas possuem,
por este motivo, uma complexidade maior que a apresentada por algoritmos
centralizados (LAMPORT, 1978).
O processamento distribuído, assim como foi caracterizado, é mais do
que uma tecnologia é, também, uma metodologia para a concepção e
implantação de sistemas de informação. Sua principal característica é
possibilitar o particionamento das atividades (e dos dados associados) de
acordo com a localização geográfica das aplicações mantendo, ao mesmo
tempo, a integração dos diversos componentes.
As características mais importantes dos sistemas distribuídos podem ser
resumidas em: Diminuir o tráfego de mensagens, processar localmente; Manter
a integração do sistema e atender às necessidades locais.
Dessa forma, é possível otimizar o desempenho e o custo global e
aumentar a confiabilidade das aplicações. Um sistema distribuído possui,
entretanto, uma maior complexidade que um sistema centralizado e apresenta
características funcionais que podem influir nos procedimentos operacionais e
de decisão das empresas.
Podem ser citadas três alternativas básicas para a escolha de critérios
de distribuição: a distribuição por áreas geográficas por grupos funcionais e por
31
funções de processamento de dados.
A distribuição geográfica dos dados é um dos critérios fundamentais para
o projeto de sistemas distribuídos. Deve haver uma grande parcela de atividade
local (dados locais) e pequena atividade entre regiões. Em grande parte dos
sistemas reais os dados apresentam a propriedade dos acessos serem
geograficamente agrupados. A idéia básica para o particionamento dos dados
consiste em agrupá-los de acordo com as taxas de acesso para a identificação
dos possíveis computadores regionais. Desta forma é minimizado o tráfego
internodos.
A característica determinante desta forma de distribuição é a relação
entre atividade local e a remota. Caso a taxa de atividade remota seja alta a
distribuição não é a solução mais adequada. Este critério leva à minimização do
fluxo de dados internodos e é empregado em métodos de alocação ótima de
arquivos em sistemas distribuídos. Com exceção de sistemas muito
especializados (defesa, alta segurança de operação) a maioria dos sistemas
distribuídos reflete a agregação geográfica natural das organizações.
O desenvolvimento de computadores levou aos sistemas
departamentais. O conceito administrativo utilizado, neste caso, consiste em
alocar capacidade de processamento em cada departamento, isto é:
distribuição por grupo de funções. Esta é uma alternativa à utilização
compartilhada de um grande sistema central. Apenas os dados corporativos (e
os muito volumosos) são mantidos no sistema central. A integração do sistema
de informações automatizado é assegurada pela interligação dos diversos
computadores departamentais e do computador central.
Outra forma de distribuição consiste na distribuição por funções. Neste
caso estão classificados os servidores especializados, tais como: servidores de
impressão, servidores de arquivos, processadores vetoriais ou processadores
de uso geral especializados por software. Este tipo de distribuição atribui à cada
tarefa um nodo adequado a função específica. Tais categorias de distribuição
32
não são exclusivas sendo que um sistema pode conter partes dessas por se
encaixarem em categorias distintas.
2.7 Arquitetura Utilizada no Sistema Web.
Inicialmente a web era composta apenas por páginas estáticas, ou seja,
não variava a cada solicitação conforme alguma mudança de parâmetros. Com
o tempo, houve a necessidade de tornar o conteúdo das páginas dinâmico, que
possibilitasse construir uma página conforme uma nova requisição, o que não
era possível utilizando somente HTML (Hyper Text Markup Language). Para
tanto o servidor web deveria processar os dados destas solicitações e retornar
uma resposta personalizada. Surgiu então o CGI (Common Gateway Interface)
(BRAZ, on-line).
O CGI possui limitações quanto a sua utilização em sistemas web de
grande escala, pois a cada execução do programa um novo processo é criado,
causando sobrecarga no servidor web. Ocorre também que os programas em
CGI são capazes de tratar apenas uma solicitação, na qual um novo processo é
criado, os dados são enviados, processados e a resposta é retornada para o
navegador e o processo é finalizado. Com isso, não é possível o
compartilhamento de recursos entre os CGIs. Este modelo apresenta
problemas de performance se submetido a grande volume de acesso.Para
amenizar estes problemas, foi adotado o uso de algumas linguagens de
programação como o Perl, ASP, PHP, Java e etc.
Em Java, no ambiente JEE (Java Enterprise Edition), que é voltado para
as aplicações web, encontra-se alternativas como Applets, Servlets, JSP (Java
Server Pages), JSTL (Java Server Pages Standard Tag Library), EJB
(Enterprise Java Beans), entre outros. Para facilitar o desenvolvimento das
aplicações Java geralmente se faz o uso de design patterns também conhecido
como padrões de projeto e algum framework, tais como o STRUS, JSF,
Hibernate, entre outros.
33
2.7.1 Arquitetura Java EE e Design Patterns.
Um padrão de projeto é definido como uma solução desenvolvida
utilizando boas práticas para um problema comum que ocorre várias vezes. Um
padrão de projeto documenta e explana um problema importante que pode
ocorrer no projeto ou implementação de uma aplicação e então discute a
melhor solução prática para o problema (Marinescu, 2002).
Segundo a SUN, a plataforma J2EE (Java 2 Enterprise Edition) define um
padrão para o desenvolvimento de aplicações multicamadas. Nesta arquitetura,
a camada que contém as regras de negócio, normalmente implementada
utilizando Enterprise JavaBeans, pode ficar concentrada no servidor de
aplicações, sendo compartilhada com diversas aplicações clientes. As
aplicações clientes não contêm a lógica do negócio, atendo-se somente à
camada de apresentação. Na camada de apresentação normalmente são
utilizadas as tecnologias de Servlets e JavaServer Pages.
Os Design Patterns buscam facilitar a reutilização de projetos e
arquiteturas bem sucedidos. Eles auxiliam a escolher alternativas de projeto
que tornam um sistema reutilizável e evitar alternativas que comprometam a
reutilização.
Segundo Alur (2002) se destacam algumas vantagens de se usar cada um
destes padrões, considerando que:
• Foram testados: refletem a experiência e conhecimento dos
desenvolvedores que utilizaram estes padrões com sucesso em
seu trabalho;
• São reutilizáveis: fornecem uma solução pronta que pode ser
adaptada para diferentes problemas quando necessário;
• São expressivos: formam um vocabulário comum para expressar
grandes soluções sucintamente;
• Facilitam o aprendizado: reduzem o tempo de aprendizado de uma
determinada biblioteca de classes. Isto é fundamental para o
34
aprendizado dos desenvolvedores novatos;
• Diminuem retrabalho: quanto mais cedo são usados, menor será o
retrabalho em etapas mais avançadas do projeto.
A SUN disponibiliza um catálogo de 15 padrões J2EE, que fornece
soluções para problemas tipicamente encontrados por arquitetos e designers de
aplicações de software para a plataforma J2EE, conforme ilustra a Figura 3.
Figura 3: Core J2EE Patterns. Fonte: SUN.
35
Em poucas palavras é possível descrever cada um destes padrões em
suas respectivas camadas (Alur, 2002):
• Camada de apresentação: intercepting filter (Intercepta
solicitações e respostas e aplica algum filtro); front controller
(Fornece um controlador centralizado para manter a lógica de
processamento que ocorre na camada de apresentação e que,
erroneamente é colocado nas visões); view helper (Encapsula a
lógica que não esteja relacionada à formatação da apresentação
em componentes auxiliares);composite view (Cria uma visão
através da composição de outras visões); service to worker
(Combina um componente distribuidor com os padrões Front
Controller e View Helper. Neste padrão a responsabilidade de
recuperar o conteúdo para apresentar é do controlador); dispatcher
view (Semelhante ao padrão Service to Worker, mas, neste padrão
a recuperação do conteúdo é responsabilidade das visões).
• Camada de negócios: business delegate (Reduz o acoplamento
entre o cliente e a camada de negócios); data transfer object
(Facilita o intercâmbio de dados entre as camadas); data transfer
object factory (Facilita e centraliza a criação de data transfer
objects); session facade (Fornece uma interface unificada para um
sistema distribuído); composite entity (Representa uma prática
mais recomendada para criar entity beans de granulação grossa,
agrupando os objetos dependentes em um único entity bean); value
list handler (Gerencia o processamento e armazenamento em
cache de consultas que retornam uma grande quantidade de
informações); service locator (Encapsula a complexidade de
localização e criação de serviços de negócio e localiza os objetos
Home dos EJB).
• Camada de integração: data access object (Abstrai e encapsula o
acesso aos dados); service activator ( Facilita o processamento
assíncrono para Message-driven beans).
36
2.7.2 Componentização na camada de visualização com JSF
Segundo Gonçalvez (2007, p. 429) O JSF (Java Server Faces) é uma
tecnologia do mundo JEE e é desenhado para simplificar o desenvolvimento de
aplicações Web. JSF torna fácil o desenvolvimento através de componentes de
interface de usuário (GUI) e conecta esses componentes a objetos de negócios.
Também automatiza o processo de uso de Java Beans e navegação de
páginas.
Java Server Faces disponibiliza o rápido desenvolvimento de interfaces
para aplicações que rodam no servidor web. Permite aos desenvolvedores
escrever aplicações com facilidade, sem se preocupar com as complexidades
de lidar com navegadores e servidores Web. Também automatiza alguns
procedimentos como o controle e o transporte do código entre formulários, a
lógica de negócios, entre outros.
Java Server Faces realiza muito do trabalho pesado que geralmente
precisam ser implementados em Servlets e JSP. Possui um conjunto de
componentes que são essenciais para o desenvolvimento de aplicações em
JSF.
Estes componentes funcionam em conjunto, ou seja, caso necessite de um
determinado componente que não existe no projeto, ele pode ser inserido sem
problemas. Hoje, existem diversos conjuntos de componentes, como por
exemplo: JBoss RichFaces, MyFaces Tomahawk, Oracle ADF, ICEfaces, entre
outros. Há também alguns fabricantes que desenvolveram suas próprias
implementações de JSF, tais como: MyFaces (Apache), JSF RI ou Mojarra (Sun
Microsystem) (Rafael Ponte,on-line).
De certa forma o JSF pode ser comparado ao framework Microsoft .net,
pois possui um conjunto de componentes visuais, que permite o conhecido
“arrastar e soltar”. Também por ser flexível na questão de criação de
componentes próprios a partir de classes de componentes, e permitir que o
desenvolvedor crie interfaces através de componentes fornecidos e manipule
37
eventos do lado cliente com grande facilidade.
Vale destacar que no ano de 2009 foi lançada a versão 2 do framework
JSF, que teve sua primeira versão lançada em 2003. Esta segunda versão veio
para corrigir e facilitar o uso de diversos novos recursos tais como:
• Suporte nativo a Ajax, não disponível na primeira versão.
• Resolver problemas de incompatibilidade entre bibliotecas de
componentes.
• Permitir configurações através de anotações, o que antes era feito
somente via xml.
• Diminuir a complexidade da criação de componentes visuais.
• Comunicação entre os componentes através de outros protocolos,
pois na primeira versão era possível somente via GET, sendo esta
uma de suas falhas mais criticadas.
2.7.3 Componentização na camada de negócios com EJB
Segundo Gonçalvez (2007, p. 544) O EJB ou Enterprise JavaBeans é um
componente servidor que roda em um container para EJB do servidor de
aplicação. Considerado como um dos principais componentes da plataforma
JEE (Java Enterprise Edition), o EJB tem como principais objetivos da
tecnologia fornecer rápido e simplificado desenvolvimento de aplicações Java
baseadas em componentes, distribuídas, transacionais, seguras e portáveis.
Infelizmente essa não foi bem a realidade das versões anteriores as 3.0 da
tecnologia EJB, especialmente os Entity Beans, que sempre foram acusados de
baixa eficiência, alta complexidade e dificuldade de uso.
DEBU PANDA (2008, p.4) define Enterprise JavaBeans (EJB) como uma
plataforma para construção de aplicações corporativas portátil, reutilizável e
38
escalável, que utiliza a linguagem Java. Desde seu início, o EJB tem sido
considerado um modelo de componente ou framework que permite que você
construa aplicações corporativas Java sem ter que reinventar serviços
necessários para a construção de uma aplicação, como as transações,
seguranças, persistência automatizada e assim por diante.
DEBU PANDA (2008, p.5) descreve EJBs como componentes server-side
que são utilizados para construir partes de uma aplicação, como a regra de
negócios ou a camada de persistência. O desenvolvimento de componente
geralmente é visto como algo extremamente complexo como o CORBA ou
Microsoft COM+. O EJB3 mostra que um componente é o que deve ser:
Encapsular com eficiência o comportamento de uma aplicação, dessa forma o
usuário de um componente não precisa conhecer suas operações internas, tudo
o que precisa saber é como ir e o que esperar de volta.
As principais vantagens do uso da tecnologia EJB, podem ser entendidas
através dos seguintes pontos:
• Fácil de usar: Focado na facilidade de uso, os recursos que mais
são realçados são a programação POJO, as anotações XML, o uso
intenso dos padrões sensíveis e o JPA.
• Acúmulo de soluções integradas: O EJB oferece um conjunto de
soluções para servidor, incluindo persistência, messaging,
programas leves, remoting, serviços de web, injeção de
dependência (DI) e interceptores. Isso significa que você não terá
que perder tempo procurando ferramentas terceirizadas para
integrar à sua aplicação.
• Padrão aberto Java EE: O EJB possui uma especificação API
pública aberta, que as empresas utilizam para criar um container ou
a implementação do fornecedor de persistência. O padrão EJB é
desenvolvido pelo Java Community Process (JCP) proporcionando
um suporte maior, sem precisar de uma solução proprietária.
• Suporte maior ao fornecedor: O EJB é suportado por uma grande
variedade de empresas independentes. Incluindo as maiores
39
empresas do ramo de tecnologia do mundo, muito respeitadas e
financeiramente estabilizadas, como a Oracle e a IBM, assim como
os grupos JBoss e Geronimo. O suporte amplo ao fornecedor se
traduz em três vantagens importantes para você. Primeira, você não
está a mercê dos altos e baixos de uma empresa particular ou
grupo de pessoas. Segunda, muitas pessoas possuem interesses a
longo prazo para manter a tecnologia o mais competitiva possível.
Você pode ser capaz de levar vantagem das melhores tecnologias
dentro ou fora do ambiente Java em um cronograma competitivo.
Terceira, os fornecedores concorrem entre si para fornecer recursos
não padronizados adicionados ao valor. Esses fatores ajudam a
manter o EJB continuamente na linha de evolução.
• Agrupamento, balanceamento de carga e failover: Os recursos
historicamente adicionados por muitos fornecedores de servidores
de aplicações são suportes robustos para o agrupamento, balanço
de carga e failover. Os servidores de aplicação EJB possuem um
registro de trilha provado para suportar alguns dos ambientes de
servidores ativados por computação (HPC) de alto desempenho.
Mais importante que isso, você pode alavancar tal suporte sem
alterar o código, sem interação de ferramenta terceirizada e com
configuração relativamente simples (além do trabalho inerente em
configurar um agrupamento de hardware). Isto significa que você
pode confiar no agrupamento de hardware para medir sua aplicação
com o EJB 3, caso precise.
Os beans são os componentes EJB e são classificados conforme sua
utilidade, sendo eles: Session Beans, Message Driven Beans, Entity Beans.
Cada tipo de bean tem um propósito e pode utilizar um subconjunto específico
de serviços EJB. O propósito real dos tipos de beans é proteger as possíveis
sobrecargas contra os serviços que surgem.
Os sesseion beans e os Message Driven Beand são usados para construir
lógica de negócios e residem em um container, que gerencia esses beans e
40
fornece serviço a eles. Já os Entity Beans são usadas para modelar a
persistência de uma aplicação.
Segundo DEBU PANDA (2008, p.14), um dos recursos mais atraentes do
EJB 3 é o modo com que ele controla a persistência. Persistência é a habilidade
de ter os dados contidos nos objetos Java automaticamente armazenados em
um banco de dados relacional como o Postgres SQL. A persistência em EJB 3
é gerenciada pelo JPA. Ela persiste automaticamente aos objetos Java usando
uma técnica chamada mapeamento objeto-relacional (ORM). O ORM é
essencialmente o processo de mapeamento de dados contidos nos objetos
Java das tabelas de banco de dados usando configuração. Ele desobriga o
desenvolvedor da tarefa de escrever o código JDBC de baixo nível para manter
os objetos em um banco de dados.
Os frameworks que fornecem capacidade ORM para realizar persistência
automatizada são conhecidos como frameworks ORM. Como o nome já diz, um
framework ORM executa persistência transparente usando metadados do
mapeamento objeto-relacional que define como os objetos são mapeados nas
tabelas de banco de dados. ORM não é um novo conceito e já está presente
por algum tempo. Oracle TopLink é provavelmente o framework ORM mais
antigo no mercado; o framework de fonte aberta JBoss Hibernate popularizou
os conceitos ORM entre a comunidade do desenvolvedor atual.
41
REFERÊNCIAS BIBLIOGRÁFICAS
ALECRIM, Emerson. JSE, JEE e JME: uma breve explicação. Info Wester. São
Paulo - SP. 02 out. 2007. Disponível em:
<http://www.infowester.com/versoesjava.php>. Acesso em 02 abr. 2009.
ALUR, Deepak; CRUPI, John; MALKS, Dan. Core j2ee patterns: as melhores
práticas e estratégias de design. Rio de Janeiro: Campus, 2002.
BRAZ, Christian Cleber Masdeval. Introdução ao Java Server Pages. Disponível
em: <http://www.tudodownloads.com.br/download/2552/Apostila_-
_Introducao_ao_JSP_Java_Server_Pages.html>. Acesso 23 mar. 2008
CONALLEN, Jim. Building Web Application With UML. 2. ed. 2002.
COULOURIS, George F.; DOLLIMORE, Jean; KINDBERG, Tim. Distributed
systems:concepts and design. 4th ed. 2005.
DESMOND D'Sousa. Objects, Components, and Frameworks with UML: The
Catalysis Approach.1998.
Friedrich Ludwig Bauer. NATO Science Committee, Garmisch, Germany, 7-11
Oct. 1968, Brussels, Scientific Affairs Division, NATO (1969) 231p.
GONÇALVES, Edson. Desenvolvendo aplicações web com jsp, servlets, javaserver
faces, hibernate, ejb3 persistence e AJAX. Editora Ciência Moderna: Rio de Janeiro,
2007.
IEEE, Institute. IEEE Std 830-1998. Recommended Practice for Software
Requirements Specifications. Institute of Electrical and Eletronic Engineers.
JANDL JUNIOR, Peter. Java Guia do Programador. Novatec Editora. 2007.
Disponível em:
<http://www.novatec.com.br/livros/javaguia/capitulo9788575221099.pdf>
Acesso em 02 abr. 2008.
KOCH, Nora. A UML-based Methodology for Hypermedia Design. England. Out
2000.
LAMPORT, Time. Clocks and the Ordering of Events. CACM. Jul 1978, p 558-
565.
HORSTMANN, Cay S. Core Java 2 – Vol.1:Fundamentos.Editora Makron
Books: São Paulo SP, 2000.
MANGIONE, Carmine. Performance tests show Java as fast as C++. Java
World. 02 jan. 1998. Disponível em: <http://www.javaworld.com/jw-02-1998/jw-
02-jperf.html>. Acesso em 01 jun. 2008.
MARINESCU, Floyd. EJB design patterns: advanced patterns, processes, and
42
idioms. New York: John Wiley & Sons, 2002.
MELO, Ana Cristina. Desenvolvendo aplicações com UML 2.0: do conceitual à
implementação – 2.ed. Brasport. Rio de Janeiro, 2004.
MURUGESAN, S. Leverage global software development and distribution using
the internet and web. Cutter IT Journal. Mar 1999
NEWMAN, Alexander. Usando Java. Editora Campus: Rio de Janeiro, 1996.
OLIVEIRA, José Palazzo Moreira de. Conceitos sobre Sistemas Distribuídos.
UFRGS. Disponível em: <http://palazzo.pro.br/sd/distr-dados.htm>. Acesso em
16 set 2010.
DEBU PANDA, REZA RAHMAN, DEREK LANE. EJB3 em ação. Alta Books,
2008.
PRESSMAN, ROGER S. Engenharia de Software. 5ª Ed. Rio de Janeiro:
McGraw- Hill, 2002.
Rafael Ponte. Anatomia do JSF - JavaServer Faces. Rafael Pontes. Ceará. 27
out. 2007. Disponível em: <http://www.rponte.com.br/wpcontent/
uploads/2007/10/anatomia-jsf-javaserver-faces-cct.pdf>. Acesso em 20
mar.2010.
RUBIRA, Cecília Mary Fischer. Desenvolvimento Baseado em Componentes e
o Processo UML Components. Unicamp. 2008. Disponível em:
<http://tolstenko.net/dados/Unicamp/2009.2/mc436/2009.2/Material de
Apoio/Slides/11_dbcUMLComp.pdf>. Acesso em 07 set. 2010.
SILBERSCHATZ, Abraham; Korth, Henry F e Sudarshan, S. Sistema de Banco
de Dados. Makron Books, 1999. p. 1.
SWEBOK. Disponível em: <http://www.computer.org/portal/web/swebok>.
Acesso em 01 jun. 2008.
SUN, Sun Microsystems. Designing enterprise applications with the j2ee
platform enterprise edition. Disponível em:
<http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e
/index.html>. Acesso em: 28 out. 2010.
TANENBAUM, Andrew S. Distributed Operating Systems. New Jersey: Prentice
Hall, 1995.
WIKIPEDIA. Sistema de Gerenciamento de Banco de Dados. Disponível em:
<http://pt.wikipedia.org/wiki/Sistema_de_gerenciamento_de_banco_de_dados>.
Acesso em: 10 dez. 2009.
WIKIPEDIA. PostgreSQL. Disponível em:
<http://pt.wikipedia.org/wiki/PostgreSQL>. Acesso em: 10 dez. 2009.
WIKIPEDIA. Engenharia de software. Disponível em:
<http://pt.wikipedia.org/wiki/Engenharia_de_software >. Acesso em: 10 dez.
43
2009.
WIKIPEDIA. Engenharia de software baseada em componentes. Disponível
em:<http://pt.wikipedia.org/wiki/Engenharia_de_software_baseada_em_compon
entes>. Acesso em: 10 dez. 2009.
WIKIPEDIA. Processo Unificado. Disponível em:
<http://pt.wikipedia.org/wiki/Processo_Unificado>. Acesso em 10 dez. 2009.
WIKIPEDIA. IBM Rational Unified Process Disponível em:
<http://en.wikipedia.org/wiki/IBM_Rational_Unified_Process>. Acesso em: 10
dez. 2009