Projeto JEDI - Engenharia de Software - Java - 264 Páginas
Projeto JEDI - Engenharia de Software - Java - 264 Páginas
Projeto JEDI - Engenharia de Software - Java - 264 Páginas
Engenharia de Software
Lição 1
Introdução à Engenharia de Software
Requerimentos de Software
NetBeans Enterprise Pack 5.5 executando sobre Java 2 Platform Standard Edition
Development Kit 5.0 ou superior (JDK 5.0, versão 1.5.0_01 ou superior), contemplando
a Java Runtime Environment, ferramentas de desenvolvimento para compilar, depurar,
e executar aplicações escritas em linguagem Java. Sun Java System Application Server
Platform Edition 9.
• Para Solaris, Windows, e Linux, os arquivos da JDK podem ser obtidos para
sua plataforma em http://java.sun.com/j2se/1.5.0/download.html
• Para Mac OS X, Java 2 Plataform Standard Edition (J2SE) 5.0 Release 4, pode
ser obtida diretamente da Apple's Developer Connection, no endereço:
http://developer.apple.com/java (é necessário registrar o download da JDK).
Engenharia de Software 2
JEDITM
Auxiliadores especiais
Coordenação do DFJUG
Agradecimento Especial
John Paul Petines – Criador da Iniciativa JEDITM
Rommel Feria – Criador da Iniciativa JEDITM
Engenharia de Software 3
JEDITM
1. Objetivos
Quando pessoas pensam sobre computadores, o primeiro detalhe que vêem em suas mentes são
as máquinas físicas – monitor, teclado, mouse e CPU. No entanto, o software é o que permite
utilizá-los. Um software de computador inclui um conjunto de programas que executa no
interior de um computador, de qualquer tamanho e arquitetura, que estão sendo processados por
programas e apresentados aos usuários como cópias hard ou soft. É construído por engenheiros
de software através do emprego de um processo de software que produz produtos de alta
qualidade de trabalho que identifica as necessidades das pessoas que irão usar o sistema.
Atualmente, o software é uma importante tecnologia em nossas vidas porque as afeta
praticamente em todos os aspectos, incluindo governo, comércio e cultura. Nessa lição,
discutiremos sobre engenharia de software como uma disciplina em construção de um software de
computador com qualidade. Uma camada de visão será usada para esboçar conceitos necessários
à compreensão da engenharia de software. Em seguida, obteremos uma compreensão sobre as
pessoas envolvidas no esforço de desenvolvimento de software. Ao final, explicaremos a
necessidade de documentação e de como organizar e documentar produtos de trabalho de
engenharia de software.
Ao final desta lição, o estudante será capaz de:
• Ter uma visão de camadas sobre a Engenharia de Software
• Obter qualidade dentro do esforço do desenvolvimento
• Conhecer as técnicas e garantias de Qualidade de Software
• Conhecer o processo de software
• Compreender o desenvolvimento de sistemas
• Definir as pessoas envolvidas no esforço do desenvolvimento
• Conhecer as diversas formas e benefícios de documentação
Engenharia de Software 4
JEDITM
Ferramentas
Método
Processo
Foco na Qualidade
Figura 1: Engenharia de Software – Uma camada de visão
Essa camada busca um total foco na qualidade. É uma cultura onde o compromisso em
melhoria continua no processo de desenvolvimento do software é sustentado. Permite o
desenvolvimento de mais abordagens efetivas para engenharia de software.
2.2. Processo
Define uma estrutura, que consiste em áreas de processos chave, que define e permite a entrega
racional e a tempo de um software. Áreas de processos chave são a base para o gerenciamento
de projeto de software. Estabelecem que métodos técnicos sejam aplicados, quais ferramentas
são usadas, que produtos de trabalho precisam ser produzidos, e que marcos são definidos.
Incluem a garantia que a qualidade será mantida, e que a mudança é devidamente controlada e
gerenciada.
2.3. Método
Metodologias Estruturadas:
• Informações de Engenharia
• Desenvolvimento do Ciclo de Vida do Software/Ciclo de Vida do Projeto
• Metodologia de Desenvolvimento de Aplicação Rapid
• Metodologia de Desenvolvimento de Aplicação Joint
• Método CASE*
1 Pressman, Roger S., Software Engineering, A Practitioner's Approach, Sixth Edition, (Singapore: McGraw-Hill Internal Edition, 2005), p. 53-54
Engenharia de Software 5
JEDITM
2.4. Ferramentas
Promovem o suporte aos processos e métodos. Ferramentas CASE (Computer Aided Software
Engineeing) proporcionam um sistema de suporte ao projeto de desenvolvimento, onde as
informações criadas por uma ferramenta podem ser usadas por outras. Podem ser automáticas ou
semi-automáticas.
Muitas ferramentas são usadas para desenvolver modelos. Modelos são patterns (padrões) de
algo que foi criado ou são simplificações. Existem dois modelos que geralmente são desenvolvidos
por um engenheiro de software, especialmente, o modelo de sistema e o modelo de software. O
modelo de sistema é uma representação acessível de um sistema complexo que precisa ser
estudado, enquanto o modelo de software é chamado de blueprint do software que precisa ser
construído. Assim como as metodologias, vários modelos de ferramentas são usados para
representar sistemas e softwares. Alguns estão descritos abaixo.
Abordagem de Modelos de Ferramentas Estruturada:
• Diagrama de Entidade-Relacionamento
• Diagrama de Fluxo de Dados
• Pseudocódigo
• Fluxograma
Engenharia de Software 6
JEDITM
Qualidade do Produto
Significa coisas diferentes para cada pessoa. É relativo para uma pessoa analisar qualidade. Para
os usuários finais, o software tem qualidade se fornecer o que desejam e quando desejam o
tempo todo. Também julgam baseados na facilidade de usar e de aprender como usá-lo.
Normalmente avaliam e categorizam com base em características externas, tal como, número de
falhas por tipo. Falhas podem ser categorizadas como: insignificantes, importantes e
catastróficas. Para que outros possam desenvolver e manter o software, estes devem ficar de olho
nas características internas em vez das externas. Exemplos que incluem erros e falhas
encontradas durante as fases de análise de requisitos, design, e codificação são normalmente
feitos anteriormente ao carregamento dos produtos para os usuários finais.
Como engenheiros de software, devemos construir modelos baseados em como os requisitos dos
usuários externos serão relacionados com os requisitos internos dos desenvolvedores.
Qualidade do Processo
Existem várias tarefas que afetam a qualidade do software. Às vezes, quando uma tarefa falha, a
qualidade do software falha. Como engenheiros de softwares, devemos validar a qualidade no
processo de desenvolvimento do software. Regras de processo sugerem que pela melhoria do
processo de desenvolvimento do software, também há melhora da qualidade do produto
resultante. Algumas regras de processo são demonstradas abaixo:
• Capability Maturity Model Integration(CMMI). Foram formulados pelo Software
Engineering Institute (SEI). É um processo meta-modelo que é baseado em um conjunto de
sistemas e competências da engenharia de software que devem existir dentro de uma
organização. Como a mesma atinge diferentes níveis de capacidade e maturidade desses
processos de desenvolvimento.
• ISO 9000:2000 para Software. É um padrão genérico, aplicado para qualquer organização
que queira melhorar a qualidade global dos produtos, sistemas ou serviços que proporciona.
• Software Process Improvement e Capability Determination (SPICE). É um padrão que
define um conjunto de requisitos para avaliação do processo de software. O objetivo desse
padrão é auxiliar organizações a desenvolver uma análise objetiva da eficácia de qualquer
processo de software definido.
Qualidade no contexto do ambiente de negócio
2 Pfleeger, Shari Lawrence, Software Engineering Theory and Practice, International Edition, (Singapore: Prentice-Hall, 1999), p. 10-14
Engenharia de Software 7
JEDITM
Engenharia de Software 8
JEDITM
Um software possui qualidade se ele estiver ajustado para uso, isto é, se estiver trabalhando
corretamente. Para que ele trabalhe corretamente, ele deve estar em conformidade com os
requisitos funcionais e de performance (características externas dos usuários), padrões
explicitamente documentados de desenvolvimento (padrões de qualidade), e características
implícitas (características internas aos desenvolvedores) que são esperadas por todo
desenvolvimento profissional de software.
Três pontos importantes enfatizados para definir a qualidade do software.
1. Requisitos de Software são a base para a qualidade do software. É necessário explicitar,
especificar e priorizar.
2. Padrões definem um de critérios de desenvolvimento que irão mostrar a maneira com a qual
o software será desenvolvido.
3. Características implícitas deverão ser identificadas e documentadas; elas influenciam na
maneira de como o software será desenvolvido assim como sua manutenibilidade.
Para definir uma boa engenharia de software, dê uma olhada nas características específicas que o
software apresenta. Algumas delas estão enumeradas abaixo:
• Usabilidade. É a característica do software de apresentar facilidades entre a comunicação
dos usuários com o sistema.
• Portabilidade. É a capacidade do software ser executado em diferentes plataformas e
arquiteturas.
• Reusabilidade. É a habilidade do software de se transferir de um sistema para outro.
• Manutenibilidade. É a habilidade do software de se envolver e adaptar-se às alterações em
um curto espaço de tempo. É caracterizado pela fácil atualização e manutenção.
• Dependência. É a característica do software ser confiável e de segurança.
• Eficiência. É a capacidade do software utilizar os recursos com maior eficiência.
Garantia de Qualidade de Software é composta por uma variedade de atividades com o objetivo
de construir software com qualidade. Isto envolve dois grupos de desenvolvedores e a equipe de
SQA (Software Quality Assurance). A equipe de SQA tem responsabilidade em garantir
plenamente à qualidade, supervisionar, manter, analisar e reportar defeitos. As atividades
envolvidas são as seguintes:
1. A equipe de SQA prepara o Plano de SQA. Isto se dá durante a fase de planejamento de
projeto. Identificam-na:
Engenharia de Software 9
JEDITM
Engenharia de Software 10
JEDITM
possam ser vistas por outros revisores. Isto ajudará a esclarecer os defeitos e ações a serem
tomadas.
• Mantenha o número dos participantes a um mínimo e insista em preparar-se para a
revisão. Escrever comentários e observações pelos revisores é uma boa técnica.
• Forneça uma lista de verificação para o produto de trabalho que é provável ser
revista. A lista de revisão provê uma estrutura que conduza a revisão. Isto também ajuda
os revisores a manterem o foco na questão.
• Programe as revisões como parte do processo de desenvolvimento de software e
assegure-se de que os recursos sejam fornecidos para cada revisor. Preparação prevê
interpretações em uma reunião. Isto também ajuda os revisores a manterem o foco na
questão.
• Sumário da revisão. Verifica a eficácia do processo da revisão.
Duas técnicas formais de revisão do produto de trabalho usadas na indústria são Fagan's
Inspection Method e Walkthroughs.
Engenharia de Software 11
JEDITM
• Refazendo o produto de trabalho. A lista de defeitos deve ser atribuída a uma pessoa
para repará-la. Normalmente, esta é o desenvolvedor do produto de trabalho.
• Acompanhando os reajustes. O moderador assegura-se que os defeitos nos produtos de
trabalho sejam endereçados e solucionados. Mais tarde este deve ser inspecionado por outro
inspetor.
• Realizando uma reunião ocasional de análise. Isto é opcional, momento onde é dada a
possibilidade aos inspetores de expressarem sua visão pessoal sobre erros e melhorias. A
ênfase é dada à maneira que a inspeção foi feita.
4.4.2. Walkthrough
O walkthrough é menos formal que a inspeção. Aqui, o produto de trabalho e sua documentação
correspondente são entregues para um time de revisores, normalmente em torno de 3 pessoas,
onde comentários de sua exatidão são apresentados. Ao contrário da inspeção onde um é o
moderador, o desenvolvedor do produto de trabalho coordena o walkthrough. Um escrivão
também deve estar presente para documentar a lista de ações. Uma lista de ações deve ser feita
a fim de melhorar a qualidade do produto final a qual inclui ajustes dos defeitos, resoluções dos
problemas etc.
Alguns passos devem ser seguidos para obter sucesso no walkthrough. Eles estão listados abaixo:
• Nenhum gerente deve estar presente.
• Enfatizar que o walkthrough é para detecção de erros e não para correção.
• Manter o interesse do grupo.
• Nenhuma contagem ou atribuição de nota.
• Criticar o produto; não a pessoa.
• Sempre documentar a lista de ações.
Conduzir o walkthrough, é similar à inspeção, requer muitas atividades. Elas estão categorizadas
como se segue:
• Antes do walkthrough
• O desenvolvedor do produto de trabalho agenda o walkthrough, preferivelmente, com um
dia de antecedência ou dois no máximo.
• Distribuir o material necessário para o produto de trabalho dos revisores.
• Pede-se especificamente que cada revisor traga pelo menos dois comentários positivos do
walkthrough e um comentário negativo sobre o produto do trabalho.
• Durante o walkthrough
• O desenvolvedor do produto de trabalho faz uma rápida apresentação do seu produto de
trabalho. Este passo pode ser ignorado caso os revisores conheçam bem o produto de
trabalho.
• Solicitar comentários aos revisores. Às vezes, problemas são levantados e apresentados,
mas não devem ser solucionados durante o walkthrough. Os problemas deverão ser
incluídos em uma lista de ações.
• Uma lista de ações deve ser produzida até o fim do walkthrough.
• Após o walkthrough
• O desenvolvedor do produto de trabalho recebe a lista de ações.
• Pede-se para enviar os estados das ações com o objetivo de resolver erros ou
discrepâncias apresentadas na lista de ações.
• Possivelmente, um outro walkthrough deve ser agendado.
Engenharia de Software 12
JEDITM
5. O Processo de Software
O processo de software provê uma estratégia que as equipes de desenvolvimento empregam
para construir software com qualidade. Ele é escolhido baseado na maturidade do projeto e
aplicação, métodos e ferramentas utilizadas e gerência e produtos que são exigidos. Pressman
fornece uma representação gráfica do processo de software. De acordo com ele, esta
representação fornece a estrutura que um plano compreensivo de desenvolvimento de software
pode estabelecer. Consiste em estrutura de atividades, conjunto de tarefas e atividades
guarda-chuva3.
Atividades guarda-chuva
Estrutura de Atividades
Estas atividades são executadas por pessoas envolvidas no processo de desenvolvimento aplicado
a qualquer projeto de software independente do tamanho, composição da equipe ou
complexidade do problema. Também são conhecidos como fases do processo de desenvolvimento
de software.
Conjunto de Tarefas
Cada uma das atividades na estrutura do processo define um conjunto de tarefas. Estas tarefas
devem ter marcos, produtos que podem ser entregues ou produtos finais e pontos de garantia de
qualidade de software (Pontos de SQA). Eles são modificados e ajustados a uma característica
específica do projeto de software e dos requisitos de software.
Atividades Guarda-chuva
Estas são atividades que dão suporte às atividades estruturais ao longo do progresso do projeto
de software como a gerência de projeto, gerência de configuração, gerência de requisitos,
gerência de riscos, revisão técnica formal, etc.
Existem vários tipos de modelos de processo de software. Os mais comuns são discutidos nesta
seção.
Modelo Linear Seqüencial
Também conhecido como modelo cascata ou ciclo de vida clássico. Este é o primeiro modelo
formalizado. Outros modelos de processo são baseados em sua abordagem de desenvolvimento
Engenharia de Software 13
JEDITM
Engenharia de
Requisitos
Engenharia
de Projetos
Codificação
Testes
Operação
e
Manutenção
Engenharia de Software 14
JEDITM
Desenvolvedores
Entrevista dos
constroem ou
Clientes
revisam protótipos
Clientes testam
o protótipo
Engenharia
Codificação Testes
de Projetos
Testes Fim-Turno
Fim-Turno
60 a 90 Dias
Engenharia de Software 15
JEDITM
Entrega do
Primeiro Fim-Turno Fim-Turno
Incremento
Terceiro
Incremento
Segundo Segundo de SW
Incremento Incremento
de SW de SW
Modelo Espiral
Foi originalmente proposto por Boehm. É um modelo de processo de software evolucionário
Engenharia de Software 16
JEDITM
D C B A
Avaliação
Análise & Projeto
Codificação &
Distribuição
A. Projeto Inicial do Software
B. Manutenção do Novo Software
C. Melhoramento do Software
D. Desenvolvimento de outro sistema inter-
relacionado
Figura 7: Modelo Espiral
Planejamento Determinar
Classes
Análise de Candidatas
Comunicação
Risco
D C B A
Avaliação Verificar Classes
Análise OO & na Biblioteca
Projeto
Codificação &
Distribuição Construir Utilize as
Nova Classe Classes
Construir a
enésima Iteração
do Software
Engenharia de Software 17
JEDITM
Aguardar
Mudanças
Métodos Formais
É uma abordagem da engenharia de software que incorpora um conjunto de atividades guiadas
por uma especificação matemática do software. Eles fornecem um mecanismo para remover
vários problemas que dificultariam o uso de outros paradigmas de engenharia de software. Serve
como um meio de verificar, descobrir e corrigir erros que de outra forma não seriam detectados.
• Tipo do Projeto
• Métodos e Ferramentas a serem utilizadas
• Requisitos e Pessoas-Chaves do Negócio
• Senso Comum e Julgamento
Engenharia de Software 18
JEDITM
6. Entendendo Sistemas
O projeto de software que necessita ser desenvolvido revolve em torno dos sistemas. Os sistemas
consistem em um grupo de entidades ou componentes, Juntos interagem para dar forma aos
inter-relacionamentos específicos, organizados por meio da estrutura, e trabalhando para
conseguir um objetivo comum. Compreender sistemas fornece um contexto para todo o projeto
com a definição dos limites dos projetos. Surge a pergunta, "O que é incluído no projeto? O que
não é?" Em definição de limites do sistema, um Engenheiro de Software descobre o seguinte:
• As entidades ou o grupo das entidades que são relacionadas e organizadas de alguma
maneira dentro do sistema fornecem a entrada, realizam atividades ou recebem a
saída;
• Atividades ou ações que devem ser executadas pelas entidades ou pelo grupo das
entidades a fim conseguir a finalidade do sistema;
• Uma lista de entrada; e
• Uma lista de saída.
Como exemplo, a Figura 10 mostra os limites do sistema do estudo de caso. Mostra elementos
deste sistema com o uso do diagrama do contexto.
ENTIDADES ENTRADAS SAÍDAS ENTIDADES
Candidato
Treinador
relatório de
formulário de
ATIVIDADES: sócios
requerimento submeter aplicação
Agendamentoagendar simulações de saída lista de
das associar candidatos a grupo
grupos
simulações de
Equipe do saída Equipe do
Clube Clube
As entidades que são envolvidas neste sistema são os candidatos, a equipe de funcionários do
clube e o treinador. São representadas como caixas retangulares. São relacionadas umas com as
outras executando determinadas atividades dentro deste sistema. As principais atividades
executadas são o envio dos formulários de aplicação, programar as simulações de saídas e a
atribuição do pretendente a um grupo. São representados por um círculo no meio que define a
funcionalidade da informação mantendo a sociedade do clube. Para executar estas ações, uma
lista das entradas é necessária. Especificamente, formulários de aplicação e a programação das
simulações de saídas. São representados por uma seta com o nome dos dados que estão sendo
passados. A ponta da seta indica o fluxo dos dados. Os resultados mais importantes que se
espera deste sistema são os relatórios da sociedade e as listas de grupos. Outra vez, são
representados por uma seta com o nome dos dados que estão sendo passados. A ponta da seta
indica o fluxo dos dados. O objetivo deste sistema é segurar a aplicação da sociedade do clube.
Princípios Gerais de Sistemas
Alguns princípios gerais dos sistemas são discutidos abaixo. Isto ajudará ao Engenheiro de
Software a estudar o sistema onde o projeto do software revolve.
• Mais especializado um sistema, menos capaz é de adaptar-se a circunstâncias
diferentes. As mudanças teriam um impacto grande no desenvolvimento de tais sistemas.
Cada um deve ser cuidadosamente certificado que não há nenhuma mudança dramática no
ambiente ou nas exigências quando o software está sendo desenvolvido. As partes
interessadas e os colaboradores devem estar cientes dos riscos e dos custos das mudanças
Engenharia de Software 19
JEDITM
4 4
PROCEDIMENTO PROCEDIMENTO 4
MANUAL COMPUTADORIZAD PROCEDIMENTO
Entrada O 5 MANUAL
Processando INFORMAÇÃO Saída
1
3 COMPUTADOR 3
PESSOAL HARDWARE PESSOAL
2
COMPUTADOR
SOFTWARE
Entrar Dados Revisar Informações
Monitorar Atividades Tomar Decisões
Ler Processos Manuais 5 Mudar Regras Processuais
DADOS
Engenharia de Software 20
JEDITM
Engenharia de Software 21
JEDITM
Usuários finais são pessoas que irão utilizar o produto final. Muitos dos requisitos virão deste
grupo. Eles podem ser divididos em dois grupos de acordo com o envolvimento dentro da
organização e desenvolvimento, a saber: aqueles envolvidos diretamente e aqueles envolvidos
indiretamente.
Aqueles que estão diretamente envolvidos
A Tabela 1 mostra a categorização dos usuários finais de acordo com as funções que eles
executam no sistema.
Engenharia de Software 22
JEDITM
• Gerentes podem não fornecer recursos, fundos ou tempo que usuários precisam para
construir um sistema efetivo. Restrições financeiras e de recurso irão ocorrer. É importante
priorizar os requisitos. Mais sobre isto pode ser visto no capítulo 3 – Engenharia de
Requisitos.
Aqueles que estão indiretamente envolvidos
Freqüentemente, este grupo inclui auditores, portadores comuns e grupo de garantia de
qualidade. O objetivo geral deste grupo é certificar que o sistema está sendo desenvolvido de
acordo com uma variedade de definições como:
• Padrões contábeis desenvolvidas pelas operações de contas da organização ou firma.
• Padrões desenvolvidos por outros departamentos dentro da organização ou pelo cliente
ou pelo usuário que irá herdar o sistema
• Vários padrões impostos pelas agências governamentais reguladoras.
Alguns possíveis problemas que podemos encontrar com este grupo. Como engenheiro de
software, manter atenção sobre eles e mapeá-los em conformidade.
• Eles não se envolvem no projeto até que se atinja o fim, em particular, o grupo de
garantia de qualidade. É importante que eles envolvam-se em todas as atividades que
se exija sua experiência e opinião.
• Eles fornecem notação necessária e forma do documento. Eles podem precisar de
definição para apresentação e documentação do sistema.
• Eles estão mais interessados em substância do que em formulários.
A equipe de desenvolvimento é responsável pela construção do software que irá dar suporte ao
sistema de domínio-específico. Consistem em: analista de sistemas, projetista, programadores e
testadores.
Analista de Sistemas
Sua responsabilidade é entender o sistema. Dentro do sistema, ele identifica o que o cliente quer
e documenta e prioriza os requisitos. Isto envolve detalhamento do sistema para determinar
requisitos específicos que serão a base do projeto de software.
Projetista
Seu trabalho é transformar uma tecnologia livre de arquitetura em uma estrutura interna para
que os programadores possam trabalhar. Normalmente, o analista de sistema e o projetista são a
mesma pessoa, mas isto é diferenciado pelo foco nas funções e habilidades requeridas.
Programadores
Baseados no projeto do sistema, os programadores escrevem o código do software utilizando uma
linguagem de programação.
Testadores
Para cada produto funcional, deve-se realizar uma revisão de modo a encontrar: falhas ou erros.
Isto sustenta a cultura de qualidade necessária ao desenvolvimento de software com qualidade.
Isto garante que o produto funcional irá de encontro com os requisitos e padrões definidos.
Engenharia de Software 23
JEDITM
Engenharia de Software 24
JEDITM
• Servem como documentos transitórios que são parte de uma infra-estrutura envolvida em
uma execução de um projeto real como: cenários, documentação do projeto interno,
relatório de reuniões e problemas.
Engenharia de Software 25
JEDITM
9. Exercícios
9.1. Especificação de escopo
O objetivo do trabalho sobre projeto é reforçar o conhecimento e habilidade adquirida nesta lição.
Particularmente, são:
1. Definição de Escopo do Sistema
2. Criação de Modelo de Escopo de Sistema
3. Execução de Walkthrough
PRODUTOS:
1. Modelo de Escopo do Sistema
2. Lista de Ações
Engenharia de Software 26
Módulo 4
Engenharia de Software
Lição 2
Engenharia de Software Orientada a Objetos
1. Objetivos
Engenharia de Software Orientada a Objetos é o uso de tecnologias de objetos na construção
de software. Tecnologia de objetos é um conjunto de princípios que direciona a construção de
software usando método orientado a objetos.
Este abrange toda uma estrutura de atividades incluindo análise, desenvolvimento, teste, escolha
de metodologias, linguagens de programação, ferramentas, bancos de dados e aplicações para a
engenharia de software.
Nesta lição veremos o básico para o entendimento da orientação a objetos através de uma
explanação sobre os conceitos fundamentais tais como objetos e classes, abstração,
encapsulamento, modularidade e hierarquia. Faremos também uma apresentação geral dos
modelos de processos orientados a objetos que seguem uma montagem baseada em
componentes. Faremos também uma introdução sobre análise orientada a objetos e atividades de
desenvolvimento, listando algumas metodologias, e sobre produtos de trabalho. Finalmente,
faremos uma discussão sobre a Linguagem de Modelagem Unificada (UML - Unified Modeling
Language) e a atividade de modelagem.
Ao final desta lição, o estudante será capaz de:
• Entender os conceitos de Orientação a Objetos
• Entender os processos gerais de modelagem orientada a objeto
• Ver de uma forma geral as atividades de análise e modelagem orientada a objeto
• Entender a UML (Unified Modeling Language - Linguagem de Modelagem Unificada) e
entender a atividade de modelagem
Engenharia de Software 4
JEDITM
submitApplication() submitApplication()
AthleteID:3556 AthleteID:3557
Name: Joel Santos Name: Arjay Solamo
Status: NEW Status: NEW
Squad: None Squad: None
updateSquad() updateSquad()
updateSquad("Treinando")
assignToSquad()
ATRIBUTOS
CoachID:9786
Name: JP Petines
MENSAGEM Sport: Basketball
updateSport()
Engenharia de Software 5
JEDITM
Quatro princípios básicos estão genericamente associados com orientação a objetos os quais são
abstração, encapsulamento, modularidade e hierarquia. Estes conceitos estão inter-relacionados e
cooperam entre si.
Abstração
Abstração está definida como uma características essencial de uma entidade que distingue esta
de todas as outras espécies de entidades1. Este é um tipo de representação que inclui apenas as
coisas que são importantes ou interessantes de um ponto de vista particular. Este é um domínio e
dependente da perspectiva, ou seja, o que é importante em um contexto e que pode não
necessariamente ser em outro. Isto nos permite gerenciar a complexidade do sistema nos
concentrando apenas nas características que são essenciais ou importantes para o sistema, e
ignoramos ou descartamos as características que não são neste momento. Objetos são
representados através dessas características que são consideradas relevantes para o propósito em
questão, e são desconsideradas as características que não são.
Exemplos de abstração incluídos neste estudo de caso são:
• Um candidato apresentar-se no clube da associação para entrar na equipe.
• A equipe do clube agenda um evento para treinamentos.
• O técnico indica um atleta para a seleção.
• A seleção pode estar treinando ou competindo.
• Times são formados a partir de uma seleção.
Encapsulamento
Modularidade
1 Object-oriented Analysis and Design using the UML, Student's Manual, (Cupertino, CA: Rational software Corporation, 2000), p. 2-15
Engenharia de Software 6
JEDITM
quebra algo que é grande é complexo em componentes pequenos e gerenciáveis, isto facilita a
tarefa do engenheiro de software de gerenciar e desenvolver software através da gerência e
desenvolvimento destes pequenos componentes para, então, iterativamente integrá-los.
Por exemplo, o caso de estudo "Liga Ang Bulilit" pode ser dividido em subsistemas menores como
mostra a Figura 2.
Sistema de
Manutenção dos
Sócios do Clube
Sist. Manutenção
das Informações
do Treinador
Sistema de
Manutenção de
Times e Seleções
Generalização é uma forma de associação onde uma classe compartilha a estrutura e/ou o
comportamento com uma ou mais classes. Ela define a hierarquia das abstrações nas quais a
subclasse herda de uma ou mais superclasses. É um tipo de relacionamento.
Nome
ListaDeMembros
listarMembros()
mudarTécnico()
Treinamento Competição
Engenharia de Software 7
JEDITM
Pessoa
Estudante Empregado
Observe que tanto Estudante como Empregado possuem implementações diferentes do método
obterNome(). Considere no seguinte método principal onde o atributo ref é uma referência para a
classe Pessoa. A primeira vez que o método ref.obterNome() for chamado, executará a versão de
Estudante já que a referência está apontada a este objeto. A segunda vez que o método
ref.obterNome() for chamado, executará o método de Empregado pois agora a referência aponta
para este objeto.
public static main(String[] args) {
Pessoa ref;
Estudante objetoEstudante = new Estudante();
objetoEstudante.nome = "aluno";
Empregado objetoEmpregado = new Empregado();
objetoEmpregado.nome = "colaborador";
ref = objetoEstudante; // Referência de Pessoa aponta ao objetoEstudante
String temp = ref.obterNome(); // o método obterNome da classe
// Estudante é chamado
System.out.println(temp);
ref = objetoEmpregado; // Referência de Pessoa aponta ao objetoEmpregado
temp = ref.obterNome(); // o método obterNome da classe Empregado é chamado
System.out.println(temp);
}
Equipe Atletas
Engenharia de Software 8
JEDITM
<<subsystem>>
Nome do Componente
Interface do
Componente
Engenharia de Software 9
JEDITM
O objetivo principal da Análise Orientada a Objeto é desenvolver uma série de modelos que
descrevam como o software de computador trabalhará para satisfazer um conjunto de requisitos
definidos pelo cliente. A intenção é definir um conjunto de classes, suas relações e
comportamentos que são relevantes para o sistema que está sendo estudado; desde que os
requisitos do cliente influenciem a criação dos modelos, esta fase também é conhecida como
engenharia de requisitos.
Dois modelos maiores são desenvolvidos durante esta fase, o modelo de requisitos e o modelo de
análise. Ambos descrevem a informação, a função e o comportamento dentro do contexto do
sistema, e são modelados como classes e objetos.
Existem cinco princípios básicos de análise aplicados nesta fase.
1. Domínio de informações é modelado. O sistema é analisado em busca de dados
importantes que são necessários dentro do sistema.
2. Função de módulo é descrita. O sistema é analisado para identificar funções importantes
que definem o que precisa ser feito dentro do sistema.
3. Comportamento modelo é representado. Usando os dados e funções importantes, o
comportamento do sistema é analisado para entender sua dinâmica natural. Isto também
inclui suas interações com seu ambiente.
4. Modelos divididos para expor maiores detalhes. Os elementos modelo são refinados e
redefinidos para mostrar os detalhes que conduzirão ao projeto do software.
5. Primeiros modelos representam a essência do problema, embora mais tarde
forneçam detalhes de implementação. O desenvolvimento iterativo dos modelos deve
facilitar um plano de transição para a fase de projeto.
Todos estes métodos seguem um conjunto comum de etapas para analisar um sistema. Cada uma
destas etapas elaboradas indica o modo de como que os produtos do trabalho são desenvolvidos
no capítulo de engenharia de requisitos.
ETAPA 1. Identifique os requisitos do cliente para o sistema orientado a objeto. Exige
identificação de casos de uso ou cenários, e construção dos modelos de requisitos.
Engenharia de Software 10
JEDITM
O objetivo da fase Projeto Orientado a Objetos é transformar o modelo de análise num modelo de
análise orientado a objeto, que serve como um projeto para construção do software. Ele descreve
a organização específica dos dados através da especificação e redefinição dos atributos, e também
define os detalhes procedimentais das operações das classes. Como na análise, existem cinco
princípios-guia de projeto que podem ser aplicados nesta fase.
1. Unidades lingüísticas modulares
2. Algumas interfaces
3. Pequenas interfaces e baixo acoplamento
4. Interface explícita
5. Encapsulamento de Informações
Engenharia de Software 11
JEDITM
Todas estas metodologias têm um conjunto de passos comuns que são realizados no projeto. Em
cada um destes passos são elaborados produtos que são produzidos no capítulo Engenharia de
Projetos.
PASSO 1. Definir os subsistemas de software através da definição dos subsistemas
relacionados (projeto de entidades), subsistema de controle (projeto de controladores) e
subsistemas de interação humana (projeto de fronteiras). Estes passos devem ser guiados
baseados na arquitetura escolhida.
PASSO 2. Definir os Projetos de Classes e Objetos.
PASSO 3. Definir o Projeto para Troca de Mensagens.
Engenharia de Software 12
JEDITM
Entretanto, a notação foi unificada por Booch, Rambaugh e Jacobson. A OMG (Object
Management Group) é um grupo que mantém um conjunto de padrões que define a utilização da
UML, realizando uma padronização técnica dos modelos de projeto. Atualmente, outros
participantes colaboram com esta padronização e definição da UML.
UML não é um método ou metodologia. Não é indicada para um processo particular. Não é uma
linguagem de programação. É basicamente um padrão de ferramentas de modelagem usado por
desenvolvedores em seus trabalhos de software, como foi mostrado nos modelos.
Um modelo útil tem uma determina quantidade de detalhe e de estruturas, mostra claramente o
que é importante para uma determinada atividade. Geralmente, os desenvolvedores modelam a
situação complexa dentro de um sistema de atividade humana. Devem modelar somente as
partes que são importantes ao invés de refletir toda a situação. Por esta razão, necessitam ser
ricos em detalhes sobre a parte tratada. Os modelos da fase de análise (modelos de análise de
requisitos), devem ser exatos, completos e sem ambigüidades. Sem isto, o trabalho da equipe do
desenvolvimento será muito mais difícil. Ao mesmo tempo, não deve incluir decisões prematuras
sobre como o sistema será construído para atender as exigências do usuário. Caso contrário, a
Engenharia de Software 13
JEDITM
equipe de desenvolvimento pode, mais tarde, achar que suas ações são controladas. A maioria
dos modelos está no formato de diagramas que podem ser acompanhados por descrições
textuais, lógicas, processos de especificações matemáticas ou de dados.
Analistas de sistemas e gerentes de projetos usam diagramas para criar modelos de sistemas. Os
diagramas são usados amplamente para:
• entender a estrutura de objetos e seus relacionamentos.
• compartilhamento de plano com outros
• solicitação de planos e novas possibilidades
• testes de planos e construir prognósticos
Aqui se encontram as várias técnicas de modelagem que podem ser encontradas. Algumas regras
gerais são listados abaixo. Modelagem técnicas deve ser:
• Únicas. Mostrar somente o que precisa ser mostrado.
• Internamente compatível. Os diagramas devem suportar ao outro.
• Completo. Mostrar tudo aquilo que precisa ser mostrado.
• Representados hierarquicamente. Dividindo o sistema em componentes menores. Em
seguida, mostrar os detalhes de sub-níveis.
A UML fornece um conjunto de diagramas usados para modelar sistemas. Os diagramas são
representados por quatro elementos principais.
• Símbolos. Representam as figuras descritas nos diagramas. São figuras abstratas e podem
ser conectados com outros símbolos (por exemplo, uma classe é representada por um
retângulo).
• Símbolos bidimensionais. São similares aos símbolos exceto que têm os compartimentos
que podem conter outros símbolos, símbolos ou cadeias. Um símbolo não possui outros
símbolos.
• Caminhos. Representam uma ligação de um símbolo a outro. Normalmente representam um
fluxo de dados.
• Cadeias. São usadas para representar descrições, nomes, entre outros dados textuais, nos
símbolos ou caminhos.
A especificação de UML fornece uma definição formal de como usar diagramas de UML. Fornece a
gramática de UML (sintaxe) que inclui o significado dos elementos e as regras de como os
elementos são combinados (semântica).
Um único diagrama ilustra ou documenta um determinado aspecto de um sistema. Um modelo,
que sendo utilizado por outra pessoa, fornece uma visão completa do sistema em um
determinado estágio e perspectiva. Por exemplo, os modelos desenvolvidos durante a fase de
análise dão uma visão completa do sistema através do domínio do problema.
Capturar essencialmente o aspecto do sistema tais como funções, dados, entre outros. Consiste
em diversos diagramas para a segurança de que todos os aspectos do domínio do problema estão
contemplados. Os modelos, desenvolvidos durante a fase do projeto, dão uma visão completa do
sistema a ser construído. É uma visão do domínio da solução provê a possibilidade de transformar
os diagramas em componentes do sistema tais como, projetos de diálogo para as janelas de
interação com o usuário, os elementos da base de dados para as funções de controle e deste
modo continuamente.
Os modelos que são produzidos durante o desenvolvimento do projeto modificam durante o
desenvolvimento do mesmo. Normalmente, são dinâmicos em determinados aspectos:
• Nível de Abstração. Conforme o projeto se desenvolve, o modelo usado vai para um estágio
menos abstrato e mais concreto. Por exemplo, é possível começar com classes que
representam o tipo dos objetos que encontraremos no sistema tal como atletas, ônibus,
seleção e equipe. Com o tempo, do começo ao fim do projeto, se pode definir para as classes
Engenharia de Software 14
JEDITM
os atributos e as operações. As classes também devem suportar classes adicionais tais como
corretores, que representarão a plataforma de distribuição do objetivo.
• Grau de Formalidade. O grau de formalidade com que as operações, os atributos e as
restrições são definidos com o desenvolvimento do projeto. Inicialmente, os atributos são
classificados e podem ser facilmente definidos usando o português estruturado ou qualquer
outra língua utilizada pela equipe de desenvolvimento. Com o tempo, chega o fim do projeto
e inicia-se a fase de implementação. Atributos e operações são definidas utilizando a
linguagem de programação escolhida, neste caso Java. Por exemplo, na fase de análise, uma
usa-se “Athlet” como o nome da classe que conterá as informações dos atletas. Na fase do
projeto, pode ser uma classe persistente que captura a informação sobre detalhes de um
atleta e ser nomeado como classe, “DBAthlet”.
• Nível de detalhamento. Enquanto o projeto progride, os diferentes modelos representam a
mesma visão mas mostram um nível mais aprofundado de detalhamento. Os modelos ficam
mais detalhados ao se avançar no processo de desenvolvimento. Por exemplo, o primeiro
diagrama caso de uso pode mostrar somente os diagramas de Casos de Uso óbvios são
aparentes em uma primeira visão. Na segunda visão, o diagrama de Caso de Uso pode ser
elaborado com maiores detalhes, e Casos de Uso adicionais podem surgir. Após a terceira
visão no projeto, pode-se incluir uma descrição mais elaborada na qual os usuários interagem
com os novos Casos de Uso e com os relacionamentos de outros Casos de Uso.
Engenharia de Software 15
JEDITM
Mostra a estrutura estática do domínio das abstrações (classes) do sistema. Ele descreve os tipos
de objetos no sistema e os vários tipos de relacionamentos estáticos que existem entre eles.
Mostra os atributos e operações de uma classe e checa a maneira com que os objetos colaboram
entre si.
Esta ferramenta de modelagem produz o diagrama mais importante do sistema, pois é usado para
modelar um entendimento do domínio da aplicação (essencialmente parte do sistema de
atividades humanas), e os objetos também são entendidos como partes do sistema resultante. A
figura seguinte mostra um exemplo de diagrama de classe.
Engenharia de Software 16
JEDITM
Mostra o fluxo seqüencial das atividades. É usado tipicamente para indicar o comportamento da
operação, fluxo de eventos ou a trilha de evento do Caso de Uso. Complementa o diagrama de
Engenharia de Software 17
JEDITM
Caso de Uso , mostrando o fluxo de trabalho do método. Ele encoraja a descoberta de processos
paralelos, ajudando assim a eliminar seqüências desnecessárias no processo do método.
Complementa o diagrama de classe por mostrar o fluxo de cada uma das operações (similar ao
mapa de fluxo). A figura seguinte mostra um exemplo de um diagrama de atividade.
Engenharia de Software 18
JEDITM
Indica os objetos reais e as ligações que representam as “redes de objetos” que estão
colaborando. A seqüência de tempo é indicada pela numeração do índice da mensagem das
ligações entre os objetos. O diagrama de colaboração é mais apropriado quando os objetos e suas
ligações facilitam o entendimento da interação entre os objetos, e a seqüência de tempo não é
importante. A figura seguinte mostra um exemplo de diagrama de colaboração.
Mostra todos os possíveis estados que objetos da classe podem assumir e quais eventos causaram
sua mudança. Mostra como os estados dos objetos mudam de acordo com o resultado de eventos
que são controlados pelo objeto. Bom para ser usado quando uma classe tem comportamento de
ciclo de vida complexo. A figura seguinte mostra um exemplo do diagrama de estado.
Engenharia de Software 19
JEDITM
Mostra a arquitetura física do hardware e de software do sistema. Ele realça a relação física entre
software e componentes de hardware no sistema. Componentes no diagrama tipicamente
representam os módulos físicos de código e correspondem exatamente ao diagrama de pacotes. A
figura seguinte é um exemplo do Diagrama de Implementação.
O módulo de UML está disponível com o NetBeans Update Center (tools – Update Center).
Após instalado este módulo, para criar um projeto UML, siga os seguintes passos:
1. Ao acessar File | New Project para criar um novo projeto, uma nova categoria UML será
Engenharia de Software 20
JEDITM
mostrada.
2. Conheça e teste todas as opções disponíveis. Utilizaremos a opção Java-Platform Model. Ao ser
pressionado o botão Next, a janela seguinte irá solicitar o nome do projeto, a localização do
projeto e a pasta do projeto. Pressionando o botão Finish a seguinte janela será mostrada.
Engenharia de Software 21
JEDITM
4. Para criar uma nova classe, pressione o botão direito do mouse sobre o projeto (UMLProject1)
e selecione a opção Add | Element e será mostrada a seguinte janela:
Engenharia de Software 22
JEDITM
6. Para adicionar atributos a classe Funcionario, pressione o botão direito do mouse em cima do
elemento (na área de Projects | Model | Funcionario) e selecione Add | Attribute (para
novos métodos selecione Add | Operation) ou pressione Alt + Shift + A (para métodos
Alt + Shift + O) selecionando a figura que representa a classe Funcionario.
7. Pressione um duplo clique sobre o atributo para alterar as propriedades deste, a janela
Properties (no canto inferior direito) permite uma alteração mais refinada (se o atributo for
estático por exemplo).
8. O último passo, após tudo pronto é a geração dos códigos fontes em Java. Selecione a classe
Funcionario, pressione o botão direito do mouse e selecione a opção Generate Code... e como
resultado teremos a seguinte classe.
Engenharia de Software 23
Módulo 4
Engenharia de Software
Lição 3
Engenharia de Requisitos
1. Objetivos
Projetar e construir um sistema de computador é desafiante, criativo e simplesmente divertido e
prazeroso. Entretanto, desenvolver um bom programa que resolva o problema errado, não serve a
ninguém. É importante compreender as necessidades e requisitos do usuário, de modo que
resolvamos o problema correto e construamos o sistema correto.
Neste capítulo, discutiremos os conceitos e as dinâmicas da engenharia de requisitos. É uma fase
de desenvolvimento de programa que consiste em sete tarefas ou atividades distintas que tem a
meta de compreender e documentar os requisitos da parte interessada. Dois modelos importantes
serão construídos: modelo de requisitos, que é o modelo de domínio de sistema ou problema e
o modelo de análise, que serve como o modelo de base do programa (modelo de solução). A
Matriz de Requisitos Rastreáveis (RTM, sigla em inglês para Requirement Traceability Matrix) será
introduzida para ajudar os engenheiros de programa a administrar os requisitos e, também, as
métricas de requisitos e seus significados serão discutidos.
Ao final desta lição, o estudante será capaz de:
• Aprender os conceitos e dinâmicas da engenharia de requisitos
• Aprender como construir o modelo de requisitos
• Aprender como construir o modelo de análise
• Aprender como manter a trilha dos requisitos usando a Matriz de Rastreabilidade de
Requisitos (MRR)
• Aprender as métricas de requisitos e seus significados
Engenharia de Software 4
JEDITM
Engenharia de Software 5
JEDITM
3.1. Concepção
Em geral, a maioria dos projetos de software iniciam quando há um problema a ser resolvido ou
uma oportunidade identificada. Como exemplo, considere que um negócio descubra uma
necessidade ou um novo mercado ou um potencial serviço. Na concepção, o escopo do problema e
sua natureza são definidos. Engenharia de Software faz um conjunto de perguntas livres de
contexto com a intenção de estabelecer uma compreensão básica do problema, o que as pessoas
querem de solução, a natureza da solução e a eficiência da compreensão preliminar e a
colaboração entre o usuário final e o desenvolvedor.
Engenharia de Software 6
JEDITM
3.2. Elucidação
Após a concepção, o próximo passo é a elucidação. Ajuda o cliente a definir o que foi requerido.
Entretanto, esta não é uma tarefa fácil. Entre os problemas encontrados na elucidação são citados
abaixo:
1. Problemas de escopo. É importante que os limites do sistema estejam definidos clara e
corretamente. É importante evitar o uso demasiado de detalhes técnicos porque é possível
confundir mais do que esclarecer os objetivos do sistema.
2. Problemas de entendimento. Em alguns momentos é difícil aos clientes e usuários possuir
uma completa definição do que necessitam. Algumas vezes eles tem fraco entendimento da
capacidade e limitações de seus ambientes computacionais, ou não possuem um
entendimento completo do domínio do problema. Por vezes podem até omitir informações
que acreditam ser óbvias.
3. Problemas de volatilidade. É inevitável que os requisitos mudem com o tempo.
Para ajudar a superar estes problemas, engenheiros de software devem abordar a pesquisa de
requisitos de uma forma organizada e sistemática.
Engenharia de Software 7
JEDITM
Tarefas na Reunião
1. O primeiro tópico que precisa ser resolvido é a necessidade e a justificativa do novo produto.
Todo mundo deve concordar que o produto é justificável.
2. Cada participante apresenta sua lista ao grupo.
3. Após a apresentação de todos os participantes, uma lista consolidada é criada. Ela elimina
questões redundantes, adiciona novas idéias que porventura apareçam durante a discussão,
mas não exclui nada.
4. A lista consensual em cada tópico (objetos, serviços, restrições e performance) é definida. A
lista consolidada da tarefa anterior é diminuída, aumentada, ou reescrita para refletir o
produto ou sistema a ser desenvolvido.
5. Um vez que a lista consensual está definida, a equipe é dividida em sub-equipes. Cada uma
irá trabalhar para desenvolver as mini-especificações para uma ou mais entradas da lista
consensual. A mini-especificação é simplesmente um detalhamento do item da lista utilizando
palavras e frases.
6. Cada sub-equipe, então, apresenta a sua mini-especificação para todos os presentes.
Inclusões, exclusões e maiores detalhamentos podem ser feitos. Em alguns casos, serão
descobertos novos objetos, serviços, restrições ou requisitos de performance que serão
adicionados às listas originais.
7. Em alguns casos, surgem questões que não poderão ser resolvidas durante a reunião. Uma
lista de pendências é mantida e estas serão trabalhadas mais tarde.
8. Após se completar cada mini-especificação, cada presente faz uma lista de critérios de
validação do produto ou sistema e apresenta a lista à equipe. Uma lista consensual de
critérios de validação é criada.
9. A um ou mais participantes é associada a tarefa de escrever um esboço da Ata de Reunião
com todas as questões levantadas na reunião.
Tarefas Pós-Reunião
1. Compilar a Ata de Reunião com todos os itens discutidos na reunião.
2. Priorizar os requisitos. Pode-se usar a Técnica Qualidade da Função ou a Técnica de MoSCoW.
Engenharia de Software 8
JEDITM
Classificação Significado
Engenharia de Software 9
JEDITM
3.3. Elaboração
A informação obtida pela equipe durante o levantamento e esclarecimento é expandida e refinada
durante a elaboração. Esta tarefa de exigência de engenharia tem o foco em definir, redefinir e
refinar os modelos, a saber, os modelos de requisitos (domínio do sistema ou problema) e modelo
de análise (domínio da solução). Tenta modelar “O QUE” ao invés de “COMO”.
Modelo de Requisitos é criado usando metodologias que centralizam no usuário os cenários que
definem a maneira como o sistema é usado. Descreve como os usuários finais e os atores
interagem com o sistema.
Modelo da Análise é derivado do Modelo de Requisitos onde cada cenário é analisado para obter
as classes de análise, isto é, o domínio das entidades de negócio que são visíveis ao usuário final.
Os atributos de cada classe da análise são definidos e as responsabilidades que são exigidas por
cada classe são identificadas. Os relacionamentos e a colaboração entre as classes são
identificadas e uma variedade de diagramas suplementares de UML é produzida. O resultado final
da elaboração é um modelo de análise que define o domínio informativo, funcional e o
comportamento do problema. O desenvolvimento destes modelos será discutido no Modelo de
Requisitos e Análise e na seção Especificação de Requisitos nesta lição.
3.4. Negociação
Na negociação, os clientes, as partes interessadas e a equipe do desenvolvimento do software
negociam os conflitos. Os conflitos aumentam quando os clientes estão pedindo mais do que o
desenvolvimento de software pode conseguir com os limitados recursos de sistema liberados. Para
resolver estes conflitos, requisitos são classificados, os riscos associados com cada exigência são
identificados e analisados, as estimativas de esforço do desenvolvimento e os custos são feitas, e
prazo de entrega é definido.
O objetivo da negociação é desenvolver um plano de projeto que se adeqüe às exigências do
usuário ao refletir acontecimentos do mundo real tais como o tempo, pessoas e o orçamento. Ele
significa que o cliente obtém o sistema ou o produto que satisfaz à maioria das necessidades, e a
equipe do software é capaz de trabalhar realisticamente para alcançar os prazos e orçamentos
definidos nas reuniões.
A Arte de Negociação
Negociação é um meio de estabelecer colaboração. Para o sucesso de um projeto de
desenvolvimento de software, colaboração é a chave. Abaixo estão algumas diretrizes da
negociação com as partes interessadas.
1. Lembre que a negociação não é nenhuma competição. Todo o mundo deve chegar a um
acordo. Em algum nível, todos devem sentir que as preocupações foram enviadas, ou que
alcançaram algo.
2. Tenha uma estratégia. Escute o que as partes querem alcançar. Decidam como juntos farão
tudo acontecer.
3. Escute efetivamente. Mostre que está escutando e que está preocupado. Tente não formular
a resposta ou uma reação enquanto o outro está falando. Pode-se adquirir algo que pode
ajudar uma negociação futura.
4. Focalize no interesse da outra parte. Não leve posições duras para evitar conflito.
5. Não leve para o lado pessoal. Focalize no problema que precisa ser resolvido.
6. Seja criativo. Não tenha nenhum medo de "sair da caixa".
7. Esteja pronto para assinar. Uma vez que foi estabelecido um acordo, este deve ser assinado
e passado para outros assuntos.
Engenharia de Software 10
JEDITM
Especificação
Uma especificação é o artefato final ou produto do trabalho produzido pelo engenheiro de
software durante engenharia de requisitos. Serve como uma base para software subseqüente da
engenharia de atividades, particularmente, o desenho e a construção do software. Mostra os
aspectos informais, funcionais e de comportamento do sistema. Pode ser escrito como um
documento, um conjunto de modelos gráficos, um modelo matemático formal, um protótipo ou
qualquer combinação destes. Os modelos servem como suas especificações.
Validação
São avaliados os produtos de trabalho produzidos como conseqüência dos requisitos, acessados
para a qualidade durante o processo de validação. Examina a especificação para assegurar que
todas as exigências de software foram claramente declaradas e que foram descobertas
inconsistências, omissões, e erros foram corrigidos. Confere a conformidade e trabalha os padrões
de produtos estabelecidos no projeto de software.
A equipe de revisão que valida as exigências consiste em engenheiros de software, clientes,
usuários, e outros participantes do projeto. Procuram por erros em conteúdo ou interpretação,
áreas onde uma maior clareza é requerida, informação perdida, inconsistências, conflitos e
exigências irreais.
3.5. Gerência
É o conjunto das atividades que ajudam a equipe de projeto a identificar, controlar e traçar as
Engenharia de Software 11
JEDITM
exigências e suas mudanças em qualquer fase, enquanto o projeto progride. O gerenciamento das
exigências começa uma vez que estas são identificadas. A cada exigência é atribuído um
identificador único.
Uma vez que os requisitos tenham sido identificados, tabelas da Matriz de Rastreabilidade são
desenvolvidas.
Engenharia de Software 12
JEDITM
Glossário
Especificações dos Casos de Uso
Especificações Complementares
Contém aqueles requisitos que não mapeiam um caso de uso específico. Podem ser requisitos
não funcionais tais como: manutenção de códigos fonte, usabilidade, confiabilidade,
3 Object-oriented Analysis and Design Using the UML, Rational Rose Corporation, 2000, páginas 3-5
Engenharia de Software 13
JEDITM
Glossário
Define uma terminologia comum para todos os modelos. É usado pelos desenvolvedores para
estabelecer um dialeto comum com os clientes e usuários finais. Deve haver um único glossário
para todo o sistema.
O Modelo de Caso de Uso pode ser refinado com a utilização de estereótipos em associações e
generalização de atores e casos de uso. Na UML, estereótipos são elementos de modelagem
especiais que representam um elemento de forma particular. São representados por uma palavra-
chave envolta em chaves angulares (<< e >>) tais como <<extend>> e <<include>>.
Generalização ou especialização seguem os mesmos conceitos que foram discutidos na seção
Conceitos de orientação à objeto. A Tabela 3 mostra a notação estendida do Diagrama de Caso de
Uso em UML.
Notação Básica Nome Significado
Mostrar que um caso de uso provê uma funcionalidade
<<extend>> Extend
adicional que pode ser requerida por outro caso de uso.
Mostrar que quando um caso de uso é utilizado, outros
<<include>> Include
(incluídos) também serão utilizados.
Pode haver casos no qual seria melhor mostrar um super-
Generalização ator que comunica com um caso de uso em lugar de todos
os atores que comunicam com o mesmo caso de uso,
do Ator particularmente, quando todos eles interagirem com um
sistema de mesma funcionalidade.
Engenharia de Software 14
JEDITM
Engenharia de Software 15
JEDITM
Na segunda iteração, a elaboração é feita pela introdução do caso de uso Manutenção de Registro
de Atleta. Isto é gerenciado pelos funcionário s do clube. Estereótipos sobre associados são usados
para incluir ou estender este caso de uso.
O caso de uso Manutenção de Registro de Atleta é estendido para ter as seguintes opções:
• 1.1 Adicionar Regi stro de Atleta
Engenharia de Software 16
JEDITM
Engenharia de Software 17
JEDITM
O Diagrama de Atividades pode ser modificado para o Diagrama Swimlane. Neste diagrama,
atividades são alinhadas com base na responsabilidade dos atores para aquela atividade. A Figura
7 mostra o diagrama de atividades modificado, onde os atores responsáveis pela atividade são
grafados acima da atividade.
Engenharia de Software 18
JEDITM
Para auxiliar os engenheiros a definir o fluxo eventos, a lista de dicas é apresentada abaixo.
1. Para reforçar a responsabilidade do ator, inicie a descrição com “Quando o ator...”
2. Descrever a troca de dados entre o ator e o caso de uso.
3. Tentar não descrever os detalhes das interfaces, a menos que seja necessário.
4. Responda a todas as perguntas “porque”. Os designers utilizarão essas respostas para
identificar os Casos de Testes.
5. Evite terminologias tais como “Por exemplo,...”, “processo” e “informação”.
6. Descreva quando o caso de uso inicia e termina.
Passo 6: Refinar e Redefinir as especificações dos Casos de Uso
Similar ao desenvolvimento do Diagrama de Caso de Uso, pode-se refinar e redefinir suas
especificações. Isto também é feito iterativamente. O momento de interromper a iteração
depende da modelagem. O analista pode responder às perguntas presentes no Modelo de
Validação de Requisitos para determinar quando encerrar as atividades de refinar e redefinir as
especificações do caso de uso.
Engenharia de Software 19
JEDITM
Engenharia de Software 20
JEDITM
5. Especificação de Requisitos
Na seção anterior, o modelo de requisitos foi introduzido e discutido. Nessa seção, veremos o
modelo de análise que fornece um modelo base para as funções do software, o que irá ou não
fornecer. Esse é o ponto principal que será desenvolvido na fase de engenharia de requisitos, pois
serve de base para o projeto e construção do software. Aprenderemos como o modelo de análise
pode ser derivado do modelo de requisitos.
Modelo comportamental
Utiliza a criação de eventos ou o Diagramas de Interação da UML, consiste nos diagramas de
Seqüência e de Colaboração. Representa os aspectos dinâmicos do sistema. Isto mostra a
Engenharia de Software 21
JEDITM
Três perspectivas são utilizadas para identificar as classes de análise. São o limite entre o sistema
Engenharia de Software 22
JEDITM
Engenharia de Software 23
JEDITM
Engenharia de Software 24
JEDITM
Timmy:Atleta :Treinador
Objetos Objetos
Nomeados Anônimo
Pedro:Diretoria :SelecaoComite
Clube
Figura 13: Exemplo de Objetos
Objetos Nomeados são identificados colocando seus nomes antes do nome da classe; são
separados por dois-pontos (:). no diagrama, Timmy:Atleta é considerado um objeto nomeado.
Objetos anônimos não possuem nomes; para representá-los, colocamos dois-pontos antes do
nome da classe. :Treinador é um exemplo de objeto anônimo.
Mensagens são uma forma de comunicação entre objetos. Possuem o seguinte formato.
* [condição] : ação( lista de parâmetros ) : tipoValorRetorno
Tabela 6 mostra uma descrição de cada componente da mensagem. Somente o componente ação
é obrigatório.
[condição] Representar uma condição que deve ser verdadeira antes que uma
ação possa ser realizada.
ação(lista de parâmetros) Representar uma ação que deve ser realizada por um objeto. A ação,
opcionalmente, pode conter uma lista de parâmetros.
tipoValorRetorno Caso uma ação retornar um valor, precisamos especificar o tipo desse
valor.
Tabela 6: Componentes da Mensagem
1. s ubmitApplication()
Essa mensagem significa que uma aplicação foi submetida.
2. [athleteIsHere = ye s] playBa s eketball(athlete) : void
Essa mensagem significa que, se atleta está aqui no teste, ele joga basquetebol.
3. * [for each athlete] isAthleteHere(athlete) : boolean
Essa mensagem verifica, para cada atleta, se o atleta está aqui. Retorna SIM se ele estiver aqui;
caso contrário, retorna NÃO.
Engenharia de Software 25
JEDITM
mensagens sendo passadas de um objeto para outro. É usado para especificar interação de tempo
real e cenários complexos. Similar aos diagramas de caso de uso, há uma notação básica e uma
notação aprimorada. Figura 14 Mostra a notação básica do diagrama de seqüência.
Objeto Cliente Objeto Fornecedor
Bill:Client :Supplier
Object Lifeline
Mensagem Reflexiva
1*[condition]: Action
Esse é um exemplo
1.1[condition]: Action
Mensagem
Retorna Mensagem
Figura 14: Notação Básica do Diagrama de Seqüência
Objetos Cliente são diferenciados dos Objetos Fornecedor. Objetos Cliente são os objetos
enviando mensagens. São os que pedem um serviço para executar a ação especificada na
mensagem. Objetos Fornecedor são os receptores das mensagens; eles são requisitados para
executar a ação especificada pela mensagem. Objetos são dispostos horizontalmente. Cada objeto
deve ter uma linha de vida. Ela representa a existência do objeto em um instante em particular.
Uma mensagem é mostrada como uma linha horizontal com uma seta, a partir da linha de vida
de um objeto para a linha de vida de outro objeto. Uma mensagem reflexiva mostra uma seta
que começa e termina na mesma linha de vida. Cada seta é rotulada com um número seqüencial
e a mensagem. Uma mensagem de retorno é mostrada como uma linha horizontal pontilhada,
com a mensagem return opcionalmente seguida pelo valor de retorno.
Figura 15 mostra a notação aprimorada do Diagrama de Seqüência. Ela usa os conceitos de
criação e término de objeto, ativação e desativação de objeto, e mensagens customizadas.
Bill:Client Criação
1*[condition]: Action
Ativação :Supplier
Síncrona Timeout
Assíncrona
2 : return done
X
Desativação
Retorno Término
Colocando um objeto no topo do diagrama implica que o objeto existe antes do cenário iniciar. Se
um objeto é criado durante a execução do cenário, posicione o objeto no ponto em que ele foi
criado. Para mostrar que um objeto terminou, posicione um X no ponto onde o término ocorreu.
Para mostrar a ativação e a desativação de um objeto, usamos o foco de controle. Ele
representa o tempo relativo em que o fluxo de controle é focado no objeto, assim representar o
tempo de um objeto é direcionar mensagens. Isso é mostrado como um grande retângulo sobre a
linha de vida do objeto. O topo do retângulo indica quando um objeto se torna ativo; a parte de
Engenharia de Software 26
JEDITM
2. Desenhar uma linha tracejada vertical abaixo de cada objeto para representar a linha de vida
do objeto. A Figura 17 ilustra um exemplo;
Engenharia de Software 27
JEDITM
3. Desenhar as mensagens síncrona que ocorrem de um objeto para outro. Como regra,
nenhuma mensagem deve ser enviada entre o objeto fronteira e o objeto entidade. Devem
se comunicar indiretamente através do objeto de controle. Figura 18 mostra um exemplo.
Aqui, o objeto Club Staff entra com a informação do atleta e do guarda através do objeto de
fronteira AthleteRecordUI enviando as mensagens enterAthleteData() e enterGuardianData(). Para
dizer que um registro do atleta está salvo, o assistente do clube envia uma mensagem
submitAthleteRecord() para o objeto de controle AddAthlete. Essa classe, para seguir o fluxo,
envia uma mensagem, addAthlete(), para o objeto de entidade Athlete para que possa adicionar o
registro.
Engenharia de Software 28
JEDITM
Engenharia de Software 29
JEDITM
Este pode não ser o único diagrama de seqüência para o caso de uso Add Athlete Record. Outros
cenários para este Caso de Uso são: informações incompletas do atleta, informações incompletas
do responsável, recorde do atleta já existe, etc. Para cada cenário identificado, um diagrama de
seqüência correspondente é criado.
Engenharia de Software 30
JEDITM
Engenharia de Software 31
JEDITM
Este é o diagrama de colaboração do cenário realizado com sucesso para a inclusão de um Atleta
no Caso de Uso Incluir Atleta. Similar ao Diagrama de Seqüência, o Diagrama de Colaboração é
criado para cada seqüência que for identificada.
Passo 4: Para cada classe de análise resultante, identificar as responsabilidades.
Uma responsabilidade é algo que um objeto fornece a outros objetos ou atores. Pode ser uma
ação que o objeto pode realizar ou um conhecimento que um objeto pode conter e fornecer a
outros objetos. Pode ser derivado de mensagens obtidas de eventos ou diagramas de interação.
Nos diagramas de colaboração, as mensagens de entrada são a responsabilidade da classe. Para
se obter as responsabilidades das classes de análise do Caso de Uso Incluir Atleta, precisamos
utilizar os diagramas de colaboração. A Figura 27 mostra as responsabilidades das classes do
Caso de Uso Incluir Atleta utilizando diagramas de colaboração. Neste exemplo, as
responsabilidades são e n t e r At hl et e D at a (), e n t e r G u a r dia n D at a () e s u b mit At hl et e R e c o r d (). A
responsabilidade de A d d At hl et e é s a v e A t hl et e R e c o r d (). Finalmente, as responsabilidades de A t hl et e
são a d d A t hl et e (), e dit At hl et e (), d el et e A t hl et e () e U p d at e S t at u s ().
Engenharia de Software 32
JEDITM
Engenharia de Software 33
JEDITM
Engenharia de Software 34
JEDITM
Agregação é uma forma especial de associação que modela uma relação de parte-inteira entre um
agregado e sua parte. Algumas situações onde uma agregação é apropriada são:
• Um objeto é fisicamente composto de outros objetos.
• Um objeto é uma coleção lógica de outros objetos.
• Um objeto contém outros objetos fisicamente.
Agregação é modelada na Figura 30 que mostra uma outra maneira de modelar o atleta e sua
relação com o time. Um time é uma agregação de zero ou muitos atletas. O fim da ligação tem
um símbolo na forma de diamante que representa “partes” ou “componentes” do agregado ou
inteiro.
Multiplicidade é o número de objetos de uma classe que podem ser associados com um objeto de
outra classe. É indicado por uma expressão de texto na linha da associação. Responde às
seguintes perguntas:
• A associação é opcional ou obrigatória?
• Qual é o número mínimo e máximo de instâncias que podem se conectar a uma instância de
um objeto?
É possível que haja uma associação múltipla na mesma classe. Entretanto, devem representar o
relacionamento entre objetos, distintos, da mesma classe. As especificações da multiplicidades
são descritas na Tabela 8:
Multiplicidade Descrição
Não especificado. Utilizado quando não se conhece o número de exemplos
associados há um objeto.
Somente um. Utilizado quando um único objeto está associado a outro.
1
* Nenhum ou vários. Utilizado quando nenhum ou vários objetos estão associados
0..* com o outro. É chamada de associação opcional.
1..* Um ou vários. Utilizado quando um ou vários objetos estão associado com outro.
0..1 Nenhum ou um. Utilizado quando nenhum ou um objeto está associado com
outro. É conhecida, também, como associação imperativa.
Escala Especificada. Utilizado quando o número dos objetos tiver um tamanho
2-4
especifico.
2,4..6 Múltiplo, Deslocado.
Tabela 8: Especificações de Multiplicidade
Para ajudar na identificação das associações, as seguintes instruções podem ser seguidas:
1. Começar estudando as ligações nos diagramas de colaboração. Eles indicam que classes
necessitam comunicar-se;
2. Ligações reflexivas não necessariamente são instâncias de associações unárias. Um objeto
pode emitir uma mensagem para ele mesmo. O relacionamento unário é necessário
quando dois objetos da mesma classe necessitam comunicar-se;
3. Focar somente nas associações necessárias para compreender o caso do uso;
4. Dê nome às associações, porém não use verbos ou nomes de funções;
5. Faça uma breve descrição da associação para indicar como esta é usada, ou que
relacionamentos representa.
Engenharia de Software 35
JEDITM
Uma classe de fronteira AthleteRecordUI interage com apenas uma classe de controle AddAthlete.
Uma classe de controle AddAthlete interage com apenas uma classe de entidade Athlete. Um
Athlete tem apenas um Guardian e um Athlete Statu s . Um Athlete Statu s pode ser designado para
zero ou mais Athletes.
Passo 7: Unificar classes de análise em um diagrama de classe.
Unificar classes de análise significa assegurar que cada classe de análise represente conceitos
bem definidos, sem sobreposição de responsabilidades. É filtrar classes de análise para assegurar
que um número mínimo de conceitos sejam criados.
Para ajudar na unificação de classes de análise em um único diagrama de classe, as seguintes
linhas de direção podem ser usadas.
1. O nome da classe de análise deve capturar exatamente a função desempenhada pela classe
no sistema. Deve ser único, e duas classes não devem ter o mesmo nome.
2. Una classes que tenham um comportamento semelhante.
3. Una classes de entidade que tenham atributos similares, mesmo se seus comportamentos
definidos sejam diferentes; agregue os comportamentos das classes unificadas.
4. Quando uma classe é atualizada, qualquer documentação suplementar deve ser atualizada,
quando necessário. Algumas vezes, uma atualização nos requisitos originais pode ser
requerida. No entanto, isso deve ser controlado, pois os requisitos são o contrato com o
usuário/cliente, e quaisquer mudanças devem ser verificadas e controladas.
5. Avalie o resultado. Tenha certeza que:
• As classes de análise atendem aos requisitos funcionais encontrados no sistema
• As classes de análise e seus relacionamentos são consistentes com a colaboração que eles
Engenharia de Software 36
JEDITM
oferecem.
Observando o diagrama de classe unificado, atributos e responsabilidades foram refinados para
dar uma definição clara das classes. Lembre-se que classes de análise raramente sobrevivem
depois da fase de projeto. O principal foco nesse ponto é que dados (como os representados pelos
atributos) e as operações (como representado pelas responsabilidades) são representados e
distribuídos pelas classes. Serão reestruturados e refinados durante a fase de projeto. Use a Lista
de Validação que será discutido na seção seguinte para checar o Modelo de Análise. A Figura 32
mostra o diagrama de classe unificado de Cl u b M e m b e r s hi p M aint e n a n c e .
Fi g u ra 32 : Di a g r a m a d e C l a s s e d o Cl u b M e m b e r s hi p M ai nt e n a n c e
Engenharia de Software 37
JEDITM
Modelo do objeto
1. Todas as classes analisadas são classificas, identificadas, definidas e documentadas?
2. O número de classes é razoável?
3. A classe tem um nome indicativo de seu papel?
4. As classes abstratas estão bem definidas?
5. Todos os atributos e responsabilidades estão bem definidos nas classes? São acoplados
funcionalmente?
6. A classe pode ser requerida?
Modelo de Comportamento
1. Todos os cenários foram seguramente modelados? (Incluindo casos excepcionais)
2. A interação dos diagramas é clara?
3. Os relacionamentos são claros e consistentes?
4. As mensagens são bem definidas?
5. Todos os diagramas atendem às exigências?
Engenharia de Software 38
JEDITM
Enquanto os elementos acima são os iniciais da MRR, pode-se customizar a matriz para ligar os
requisitos com outros produtos do trabalho ou documentos. Esta é realmente onde a potência da
MRR é refletida. Pode-se adicionar outros elementos. Um exemplo é mostrado na Tabela 10.
Componente
Descrição
Adicional da MRR
MRR ID Especificar se o corrente MRR ID é direta ou indiretamente relacionado a outro
Relacionado requisito.
Descrever o que relaciona os requisitos diretamente a um parágrafo específico
dentro da Especificação de Trabalho (ET). Uma ET é um documento que
Especificação especifica a natureza do engajamento da equipe de desenvolvimento com seus
Trabalho (ET) clientes. Ela lista os produtos do trabalho e o critério que definirá a qualidade
dos produtos do trabalho. Ela ajuda a guiar a equipe de desenvolvimento na sua
abordagem para entrega dos requisitos.
Tabela 10: Componentes Adicionais da MRR
Engenharia de Software 39
JEDITM
Tabela 11: Exemplo Inicial da MRR (RTM - sigla em inglês) para a Manutenção dos Sócios do Clube
Engenharia de Software 40
JEDITM
7. Métrica de Requisitos
Medir requisitos focaliza-se geralmente em três áreas: processo, produto e recursos. Os requisitos
trabalham produtos que podem ser avaliados, olhando-se primeiro o número de requisitos. À
medida que cresce o número, obtemos uma indicação de como o projeto de software é grande . o
tamanho do requisito pode ser uma boa entrada para estimar o esforço de desenvolvimento de
programa. Também, como os progressos de desenvolvimento de software, o tamanho de requisito
pode ser capturado. Com o andamento do projeto e desenvolvimento, temos uma compreensão
mais profunda do problema e a solução que poderia levar a descoberta dos requisitos que não são
aparentes durante o processo de Engenharia de Requisitos.
Similarmente, pode-se medir o número de vezes que os requisitos mudaram. Um grande número
de mudanças indica um pouco de instabilidade e incerteza em nossa compreensão do que o
sistema deveria fazer ou como deveria se comportar. Em tal caso, os requisitos deveriam ser
completamente compreendidos e, possivelmente, repetir a fase de engenharia de requisitos.
Os requisitos podem ser usados pelos projetistas e testadores. Podem ser usados para determinar
se eles estão prontos para lhes ser entregues. O Teste de Perfil de Requisitos é uma técnica
empregada para determinar a prontidão em entregar os requisitos aos projetistas ou testadores4.
Taxa do Projeto
Descrição
de Sistema
Significa que o projeto corresponde completamente aos requisitos, e requisitos
1 similares foram solicitados em projetos anteriores. Logo, não terá problemas com
este projeto.
Significa que existem aspectos novos de requisitos ao projeto; entretanto, não
2 são radicalmente diferentes de requisitos de projetos concluídos com sucesso em
projetos anteriores.
Significa que há aspectos de requisitos que são muito diferentes dos requisitos
3 projetados anteriormente; entretanto, compreende-se e são confiáveis para
desenvolver um bom projeto.
Significa que há partes de requisitos que não são compreendidas; não são
4
confiáveis para o desenvolvimento de um bom projeto.
Taxa de teste
Descrição
do sistema
Significa que os requisitos foram compreendidos completamente, e que já foram
1 testados requisitos similares em projetos anteriores; é provável que não existirão
problemas em testar o código.
Significa que existem alguns aspectos dos requisitos são novos ao projeto;
2 entretanto, não são radicalmente diferentes dos requisitos testadas com sucesso em
projetos anteriores.
Significa que alguns aspectos dos requisitos são muito diferentes dos requisitos
3
testados anteriormente; entretanto, compreende-se e é confiável testá-los.
Engenharia de Software 41
JEDITM
Taxa de teste
Descrição
do sistema
Significa que existe alguns aspectos dos requisitos que não são compreensíveis;
4
não é confiável que se planeje um teste para este requisito.
5 Significa que este requisito não é compreensível e não pode ser desenvolvido.
Engenharia de Software 42
JEDITM
8. Exercícios
8.1. Criar o Modelo de Exigências
1. Criar um Modelo de Exigências do Sistema de Informação Técnica
• Desenvolver os Diagramas de Caso de Uso
• Para cada Caso de Uso, desenvolver a Especificação do Caso de Uso
• Criar o Glossário
2. Criar um Modelo de Exigências do Sistema de Manutenção Squad & Team
• Desenvolver os Diagramas de Caso de Uso
• Para cada caso de uso, desenvolver a Especificação do Caso de Uso
• Criar o Glossário
Engenharia de Software 43
Módulo 4
Engenharia de Software
Lição 4
Engenharia de Projetos
1. Objetivos
Exigências distintas de engenharia que criam modelos com foco na descrição de dados, função e
comportamento, engenharia de projeto focada na criação de representações ou modelos que
estão concentrados na arquitetura do software, estrutura de dados, interfaces e componentes que
são necessários para implementação do software. Neste capitulo iremos aprender os conceitos e
princípios dos projetos, projetos de dados, projetos de interface, projetos de nível de
componentes. Iremos aprender quais elementos do RTM são modificados e adicionados para
localizar produtos de trabalho através de requerimentos. A métrica de projetos também será
discutida.
Ao final desta lição, o estudante será capaz de:
• Aprender os conceitos e dinâmicas da engenharia de projeto
• Aprender a como desenhar a arquitetura de um software
• Aprender como desenvolver o modelo de dados
• Aprender a como desenhar interface, particularmente, as telas e diálogos
• Aprender a como projetar os componentes de um software
• Aprender a como utilizar os requisitos de rastreamento
• Aprender sobre as Métricas de Projeto
Engenharia de Software 4
JEDITM
Os conceitos de projeto fornecem ao engenheiro de software uma base na qual podem ser
aplicados métodos de projeto. Provê um ambiente de trabalho (framework) necessário para
criação de certos produtos do trabalho.
2.1.1. Abstração
Quando projetamos um sistema modular, muitos níveis de abstração são usados. Como
engenheiros de software, definimos níveis diferentes de abstrações quando projetamos este
documento sobre software. No nível mais alto de abstração, declaramos uma solução que usa
termos abrangentes. Quando interagimos em um nível mais baixo de abstração, é definida uma
Engenharia de Software 5
JEDITM
descrição detalhada. São criados dois tipos de abstrações, isto é, de dados e processuais.
Abstração de dados se refere a coleções de dados que descrevem a informação requerida pelo
sistema.
Abstração processual se refere a seqüências de comandos ou instruções que estão limitadas a
ações específicas.
2.1.2. Modularidade
Modularidade é a característica do software que permite o gerenciamento do desenvolvimento e
manutenção. O software é decomposto em pedaços chamados de módulos. Possuem nomes e
componentes endereçáveis que, quando unidos, trabalham juntos satisfazendo requisitos.
Projetos são modularizados de forma que podemos facilmente desenvolver um plano de
incremento do software, acomodando facilmente as alterações testes e depuração efetiva e
manutenção do sistema com pequenos efeitos colaterais. Em aproximação a orientação a objetos
eles são chamados de classes.
Modularidade conduz a ocultar informação. Informações que escondem meios, que escondem
os detalhes do módulo (atributos e operações) ou classificam de tudo outros que não têm
nenhuma necessidade por tal informação. Módulos ou classes se comunicam com interfaces,
mas , obrigam o acesso aos dados através de processos. Isto limita ou controla a propagação das
mudanças, ocorrência de erros quando terminamos as modificações nos módulos ou classes.
Modularidade sempre leva a independência funcional. Independência funcional é a
característica dos módulos ou classes que endereçam a funções específicas definidas pelos
requisitos. É alcançada definindo-se módulos que fazem uma única tarefa ou função e têm
justamente uma interação com outros módulos. Bons projetos usam dois critérios importantes:
coesão e acoplamento.
Acoplamento é o grau de interconectividade entre os objetos representado pelo número de
ligações que um objeto tem e pelo grau de interação com os outros objetos. Para a orientação a
objetos, dois tipos de acoplamento são utilizados.
1. Acoplamento por Interação é a medida do número de tipos de mensagem que um objeto
envia a outro objeto, e o número de parâmetros passado com estes tipos de mensagem. Um
bom acoplamento por interação é conseguido com um mínimo possível para evitar mudança
através da interface.
2. Acoplamento por Herança é o grau que uma subclasse de fato necessita das
características (atributos e operações) herdadas da sua classe base. Um número mínimo de
atributos e operações que são herdados desnecessariamente.
Coesão é a medida com que um elemento (atributo, operação ou classe dentro de um pacote)
contribui para um único propósito. Para projetos orientados a objetos, são utilizados três tipos de
coesão.
1. Coesão de operações é o grau que uma operação enfoca um único requisito funcional. O
bom projetista produz operações altamente coesas.
2. Coesão de classes é o grau que uma classe enfoca um único requisito.
3. Coesão especializada endereça a semântica coesão de herança. A definição de herança
deve refletir verdadeiramente o melhor compartilhamento sintático da estrutura.
2.1.3. Refinamento
Refinamento é também conhecido como o processo de elaboração. O refinamento da
completa abstração permite à engenharia de software especificar o comportamento e os dados de
uma classe ou módulo, contudo, suprime o detalhamento de níveis baixos. Isto ajuda a
engenharia de software a criar um completo modelo evolutivo do projeto. O refinamento auxilia a
engenharia de software a descobrir detalhes no avanço do desenvolvimento.
Engenharia de Software 6
JEDITM
2.1.4. Refatoramento
Refatoramento é a técnica que simplifica o projeto dos componente sem várias das
funcionalidades e comportamentos. Este é um processo de variação de software de modo que o
comportamento externo fica o mesmo e a estrutura interna é melhorada. Durante a refatoração, o
modelo de projeto é checado em busca de redundâncias, elementos de projeto não utilizados,
ineficiência ou algoritmos desnecessários, mal construção ou estruturas de dados inadequadas ou
um outro projeto falho. Estes são corrigidas para produzir um melhor projeto.
Engenharia de Software 7
JEDITM
3. Arquitetura de Software
Não existe uma definição geral aceita para o termo Arquitetura de Software. É interpretado
diferentemente em relação ao contexto. Alguns podem descrever em termos de estruturas de
classes pelo modo que são agrupados. Outros costumam descrever toda organização de um
sistema em um subsistema. Buschmann define da seguinte forma:
“A arquitetura de software descreve um subsistema e os componentes de um software e as
relações entre eles. Subsistemas e componentes são tipicamente especificados de diferentes
visões para mostrar as propriedades funcionais e não funcionais de um sistema. A arquitetura de
software de um sistema é um artefato. Sendo o resultado da atividade de projeto do software”.
Esta definição é discutida neste capítulo. A arquitetura de software é uma camada estruturada
dos componentes de software e pela maneira ao qual estes componentes interagem, bem como a
estrutura de dados utilizada por estes componentes. Isso envolve tomar decisões em como a
aplicação é construída e, normalmente, controla o desenvolvimento iterativo e incremental.
Definir a arquitetura é importante por diversas razões. Primeiro, a representação da arquitetura
de software permite a comunicação entre os envolvidos (usuários finais e desenvolvedores).
Segundo, permite projetar as decisões que terão um efeito significativo em todo produto do
trabalho da engenharia de software referente à interoperabilidade da aplicação. Por último,
fornecem uma visão intelectual de como o sistema é estruturado e como os componentes
trabalham em conjunto.
É modelado usando um Diagrama de Pacote da UML. Um pacote é um elemento de modelo que
pode conter outros elementos. Também é um mecanismo utilizado para organizar os elementos
do projeto e permitir que os componentes de software possam ser modularizados.
Pacote Representação de
Classe
Representação
Canônica
Figura 1: Notação Básica para o Diagrama de Pacote
Engenharia de Software 8
JEDITM
<<subsistema>>
Subsistema A
Classe A1 Classe A2
Interface
x() w()
x()
w()
<<subsistema>>
Subsistema B
Classe B1 Classe B2 Classe B3
Conforme mostrado na Figura 2, uma interface é composta por um ou mais subsistemas. Este é o
segredo de ter componentes plug-and-play. A implementação do subsistema pode mudar sem
mudar drasticamente outros subsistemas, desde que a definição da interface não mude.
Cada subsistema provê serviços para outros subsistemas. Há dois estilos de uso de subsistemas
de comunicação; eles são conhecidos como comunicação cliente-servidor e comunicação ponto-
Engenharia de Software 9
JEDITM
Layer n Layer n
Layer n-1 Layer n-1
... ...
Layer 2 Layer 2
Layer 1 Layer 1
Open Architecture Closed Architecture
Figura 4: Estruturas Gerais da Camada de Arquitetura
Cada camada da arquitetura representa um ou mais subsistemas que podem diferenciar-se entre
si pelos diferentes níveis de abstração ou por abordagem diferente de sua funcionalidade. A
camada superior solicita serviços da camada inferior a ela. Essas camadas, por sua vez, podem
utilizar serviços da próxima camada. Em uma Arquitetura em Camadas Abertas, subsistemas
podem requisitar serviços de camadas abaixo. Para Arquitetura em Camadas Fechadas,
camadas requisitam serviços de camadas diretamente abaixo delas e não podem pular camadas.
Arquitetura em Camadas Fechadas minimiza dependências entre camadas e reduz o impacto
da mudança de interface de qualquer camada. Arquitetura em Camadas Abertas possibilita um
desenvolvimento de códigos mais compactos pois serviços de todas as camadas de baixo nível são
Engenharia de Software 10
JEDITM
acessados diretamente por qualquer camada acima sem necessidade de programação de código
extra para passagem de mensagens através de camadas intervenientes. Por outro lado, há uma
quebra no encapsulamento das camadas, aumentando as dependências entre as camadas e a
dificuldade de alteração quando uma camada precisar ser modificada.
Algumas camadas, dentro de uma arquitetura de camadas, podem ser decompostas por causa de
sua complexidade. O particionamento é obrigatório na definição dos componentes decompostos.
Como exemplo, considere a Figura 5.
Athlete HCI Maintenance Athlete HCI Find
subsystem subsystem
Athlete Maintenance Athlete Find
subsystem subsystem
Athlete Domain
Athlete Database
Engenharia de Software 11
JEDITM
Firewall
JNDI,
Cliente Web Container JMS,
JavaMail Enteprise
(Servlets, JSP
Pages, HTML, Information
XML) Systems
Cliente
(RDBMS,
Enterprise JavaBean ERP,
Cliente (EJB) Legacy
Container Applications)
(Session Bean,
Entity Bean,
Cliente Message-drive Bean)
Engenharia de Software 12
JEDITM
Visibilidade Descrição
dos Símbolos
+ Representa um elemento do modelo público que pode ser acessado fora do pacote.
Representa um elemento do modelo privado que não pode ser acessado fora do
-
pacote.
Representa elementos do modelo protegido que pode ser acessado através do
#
proprietário do elemento do modelo ou através da herança.
Tabela 1: Visibilidade dos Símbolos do Pacote
Engenharia de Software 13
JEDITM
Acoplamento de Pacote define de que modo dependências são definidas entre pacotes. Devem
aderia às mesmas regras.
1. Pacotes não podem ser acoplado em cruz
2. Pacotes em camadas inferiores não devem ser dependente de pacotes de uma camada
superior. Camadas serão discutida em um dos passos.
3. Em geral, pacotes não devem pular camadas. Entretanto, exceções podem ser feitas e
devem ser documentadas.
4. Pacotes não devem ser dependente de subsistemas. Eles devem ser dependentes de outros
pacotes ou de interfaces de subsistema.
A decisão de empacotamento para o Sistema de Manutenção de Sócios do Clube é ilustrada
na Figura 8.
Engenharia de Software 14
JEDITM
Engenharia de Software 15
JEDITM
Apresentação
Lógica de Negócio
Base de Dados
Figura 10: Arquitetura em Três Camadas
Há muitos estilos e padrões de arquitetura que são mais complexos e detalhados do que a
simples arquitetura de três camadas. Normalmente, são projetados baseando-se nas exigências
tecnológicas, tais como, o sistema a que será distribuído/utilizado, se o sistema suporta a
simultaneidade, se o sistema está considerando uma aplicação baseada na WEB. Para simplificar,
este estudo de caso usa a arquitetura de três camadas. Quando as classes dentro das camadas
são elaboradas, há chances de camadas e pacotes adicionais serem usados, definidos e refinados.
Os tópicos a seguir são um guia prático para definir as camadas de uma arquitetura:
1. Considere a visibilidade. As dependências entre classes e subsistema ocorrem somente
dentro da camada atual e da camada diretamente abaixo dela. Passando disto, a
dependência deve ser justificada e documentada;
2. Considere a volatilidade. Normalmente, as camadas superiores são afetadas por mudanças
Engenharia de Software 16
JEDITM
nas exigências, enquanto as camadas mais baixas são afetadas pela mudança do ambiente e
da tecnologia;
3. Número de camadas. Os sistemas pequenos devem ter 3 ou 4 camadas, enquanto sistemas
maiores devem ter de 5 a 7 camadas.
Para o Sistema de Manutenção dos Sócios do Clube, as camadas são descritas na Figura 11.
Observe que as classes de análise que estão identificadas como subsistemas são substituídos por
uma definição de interface do subsistema. Para esclarecimento, a realização da interface não é
demonstrada.
Como qualquer outro produto de trabalho, a Arquitetura do Software deve ser validada. Use as
seguintes perguntas como um checklist.
Camadas:
1. Para sistemas menores, há mais de quatro camadas?
2. Para sistemas maiores, há mais de sete camadas?
Subsistemas e Interfaces:
1. A divisão dos subsistemas está feita de maneira lógica e consistente através da arquitetura
do software?
2. O nome da interface descreve o papel do subsistema dentro do sistema principal?
3. A descrição da interface é concisa e clara?
4. Todas as operações que o subsistema necessita para executar estão identificadas? Há
alguma operação ausente?
Pacotes
1. Os nomes dos pacotes estão descritivos?
2. A descrição dos pacotes combina com suas responsabilidades?
Engenharia de Software 17
JEDITM
4. Padrões de Projeto
Padrões de projeto (Design Patterns) descrevem soluções comprovadas para problemas
recorrentes. Isto alavanca o conhecimento e o entendimento de outros desenvolvedores. Eles são
soluções reusáveis para problemas comuns. Endereçam problemas individuais mas podem ser
combinados de diferentes formas para obter uma solução integrada para um sistema inteiro.
Padrões de projeto não são frameworks. Frameworks são sistemas de software parcialmente
completos que podem ser utilizados em um tipo específico de aplicação. Um sistema aplicativo
pode ser customizado para as necessidades da organização pela complementação dos elementos
incompletos e adição de elementos específicos da aplicação. Isso envolveria a especialização de
classes e a implementação de algumas operações. É, essencialmente, uma mini-arquitetura
reusável que provê uma estrutura e um comportamento comum a todas as aplicações deste tipo.
Padrões de projeto, por outro lado, são mais abstratos e gerais do que os frameworks. São uma
descrição do modo que um problema pode ser resolvido, mas não é, em si, a solução. Não pode
ser diretamente implementado; uma implementação exitosa é um exemplo de um padrão de
projeto. É mais primitivo do que um framework. Um framework pode usar vários padrões; um
padrão não pode incorporar um framework.
Padrões podem ser documentados usando-se vários templates alternativos. O template padrão
determina o estilo e estrutura da descrição do padrão, e este varia na ênfase que eles colocam
sobre diferente aspectos do padrão. Em geral, uma descrição de padrão inclui os seguintes
elementos:
1. Nome. O nome de um padrão deve ser significativo e refletir o conhecimento incorporado
pelo padrão. Pode ser uma simples palavra ou uma frase curta.
2. Contexto. O contexto de um padrão representa as circunstâncias ou pré-condições sob as
quais ele pode ocorrer. Deve ser bastante detalhado para permitir que a aplicabilidade do
padrão seja determinada.
3. Problema. Provê uma descrição do problema que o padrão endereça. Identifica e descreve
os objetivos a ser alcançados dentro de um específico contexto e forças restritivas.
4. Solução. É a descrição dos relacionamentos estático e dinâmico entre os componentes do
padrão. A estrutura, os participantes e suas colaborações são todas descritas. Uma solução
deve resolver todas as forças em um dado contexto. Uma solução que não resolve todas as
forças, é falha.
O uso de padrões de projeto requer uma cuidadosa análise do problema que deve ser resolvido e
o contexto no qual ele ocorre. Todos os participantes da equipe de desenvolvimento devem
receber treinamento adequado. Quando um projetista está contemplando o uso de padrões de
projeto, certos itens devem ser considerados. As seguintes questões provêem um guia para
resolver estes itens.
1. Existe um padrão que endereça um problema similar?
2. O padrão dispara uma solução alternativa que pode ser mais aceitável?
3. Existe uma outra solução mais simples? Não devem os padrões ser usados apenas porque
foram criados?
4. O contexto do padrão consistente com aquele do problema?
5. As conseqüências de uso do padrão são aceitáveis?
6. As restrições impostas pelo ambiente de software conflitariam com o uso do padrão? Como
usamos o padrão?
Os seguintes passos fornecem um guia para o uso de um padrão de projeto selecionado.
1. Para obter uma visão geral completa, leia o padrão.
2. Estude a estrutura, os participantes e as colaborações do padrão em detalhe.
3. Examine as amostras de código para ver o padrão em uso.
Engenharia de Software 18
JEDITM
4. Nomeie os participantes do padrão (isto é, Classes) que são mais significativas para a
aplicação.
5. Defina as classes.
6. Escolha nomes específicos da aplicação para as operações.
7. Codifique ou implemente as operações que desempenham responsabilidades e colaborações
dentro do padrão.
É importante notar neste momento que um padrão não é uma solução prescritiva para o
problema. Ele deve ser visto como um guia sobre como encontrar uma solução adequada para um
problema.
Como um exemplo, existe um conjunto de padrões de projeto comuns para a plataforma J2EE.
Este seção discute de forma abreviada alguns deste padrões. Para encontrar mais sobre Padrões
de Projeto para J2EE, é possível verificar neste endereço WEB:
http://java.sun.com/blueprints/patterns/index.html
4.1.1. Contexto
O Padrão Composite View permite o desenvolvimento de uma visão mais gerenciável através da
criação de um template para manusear os elementos de página comuns de uma visão. Para uma
aplicação web, uma página contém uma combinação de conteúdos dinâmicos e elementos
estáticos tais como cabeçalho, rodapé, logomarca, background e assim por diante. O template
captura as características comuns.
4.1.2. Problema
Dificuldade de modificar e gerenciar o layout de múltiplas visões devido à duplicação de código.
Páginas são construídas usando código de formatação diretamente sobre cada visão.
4.1.3. Solução
Use este padrão quando uma visão é composta de múltiplas sub-visões. Cada componente do
template pode ser incluído dentro do todo e o layout da página pode ser gerenciado
independentemente do conteúdo. Esta solução prove a criação de uma visão composta através da
inclusão e substituição de componentes dinâmicos modulares.
Ele promove a reusabilidade de porções atômicas da visão pelo encorajamento de um projeto
modular. É usado para gerar páginas contendo a visualização dos componentes que podem ser
combinados numa variedade de modos. Este cenário ocorre para uma página que mostra
diferentes informações ao mesmo tempo, tal como as encontradas em home pages de muitos
endereços na web, onde é possível encontrar notícias, informações sobre o tempo, cotações de
ações, etc.
Um benefício de usar este padrão é que o projetista da interface pode prototipar o layout da
página, conectando conteúdo estático em cada componente durante o desenvolvimento do
projeto.
Um benefício do uso deste padrão é que o projetista de interfaces pode desenvolver o protótipo
do layout da página adicionando conteúdos estáticos em cada componente. Com o progresso do
desenvolvimento do projeto, o conteúdo estático é substituído pelas sub-visões (subview)
atômicas.
Este padrão tem um inconveniente. Há uma sobrecarga (overhead) associada a ela. É um meio
termo entre flexibilidade e performance. Figura 12 mostra um exemplo de um layout de página. A
página consiste das seguintes visões (views).
Engenharia de Software 19
JEDITM
Este formulário pode ser uma tela web da aplicação e é definida no arquivo a seguir:
<screen name= main >
<parameter key= banner value= /cabecalho.jsp />
<parameter key= footer value= /rodape.jsp />
<parameter key= sidebar value= /barraLateral.jsp />
<parameter key= body value= /conteudo.jsp />
</screen>
A Figura 13 mostra o diagrama de classes que representa o padrão enquanto a Figura 14 mostra
a colaboração das classes.
Engenharia de Software 20
JEDITM
Classe Descrição
visão.
IncludedView É uma sub-visão, uma porção atômica de uma visão maior e mais completa. Esta
visão (includeView) pode consistir em várias visões.
Tabela 2: Classes do Padrão Composite View
4.2.1. Contexto
O padrão Front Controller provê um controlador centralizado para administrar pedidos. Recebe
todo o cliente que chega com um requisito, envia cada pedido para um manipulador de pedido
apropriado e apresenta uma resposta apropriada para o cliente.
4.2.2. Problema
O sistema precisa de um ponto de acesso centralizado para manipulação do pedido na camada de
apresentação e apoiar a integração de recuperação de dados do sistema, administração da visão e
navegação. Quando alguém tiver o acesso à visão, diretamente, e sem passar por um
manipulador de pedido centralizado, podem acontecer problemas como:
• Cada visão pode prover seu próprio serviço de sistema que pode resultar em duplicação de
código.
• A navegação de visão é de responsabilidade da camada de visão e pode resultar em conflito
com o conteúdo e a navegação de visão.
Adicionalmente, controle distribuído é mais difícil manter pois freqüentemente serão feitas
mudanças em lugares diferentes no software.
4.2.3. Solução
Um controlador é utilizado como um ponto de contato inicial para controlar um pedido. É usado
para administrar a manipulação de serviços como invocar serviços de segurança para
autenticação e autorização, enquanto delega o processo empresarial, administrando a visão
apropriada, controlando erros e administrando a seleção de estratégias de criação de conteúdo.
Centraliza os controles de decisão e construção. São mostrados os Dagrama de Classe e
Seqüência para este padrão na Figura 15 e Figura 16.
Engenharia de Software 21
JEDITM
Class Description
Controller É o ponto de contato inicial para controlar todos os pedidos no sistema. Pode delegar
um objeto de Helper.
Dispatcher É responsável pela administração da visão e navegação, administra a escolha da
próxima visão para apresentar ao usuário e o mecanismo para vetorização controlada
como um recurso. Pode ser encapsulado dentro de um controlador ou um componente
separado que trabalha em coordenação com o controlador. Usa o objeto
RequestDispatcher e encapsula alguns métodos adicionais.
Helper É responsável por auxiliar uma visão ou o controlador completa do processo. Possui
numerosas responsabilidades que incluem junção de dados requeridos pela visão e
armazenando de dados no modelo intermediário.
View Representa e exibe informação ao cliente.
Tabela 3: Classes do padrão Front Controller
Como exemplo de implementação de um Front Controller, um servlet pode ser utilizado para
representar o controlador. Um trecho do código é mostrado abaixo. No método
processRequest(), um objeto do tipo RequestHelper (Helper) é utilizado para executar o
comando que representa a requisição do cliente. Depois do comando ser executado, um objeto
RequestDispatcher é utilizado para se obter a próxima visão.
catch (Exception e) {
request.setAttribute(resource.getMessageAttr(), "Exception occurred: " +
e.getMessage());
page=resource.getErrorPage(e);
}
// Seqüência da Mensagem 2 no exemplo do Diagrama de Seqüência.
// Envia o controle para a visão
dispatch(request, response, page);
...
...
private void dispatch(HttpServletRequest request,
HttpServletResponse response, String page) throws
javax.servlet.ServletException, java.io.IOException {
RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher(page);
dispatcher.forward(request,response);
}
}
4.3.1. Contexto
O Padrão de Projeto Data Access Object (DAO) separa a interface cliente de seu mecanismo de
acesso a dados. Ele adapta o acesso a um recurso de dados específico a uma interface cliente
genérica. Ele permite trocar o mecanismo de acesso a dados independentemente do código que
os utiliza.
4.3.2. Problema
Os dados podem ser provenientes de diferentes mecanismos de acesso tais como bancos de
dados relacionais, mainframe ou sistemas legados, serviços externos B2B, LDAP, etc. Este
mecanismo pode variar dependendo do tipo de armazenamento. Permite manutenibilidade do
código através da separação do mecanismo de acesso das camadas de visão e processamento.
Quando o tipo de armazenamento muda, basta mudar o código que especifica o mecanismo de
acesso.
Engenharia de Software 22
JEDITM
4.3.3. Solução
Utilizar o padrão Data Access Object para abstrair e encapsular todo o acesso a fonte de dados.
Deve ser implementado o mecanismo de acesso necessário para manipular a fonte de dados. A
fonte de dados pode ser um sistema de banco dados relacional, um serviço externo como B2B,
um repositório LDAP etc.
O diagrama de classes deste padrão é descrito na Figura 17.
Figura 17: Diagrama de Classes para o padrão Data Access Object (DAO)
Classe Descrição
Business Object Representa os dados do cliente. É o objeto que requer acesso à fonte de dados
para obter e armazenar os dados.
DataAccessObject É o objeto primário deste padrão. Ele abstrai a implementação de acesso aos
dados para os BusinessObjects, e assim deixa o acesso transparente à fonte de
dados.
DataSource Representa a fonte de dados que pode ser um RDBMS, OODBMS, arquivo XML ou
um arquivo texto. Pode também ser outro sistema (legado ou mainframe),
serviço B2B ou um repositório LDAP.
TransferObject Representa o transportador dos dados. É utilizado para retornar os dados para o
cliente ou o cliente pode utilizá-lo para atualizar os dados na fonte de dados.
Tabela 4: Classes do Padrão de Projeto Data Access Object (DAO)
Engenharia de Software 23
JEDITM
Figura 18: Objeto de Acesso a Dados (Data Access Object - DAO) Diagrama de Seqüência
A visão dinâmica mostra as interações entre as classes que compõem esse padrão.
Especificamente, quatro interações podem ser observadas no diagrama acima. As interações
estão listadas abaixo.
1. Um BusinessObject precisa criar um DataAccessObject para um determinado DataSource.
Isto é necessário para recuperar ou armazenar dados do negócio. No diagrama, é a
mensagem número 1.
2. Um BusinessObject deve requisitar a recuperação de dados. Isto é feito através do envio de
uma mensagem getData() para o DataAccessObject o qual, deverá requisitar a fonte de
dados (data source). Um TransferObject é criado para manter os dados recuperados do
DataSource. No diagrama, é representado pela mensagem número 2 e suas sub-mensagens.
3. Um BusinessObject deve modificar o conteúdo do TransferObject. Isto simula a modificação
dos dados. No entanto, os dados ainda não são modificados na fonte de dados. Isso é
representado pelas mensagens número 3 e 4.
4. Para salvar dados na fonte de dados, uma mensagem setData() deve ser enviada para o
DataAccessObject. O DataAccessObject recupera os dados do TransferObject e prepara-o
para ser atualizado. Apenas agora, ele irá enviar a mensagem setData() para a DataSource
atualizar seus registros.
Engenharia de Software 24
JEDITM
Neste digrama de classees, DAOFactory é uma abstração de um objeto Data Access Factory que é
herdado e implementado por diferentes DAOFactories para suportar o acesso de armazenamento
específico da implementação. Os DAOFactories concretos criam objetos de acesso a dados que
implementam as interfaces de objetos data access.
Um exemplo de uma implementação de uma DAOFactory é mostrado através dos códigos abaixo.
O primeiro código mostra a definição de uma classe abstrata DAOFactory.
public abstract class DAOFactory {
//Lista de tipos DAO
public static final int DEFAULT = 1;
public static final int MYSQL = 2;
public static final int XML = 3;
...
...
// As fábricas concretas devem implementar estes métodos.
public abstract AthleteDAO getAthleteDAO();
public abstract AthleteStatusDAO getAthleteStatusDAO();
...
...
public static DAOFactory getDAOFactory(int whichFactory) {
switch(whichFactory) {
case DEFAULT: return new DefaultDAOFactory();
case MYSQL: return new MySQLDAOFactory();
case XML: return new XMLDAOFactory();
...
default: return null;
}
}
}
Cada um dos tipos identificados de DAO deve ser implementado. Neste exemplo, o
DefaultDAOFactory é implementado; o outro é similar à exceção dos recursos específicos de cada
implementação tais como drivers, database URL etc.
// Implementação padrão do DAOFactory
import java.sql.*;
Engenharia de Software 25
JEDITM
O objeto de transferência Athlete é implementado usando o seguinte código. É utilizado pelo DAO
para emitir e receber dados da base de dados.
public class Athlete {
private int athleteID;
private String lastName;
private String firstName;
// Outros atributos de atleta inclui Guardian
Engenharia de Software 26
JEDITM
Uma parte do código do cliente que mostra o uso de um objeto de uma classe é mostrada abaixo.
...
...
// cria a DAO Factory necessária
DAOFactory dFactory = DAOFactory.getDAOFactory(DAOFactory.DEFAULT);
// Cria a AthleteDAO
AthleteDAO = athDAO = dFactory.getAthleteDAO();
...
// Insere um novo atleta
// Assume que atleta é uma instância de AthleteTransferObject
int status = athDAO.insertAthlete(ath);
4.4. Model-View-Controller
4.4.1. Problema
As aplicações corporativas precisam suportar múltiplos tipos de usuário através de vários tipos de
interfaces. Para uma aplicação isto requer um HTML a partir de cada cliente WEB, um WML para
cada cliente wireless, uma Interface Java Swing para os administradores e um serviço baseado
em XML para os fornecedores. Isto exige que o padrão obedeça o que segue abaixo:
• Os mesmos dados corporativos precisam ser acessados por diferentes visões.
• Os mesmos dados corporativos precisam ser atualizados através de diferentes interações.
• O suporte a múltiplos tipos de visões e interações não devem causar impacto nos
componentes que integram o núcleo da funcionalidade da aplicação da empresa.
4.4.2. Contexto
A atual aplicação apresenta conteúdo aos usuários em numerosas páginas contendo vários dados.
4.4.3. Solução
O Model-View-Controller (MVC) é um padrão de projeto amplamente utilizado para aplicações
interativas. Ele divide funcionalidade entre objetos envolvidos na manutenção e apresentação de
dados para minimizar o grau de acoplamento entre estes objetos. É dividido em três partes
chamadas model (modelo), view (visão) e controller (controle).
1. Model (modelo). Representa os dados corporativos e as regras de negócio que governam o
acesso e a alteração a estes dados. Serve como um software aproximador do processo no
mundo real, isto é, como aplicação das técnicas de modelagem para simplificar o mundo real
quando da definição do modelo.
2. View (visão). Traduz o conteúdo de um modelo. Acessa os dados corporativos através do
modelo e especifica como estes dados são apresentados aos atores. É responsável pela
manutenção da consistência em sua apresentação quando há alterações no modelo em
espera. Ele pode ser acionado através do modelo push, onde as visões registram a si
próprias no modelo para as notificações de alterações, ou do modelo pull, onde a visão é
responsável por chamar o modelo quando se faz necessário a recuperação do dado atual.
3. Controller (controlador). Traduz interações com a visão dentro das ações executadas pelo
model (modelo). Em uma GUI de um cliente stand-alone aparecem para poder controlar os
Engenharia de Software 27
JEDITM
Ações do Usuário
Seleciona Visão
Mudança de Estado
CONTROLADOR
Engenharia de Software 28
JEDITM
5. Projeto de Dados
Também conhecido como arquitetura de dados, é uma tarefa de engenharia de software que
cria um modelo dos dados em uma representação mais próxima da implementação. As técnicas
usadas aqui se aproximam do campo de estudo de análise e projeto de banco de dados,
normalmente discutida em um curso de banco de dados. Não discutiremos como fazer análise,
projeto e implementação de bancos de dados. Para este curso, assumiremos que o banco de
dados foi implementado usando o sistema relacional. O projeto lógico do banco de dados é
ilustrado usando o diagrama de classes da Figura 22.
Para o Sistema de Manutenção de Sócios do Clube, três tabelas foram definidas. A tabela
Atleta contém os dados do atleta. A tabela Responsável (Guardian) contém os dados referentes
ao responsável pelo atleta. Para simplificar, assume-se que só existe um responsável por atleta. A
tabela StatusAtleta contém o esquema de códigos para o status do atleta.
Para acessar os dados em um sistema de banco de dados, nossos programas devem ser capazes
de se conectar ao servidor de banco de dados. Esta seção discute o conceito de persistência e
ensina como modelar classes de persistência. Em termos da nossa arquitetura de software, outra
camada, a camada de persistência, é criada sobre a camada de banco de dados.
Persistência significa fazer que um elemento exista mesmo após a finalização da aplicação que o
criou. Para classes que precisam gerar objetos persistentes, precisamos identificar:
• Granularidade. É o tamanho do objeto persistente.
• Volume. É o número de objetos para manter persistente.
• Duração. Define quanto tempo manter o objeto persistente.
• Mecanismo de Acesso. Define se o objeto é mais ou menos constante, isto é, se
permitimos modificações ou atualizações.
• Confiança. Define como o objeto sobreviverá se um erro acontecer.
Engenharia de Software 29
JEDITM
Há muitos padrões de desenho que podem ser utilizados para modelar a persistência. Serão
discutidos dois padrões de persistência nas próximas seções.
Esta seção discute o padrão de uso do mecanismo persistente escolhido para a Administração do
Sistema do Banco de Dados Relacional (Relational Database Management System - RDBMS) que
são classes Java Database Connectivity (JDBC). Há duas visões para este padrão, estática e
dinâmica.
Classe Descrição
PersistentClient Classe que pede dados para o banco de dados. Normalmente, estas são classes de
controle que perguntam algo de uma classe de entidade. Trabalha com um
DBClass.
DBClass Classe responsável para ler e escrever dados persistentes. Também é responsável
para ter acesso o banco de dados de JDBC que usa a classe de DriverManager.
DriverManager Classe que devolve uma conexão ao DBClass. Uma vez que uma conexão esteja
aberta o DBClass pode criar declaração de SQL que será enviada ao RDBMS
subjacente e será executada usando a classe Statement.
Statement Classe que representa uma declaração de SQL. A declaração de SQL é a linguagem
de acesso ao dados do banco de dados. Qualquer resultado devolvido pela
declaração de SQL é colocado na classe ResultSet.
ResultSet Classe que representa os registros devolvidos por uma consulta.
PersistentClassList Classe utilizada para devolver um conjunto de objetos persistentes como resultado
de uma consulta ao banco de dados. Um registro é equivalente a um
PersistentClass na lista.
Tabela 5: Classes do Padrão JDBC
DBClass é responsável por criar outro exemplo de classe persistente. Isto é entendido como
Engenharia de Software 30
JEDITM
mapeamento OO para RDBMS. Possui o comportamento para conectar com RDBMS. Toda classe
que precisa ser persistente terá um DBClass correspondente.
Visão dinâmica do Padrão de Persistência
A visão dinâmica do padrão de persistência mostra como as classes da visão estática interagem
umas com as outras. O Diagrama de Seqüência é utilizado para ilustrar este comportamento
dinâmico. Há vários comportamentos dinâmicos que são visto neste padrão, especificamente, eles
são JDBC Initialization, JDBC Create, JDBC Read, JDBC Update e JDBC Delete.
1. JDBC Initialization. A inicialização deve acontecer antes que qualquer classe persistente
possa ter acesso. Significa que a pessoa precisa estabelecer conexão com o RDBMS subjacente.
Envolve o seguinte:
• Carga do driver apropriado
• Conexão com o banco de dados
O Diagrama de Seqüência da inicialização do JDBC é mostrado na Figura 24.
Engenharia de Software 31
JEDITM
banco de dados.
3. JDBC Read. Esse comportamento obtêm registros do banco de dados. Executa um SELECT da
SQL. Isso também assume que a conexão foi estabelecida. O Diagrama de Seqüência é
mostrado na Figura 26.
Engenharia de Software 32
JEDITM
Engenharia de Software 33
JEDITM
Engenharia de Software 34
JEDITM
Engenharia de Software 35
JEDITM
Engenharia de Software 36
JEDITM
6. Projeto de interface
É interessante lidar com elementos projetados para facilitar a comunicação do software com os
humanos, dispositivos e outros sistemas que inter-operam entre si. Nesta seção, poderemos
concentrar em projetados de elementos que interagem com as pessoas, particularmente,
formulários de pré-impressão, relatórios e telas.
Um bom projeto de formulários, relatórios e telas são críticos para determinar como o sistema
será aceito pelo usuário final, estabelecendo o seu sucesso ou fracasso. Com a Engenharia de
Software, queremos diminuir a ênfase em relatórios e formulários e aumentar a ênfase em telas.
Quando usamos relatórios?
• Relatórios são utilizados para examinar um caminho e efetuar controles.
• Relatórios são usados para conformidades com agências externas.
• Relatórios são usados para grandes volumes de navegação .
Quando usamos formulários?
• Formulários são usados para se tornarem documentos.
• Formulários são usados se necessitar de transações personalizadas mas não se tem acesso
as estações de trabalho.
• Formulários são usados se são documentos jurídicos importantes.
Quando usamos telas?
• Telas são usadas para selecionar um simples registro do banco de dados.
• Telas são usadas para pequenos volumes de saída.
• Telas são usadas para intermediar passos ao longo de um processo interativo.
Relatórios podem ser colocados num papel comum, formulários contínuos, telas-bases ou
microfilmagem ou microfichas. A seguir damos os passos no projeto dos relatórios.
Engenharia de Software 37
JEDITM
• Onde os relatórios serão produzidos? Em uma tela CRT, formulário contínuo comum,
formulário de pré-impressão, papel timbrado, Microfilme ou microficha, mídia de
armazenamento, etc.
Engenharia de Software 38
JEDITM
Formato Descrição
9 Isto significa um dado numérico. O número 9 indica os dígitos. Exemplos:
9.999 – O número em milhar
999,99 – uma centena com duas casas decimais
A Indica uma letra do alfabeto. A-Z ou a-z. Símbolos não são permitidos.
X Indica um tipo alfanumérico. Símbolos são permitidos.
DD/MM/YY Indica data no formato dia/mês/ano
HH:MM:SS Indica hora no formato hora:minuto:segundo
Tabela 6: Convenções de Formato
Estado: XXXXX
No. Nome Sobrenome
9999 Xxxxxxxx Xxxxxxxx
9999 Xxxxxxxx Xxxxxxxx
9999 Xxxxxxxx Xxxxxxxx
Formulários são normalmente utilizados para entrada de dados quando uma workstation não
estiver disponível (não confundir com formulário de tela, estamos tratando de formulários em
papel). Às vezes é usado como um documento de turnaround. Os seguintes passos definem o
projeto de formulários.
Engenharia de Software 39
JEDITM
As classes de fronteira são refinadas para definir telas que os usuários utilizarão e a interação
(diálogo) das telas com outros componentes do software. Em geral, há duas metáforas usadas no
desenho de interfaces de usuário.
1. Metáfora do Diálogo é uma interação entre o usuário e o sistema através do uso de
menus, teclas de função ou a entrada de um comando através de uma linha de comando. Tal
Engenharia de Software 40
JEDITM
Engenharia de Software 41
JEDITM
Engenharia de Software 42
JEDITM
Nos passos seguintes, serão tratadas telas como únicos objetos. Na realidade, podem ser uma
instância de uma subdivisão de classe como Diálogo. Por exemplo, veja a Figura 39.
Em Java, é possível utilizar os componentes AWT e SWING. Eles são importados na classe que os
usa utilizando as seguintes instruções:
importe java.awt.*;
importe javax.swing.*;
Engenharia de Software 43
JEDITM
Neste exemplo, assumimos que estaremos utilizando a bibliotecas de Abstract Windowing Toolkit
(AWT) como componentes de apoio. Também é necessário modelar as telas "Find an Athlete" e
"Athlete List" como classes; elas são nomeadas, respectivamente, para FindAthleteRecordUI e
AthleteListUI. Empacotar todas as telas para formar o subsistema. Este subsistema deve
implementar a interface IAthleteRecordUI para a classe limite. Veja a Figura 41.
PASSO 3: Para cada classe de tela, modele o comportamento da tela com outras classes.
O comportamento da classe de tela relativa a outras classe é conhecido como projeto de diálogo.
Os diagramas de colaboração e de seqüência são utilizados nesta etapa. Como no nosso exemplo,
há três funcionalidades principais para gerenciar um registro de um atleta que deve suportar
registro do nome, adição, edição e deleção do atleta. Considere o diagrama de colaboração
modelado na Figura 42. O primeiro diagrama de colaboração modela como o sistema gerencia o
registro do atleta e consiste nas classes AthleteRecordUI, MaintainAthleteRecord e DBAthlete. Isto
é mostrado pelo segundo diagrama de colaboração da figura. Classes adicionais são identificadas
e definidas para suportar recuperação de um registro de um atleta a partir da base de dados
quando as funcionalidades de edição e deleção assim necessitam. Estas classes são
FindAthleteRecordUI, FindAthleteRecord e AthleteListUI.
Uma vez que os objetos da colaboração são identificados, precisamos modelar o comportamento
destes objetos quando as funcionalidades (adição, edição e deleção do registro do atleta) são
executadas. Utilizamos o Diagrama de Seqüência para modelar este comportamento. A Figura 43
mostra o Diagrama de Seqüência formal da adição de um registro de um atleta.
Engenharia de Software 44
JEDITM
Engenharia de Software 45
JEDITM
O estado inicial, representado pelo círculo sólido, significa o ponto inicial da transição. Um
objeto não pode permanecer no seu estado inicial mas precisa se mover para um estado
Engenharia de Software 46
JEDITM
nomeado. O estado é representado como um objeto retangular com as bordas arredondas e com
um nome de estado dentro do objeto. Uma transição é representada por uma linha com uma
seta na ponta. Uma transição pode ter um texto de transição que mostra o evento causador da
transição, qualquer condição de guarda que precise ser avaliada durante o disparo do evento, e a
ação que precisa ser executada quando o evento é disparado. O evento pode ser uma operação
definida na classe. O estado final, como representado pelo círculo com outro círculo preenchido
dentro, significa o fim do diagrama.
Similar ao outro diagrama na UML, há uma notação melhorada ou estendida que pode ser usada
quando está se definindo o estado da classe. A Figura 48 mostra essas notações.
Engenharia de Software 47
JEDITM
Engenharia de Software 48
JEDITM
Engenharia de Software 49
JEDITM
Também ajudaria a listar a ação na tabela. Esta tabela é denominada de Tabela Evento-Ação. Ela
é usada se o mapa de estado é complexo. Do ponto de vista do programador, esta tabela é mais
fácil de usar do que um mapa de estado rotulado com ações. Ela pode auxiliar na validação do
mapa de estado e para testar o código quando ele é implantado. As colunas da Tabela Evento-
Ação são as seguintes:
● Estado atual do objeto que está sendo modelado. Para melhor referência, os estados
são numerados.
● O evento é uma ação que pode ocorrer.
● As ações associadas com a combinação do estado e do evento.
● Próximo estado do objeto depois que o evento ocorre. Se mais de um estado variável é
usado, é utilizada outra coluna.
A Figura 53 mostra um mapa de diagrama de estado da tela AthleteRecordUI , com os estados
numerados e a Tabela 7 mostra o Evento-Ação desta tela.
Engenharia de Software 50
JEDITM
Engenharia de Software 51
JEDITM
Quatro princípios básicos são usados para o projeto de componentes. Eles são usados para guiar o
engenheiro de software no desenvolvimento de componentes que são mais flexíveis e maleáveis
para alterar e reduzir a propagação dos efeitos colaterais quando uma mudança acontecer.
1. Princípio Abre-Fecha. Quando da definição de módulos ou componentes, eles devem ser
abertos para extensão, devem ser modificáveis. O engenheiro de software deve definir um
componente tal que ele possa ser estendido sem a necessidade de se modificar a estrutura e
o comportamento internos do componente. Abstrações na linguagem de programação
suportam esse princípio.
2. Princípio da Subtituição Liskov. A classe ou subclasse derivada pode ser uma substituta
para a classe base. Se uma classe é dependente da classe base, essa classe pode usar
qualquer classe derivada como uma substituta para a classe base. Esse princípio reforça que
qualquer classe derivada deve estar de acordo com qualquer contrato implícito entre a classe
base e qualquer componente que a utilize.
3. Princípio da Dependência. As classes devem depender da abstração; não do concreto.
Quanto mais um componente depender de outros componentes concretos, mais difícil será
extendê-los.
4. Princípio da Segregação de Interface. Engenheiros de software são encorajados a
desenvolver interfaces específicas do cliente ao invés de uma única interface genérica.
Apenas operações específicas de um cliente em particular devem ser definidas na interface
específica do cliente. Isso minimiza a herança de operações irrelevantes para o cliente.
Esse guia é aplicado ao projeto do componente, sua interface, suas dependências e herança.
1. Componente
• Nomes arquiteturais do componente devem vir do domínio do problema e serem
facilmente compreendidos pelos participantes, particularmente, os usuários finais. Como
um exemplo, um componente chamado Athlete é claro para qualquer um que esteja
lendo o componente.nomes específicos. Como exemplo, PCLAthlete é uma lista de
classes persistentes para atletas.
• Utilize estereótipos para identificar a natureza de componentes como <<table>>,
<<database>> ou <<screen>>.
2. Interfaces
• A representação canônica da interface é recomendada quando o diagrama se torna
complexo.
• Elas devem fluir do lado esquerdo do componente implementado.
• Mostra apenas as interfaces que são relevantes para o componente sendo considerado.
Engenharia de Software 52
JEDITM
3. Dependências e Herança
• Dependências devem ser modeladas da esquerda para direita.
• Herança deve ser modelada do nível mais baixo (subclasses ou classes derivadas) para
o topo (superclasses ou classe base).
• Interdependência de componentes são modeladas da interface para interface ao invés
do componente para o componente.
Um componente é representado por uma caixa retangular com o símbolo do componente dentro.
A dependência é descrita pelas setas pontilhadas. A dependência pode ser nomeada. O
componente Cliente (Client Component) é dependente do componente Fornecedor (Supplier
Component).
Todas as classes identificadas até então devem ser elaboradas, incluindo as telas e classes de
modelos de dados. Nessa seção, o MaintainAthleteRecordController será usado como exemplo mas
o modelo de componente deve ser feito para todas as classes.
O MaintainAthleteRecordController é uma classe abstrata que representa, em geral, o
comportamento de manter um registro do atleta (athlete). É estendida por um tipo de
manutenção – adicionando um registro, editando um registro ou deletando um registro. Figura 56
mostra a hierarquia do tipo de manutenção registro de atleta que é modelado durante a fase de
requisitos de engenharia. A relação é “é-um-tipo”; AddAthleteController é um tipo de
MaintainAthleteRecordController.
Engenharia de Software 53
JEDITM
Símbolos de Descrição
Visibilidade
Público (PUBLIC): O atributo ou a operação são acessados diretamente pela
+ ou public instância de uma classe.
Particular (PRIVATE): O atributo ou a operação são acessados somente por uma
- ou private
instância da classe que os inclui.
Protegido (PROTECTED): O atributo ou a operação podem ser usados por qualquer
# ou protected
instância da classe que os inclui ou por uma subclasse desta mesma classe.
Pacote (PACKAGE): O atributo ou a operação estão acessíveis somente para serem
~
instâncias de uma classe no mesmo pacote.
Tabela 8: Visibilidade do atributo ou da operação
Os símbolos de visibilidade são colocados antes do nome do atributo ou da operação. Veja Figura
57 como exemplo:
Engenharia de Software 54
JEDITM
Os nomes dos pacotes segue a convenção usada pela Linguagem de Programação Java. O pacote
abl.athlete manuseia o Sistema de Manutenção de Sócios do Clube. A lista a seguir contém
seus pacotes e arquivos:
• Pacote de interface do usuário (abl.athlete.ui)
• AthleteRecordUI.java, AthleteListUI.java e FindAthleteRecordUI.java
• Controladores (abl.athlete.con)
• MaintainAthleteRecord.java, AddAthlete.java, EditAthlete.java, DeleteAthlete.java e
FindAthleteRecord.java
• Classes de Bancos de Dados (abl.athlete.dbclass)
• DBAthlete.java
• Classe de Persistência (abl.athlete.pc)
• Athlete.java e Guardian.java
O ABL Database é o servidor do banco de dados que contém os dados que são necessários para as
aplicações.
Engenharia de Software 55
JEDITM
Engenharia de Software 56
JEDITM
9.2. Classe
9.3. Operação
9.4. Atributo
Engenharia de Software 57
JEDITM
Engenharia de Software 58
JEDITM
Engenharia de Software 59
JEDITM
12. Exercícios
12.1. Criando o modelo de Projeto de Dados
1. Projetar os layouts dos Relatórios dos itens abaixo e utilizar os padrões como definidos
neste capítulo
• Lista dos sócios por Status
• Lista dos sócios que estarão saindo ou se graduando no próximo ano
• Lista dos sócios que não pagaram a taxa de nova matrícula
2. Remodelar o Formulário da Aplicação para acomodar as informações adicionais dos atletas
que os proprietários dos clubes queiram. Utilizar os padrões como definidos neste capítulo
3. Refinar o projeto de telas da tela Atleta como mostrado na Figura 38 para incluir
informações adicionais necessárias para os proprietários de clubes
• Criar um novo protótipo de tela
• Definir a tela como uma classe
• Modelar o comportamento da tela
4. Criar o projeto de telas e caixas de diálogo do Sistema de Informação de Técnicos
• Criar o protótipo de tela
• Definir a tela como uma classe
• Modelar o comportamento da tela
5. Criar o projeto de telas e caixas de diálogo do Sistema de Manutenção de Sócios do
Clube.
• Criar o protótipo de tela
• Definir a tela como uma classe
• Modelar o comportamento da tela
Engenharia de Software 60
JEDITM
Engenharia de Software 61
Módulo 4
Engenharia de Software
Lição 5
Implementação
1. Objetivos
Classes são escritas de acordo com o que está especificado no projeto. A tradução de um projeto
pode ser uma tarefa complicada. Primeiro, o projetista do sistema pode não apontar as
características da plataforma e do ambiente de programação. Segundo, os códigos devem ser
escritos de tal forma que sejam compreensíveis não só pelo programador que os fez, mas
também pelos outros (outros programadores e testadores). Terceiro, o programador deve se
aproveitar das características da organização do projeto, das estruturas de dados e das
construções específicas da linguagem de programação enquanto cria um código de fácil
manutenção e reutilizável. Este capítulo não pretende ensinar cada linguagem de programação,
visto que isto é reservado para um curso de programação. Este capítulo oferece algumas dicas de
programação que devem ser adotadas na criação de códigos. Ele também mostra algumas boas
práticas de engenharia de software que todo programador deve sempre ter em mente.
Ao final desta lição, o estudante será capaz de:
• Conhecer dicas de programação
• Conhecer práticas de engenharia de software para escrever códigos
• Oferecer exemplos de implementação do projeto, particularmente, pacotes, classes de
bancos de dados e classes persistentes, e interfaces gráficas com o usuário
Engenharia de Software 4
JEDITM
Engenharia de Software 5
JEDITM
3. Dicas de Programação
Programação é uma habilidade criativa. O programador tem a flexibilidade de implementar o
código. O componente do projeto é utilizado como uma dica da função e objetivo do componente.
Dicas específicas de linguagem não são discutidas aqui. Dicas Padrões de Programação Java,
visite o endereço http://java.sun.com/docs/codeconv/index.html. Esta seção discutirá várias dicas
que se aplicam à programação de modo geral.
Documentação Interna
É um documento descritivo diretamente escrito no código-fonte. É direcionado a alguém que terá
que ler o código-fonte. Uma informação resumida é oferecida para descrever suas estruturas de
dados, algoritmos e fluxos de controle. Geralmente, esta informação é colocada no início do
código. Esta seção do código-fonte é conhecida como bloco cabeçalho de comentário. Ele age
como uma introdução ao código-fonte e identifica os seguintes elementos:
• Nome do Componente
• Autor do Componente
• Data em que o Componente foi criado ou teve sua última modificação
• Lugar onde o Componente se aplica no sistema em geral
• Detalhes da estrutura de dados, do algoritmo e do fluxo de controle do componente
Opcionalmente, pode-se adicionar um histórico das revisões que foram feitas no componente. O
elemento de histórico consiste de:
• Quem modificou o componente?
• Quando o componente foi modificado?
• Qual foi a modificação?
As documentações internas são criadas para as pessoas que irão ler o código.
Engenharia de Software 6
JEDITM
Documentação Externa
Todos os outros documentos que não são parte do código-fonte mas estão relacionados ao código-
fonte são conhecido como documentos externos. Este tipo de documentação é para aqueles
que não precisam necessariamente ler os códigos das classes. Descrevem como os componentes
interagem uns com os outros, incluindo classes de objetos e suas heranças hierárquicas. Para um
sistema orientado a objeto, identifica as pré-condições e pós-condições do código-fonte.
Engenharia de Software 7
JEDITM
4. Implementando Pacotes
Os pacotes oferecem um mecanismo de reuso do software. Um dos objetivos dos programadores
é criar componentes de software reutilizáveis de tal forma que códigos não tenham que ser
escritos repetidamente. A Linguagem de Programação Java oferece um mecanismo para a
definição de pacotes. Na realidade, são diretórios que são utilizados para organizar as classes e
interfaces. O Java oferece uma convenção para que os nomes de pacotes e classes sejam únicos.
Com centenas de milhares de programadores Java espalhados pelo mundo, o nome que alguém
pode utilizar para a sua classe pode coincidir com o nome de uma classe desenvolvida por outros
programadores. Os nomes dos pacotes devem ser formados por caracteres ASCII, todos em
minúsculas. Devem seguir a Convenção de Nomes de Domínio da Internet conforme especificado
no formato X.500.
A seguir estão os passos da definição de um pacote em Java.
1. Defina uma classe public. Se a classe não for pública, somente poderá ser usada por outras
classe no mesmo pacote. Considere o código da classe persistente Athlete mostrada no
código abaixo.
package abl.athlete.pc;
public class Athlete{
private int athleteID;
private String lastName;
private String firstName;
... // restante dos atributos
public void setAthleteID(int id) { //métodos modificadores (set)
athleteID = id;
}
... // outros métodos modificadores
public int getAthleteID() { // métodos acessores (get)
return athleteID;
}
... // outros métodos acessores
}
Colocando a palavra-chave package no início do arquivo fonte indica que a classe definida no
arquivo faz parte do pacote especificado.
3. Compile a classe para que seja colocada na devida estrutura de diretório de pacotes. A classe
compilada torna-se disponível para o compilador e o interpretador. Quando um arquivo Java
contendo um pacote é compilado, o arquivo resultante *.class é colocado no diretório
especificado pelo comando package. No exemplo, o arquivo athlete.class é colocado no
diretório pc dentro do diretório athlete que está dentro do diretório abl. Se estes diretórios
não existirem, o compilador os criará.
4. Para reutilizar a classe, simplesmente importe o pacote. O código mostrado no código abaixo
é um exemplo de importação da classe Athlete que é utilizada pela classe DBAthlete.
import abl.athlete.pc.*; // Todas as classes públicas deste pacote
// estão disponíveis para uso em DBAthlete
public class DBAthlete {
private Athlete ath; // Define uma referência para um objeto Athlete
... // restante do código
}
Engenharia de Software 8
JEDITM
5. Implementando Controladores
Implementar controladores é como escrever classes nos módulos anteriores. Uma boa prática de
programação é a utilização de classes abstratas e interfaces. Esta seção serve como uma revisão
de classes abstratas e interfaces. A utilização de classes abstratas e interfaces aumenta
consideravelmente a capacidade do software de ser reutilizável e gerenciável. Também permite ao
software ter capacidades 'plug-and-play'. Esta seção serve como uma revisão de classes abstratas
e interfaces em Java1.
A fim de implementarmos isto, podemos criar uma superclasse que tenha alguns métodos com
implementação e outros sem. Este tipo de classe é denominada classe abstrata.
Uma classe abstrata é uma classe que não pode ser instanciada. Geralmente aparece no topo de
uma hierarquia de classes na programação orientada a objeto, definindo os vários tipos de ações
possíveis com os objetos de todas as subclasses.
Os métodos da classe abstrata que não têm implementação são chamados métodos abstratos.
Para criar um método abstrato, simplesmente escreva a declaração do método sem conteúdo
nenhum e use a palavra-chave abstract. Por exemplo:
public abstract void someMethod();
1 O uso do texto do curso JEDI Introdução à Programação teve autorização prévia dos seus autores.
Engenharia de Software 9
JEDITM
Quando uma classe estende a classe abstrata LivingThing, será obrigada a implementar o método
abstrato walk(), caso contrário está subclasse deverá ser uma classe abstrata também e,
portanto, não poderá ser instanciada. Por exemplo:
public class Human extends LivingThing {
public void walk(){
System.out.println("Human walks...");
}
}
Se a classe Human não implementasse o método walk(), ocorreria a seguinte mensagem de erro:
Human.java:1: Human is not abstract and does not override abstract method
walk() in LivingThing
public class Human extends LivingThing
^
1 error
Dicas de Codificação:
Use classes abstratas para definir vários tipos de comportamentos no topo das hierarquia das
classes na programação orientada a objetos, e use as suas subclasses para implementar os
detalhes da classe abstrata.
5.2. Interfaces
Uma interface é um tipo de bloco especial que contém apenas a assinatura de métodos (e
provavelmente constantes). As interfaces definem as assinaturas de um conjunto de métodos,
sem o corpo.
As interfaces definem uma maneira pública e padrão para especificar o comportamento das
classes. Elas permitem que as classes, independentemente de sua localização na hierarquia de
classes, implementem comportamentos comuns. As interfaces implementam o polimorfismo
também, pois uma classe pode chamar um método de uma interface e a versão apropriada deste
método será executada dependendo do tipo do objeto passado na chamada ao método da
interface.
Uma outra razão para utilizar uma interface na programação de um objeto é revelar a interface de
Engenharia de Software 10
JEDITM
programação de um objeto, sem revelar a sua classe. Como poderemos ver mais tarde na seção
Interface versus Classes, podemos utilizar uma interface como um tipo de dado.
Finalmente, precisamos utilizar interfaces para modelar heranças múltiplas o que permite que
uma classe tenha mais de uma superclasse. A herança múltipla não está presente no Java, mas
está presente em outras linguagens orientadas a objeto como o C++.
Outra característica comum é que ambas, interface e classe, podem definir métodos. Entretanto,
uma interface não possui código de implementação, o que ocorre na classe.
Como um exemplo, criaremos uma interface que defina relacionamentos entre dois objetos
conforme a “ordem natural” dos objetos.
public interface Relation {
public boolean isGreater(Object a, Object b);
public boolean isLess(Object a, Object b);
public boolean isEqual(Object a, Object b);
}
Engenharia de Software 11
JEDITM
return length;
}
public boolean isGreater(Object a, Object b) {
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen > bLen);
}
public boolean isLess(Object a, Object b) {
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen < bLen);
}
public boolean isEqual(Object a, Object b) {
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen == bLen);
}
}
Quando sua classe tenta implementar uma interface, sempre tenha certeza de que todos ps
métodos da interface foram implementados ou, caso contrário, será mostrado o seguinte erro:
Line.java:4: Line is not abstract and does not override abstract method
isGreater(java.lang.Object,java.lang.Object) in Relation
public class Line implements Relation
^
1 error
Dicas de Codificação:
Utilize interfaces para criar algumas definições padrões de métodos em várias classes diferentes.
Uma vez que um conjunto padrão de definições de métodos esteja criado, é possível escrever
um único método para manipular todas as classes que implementam a interface.
Outro exemplo de uma classe que estende uma superclasse e implementa uma interface é:
public class ComputerScienceStudent extends Student
implements PersonInterface, LivingThing {
// algum código aqui
}
Note que uma interface não faz parte do patrimônio hierárquico da classe. Classes não
relacionadas podem implementar a mesma interface.
Engenharia de Software 12
JEDITM
Uma interface formaliza o polimorfismo. Ela define o polimorfismo de maneira declarativa, sem
relação com a implementação. Esta é a chave para a capacidade “plug-and-play” de uma
arquitetura. É um tipo especial de bloco contendo apenas assinaturas de métodos (e
possivelmente constantes). As interfaces definem as assinaturas de um conjunto de métodos sem
o corpo.
Engenharia de Software 13
JEDITM
A definição de classe do driver do banco de dados deve ser carregada antes que se possa conectar
ao banco de dados. A seguinte linha carrega o driver. Neste exemplo, o driver de banco de dados
padrão ponte JDBC-ODBC é utilizado para permitir que qualquer classe Java acesse qualquer
fonte de dados ODBC. Para mais informações do sobre o driver JDBC e os bancos de dados
suportados, visite o seguinte site: http://java.sun.com/products/jdbc.
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Para estabelecer uma conexão, um objeto de conexão é criado. Ele gerencia a conexão entre o
banco de dados e a classe Java. Ele também fornece suporte para a execução de comandos SQL.
No exemplo, o seguinte comando fornece esta conexão.
connection = DriverManager.getConnection(url, username, password);
O método inicial que é invocado para começar a recuperação de registros de atletas do banco de
dados é o método getAthleteRecord(). O código deste método é mostrado abaixo. O objeto
selectStmt é utilizado para definir o comando SELECT que especifica quais registros serão
recuperados do banco de dados. O método privado prepareSelectStmt() gera o comando select
com o critério apropriado. O objeto statement é utilizado para enviar comandos SQL ao banco de
dados e é instanciado utilizando-se o método createStatement() do objeto connection. O método
executeQuery() do objeto statement é utilizado para executar o comando SELECT conforme
especificado no objeto selectStmt. O resultado da pergunta é colocado e referenciado em rs que é
um objeto ResultSet.
O objeto PCLAthlete é carregado pela execução do método populatePCLAthlete() que utiliza como
entrada o ResultSet. Para cada registro no conjunto de resultados, um objeto athlete é
instanciado e tem seus atribuídos preenchidos com os dados do atleta. O método getPCLAthlete()
retorna uma referência para a lista de atletas gerada.
Engenharia de Software 14
JEDITM
import java.sql.*;
import java.util.*;
public DBTeam() {
// Para conectar ao Banco de Dados...
String url = "jdbc:odbc:ABLDatabase";
String username = "postgre";
String password = "postgres1";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connection = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
...
} catch (SQLException e) {
...
}
}
// para executar o comando SELECT
public void getAthleteRecord(String searchCriteria) throws SQLException {
String selectStmt = prepareSelectStmt(searchCriteria);
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(selectStmt);
populatePCLAthlete(rs);
statement.close();
}
// para gerar o comando SELECT com o critério de pesquisa
private String prepareSelectStmt(String searchCriteria)
throws SQLException {
String query = "SELECT * FROM athlete, guardian "
query = query + "WHERE athlete.guardianID = guardian.guardianID";
query = query + " AND " + searchCriteria + ";" ;
return query;
}
// para preencher a lista persistente da classe.
private void populatePCLAthlete(ResultSet rs) throws SQLException {
....
athleteList = new PCLAthlete();
....
// dentro de um bloco try e catch
ResultSetMetaData rsmd = rs.getMetaData();
do {
athleteList.add(getNextMember(rs, rsmd);
} while (rs.next())
}
// para gerar um objeto atleta a ser adicionado a PCLAthlete
private Athlete getNextMember(ResultSet rs, ResultSetMetaData rsmd)
throws SQLException {
Athlete a = new Athlete();
// Construtor para converter string em integer
a.setAthleteID(rs.getString(1));
a.setLastName(rs.getString(2));
a.setFirstName(rs.getString(3));
... // preencher os atributos para o objeto atleta a
return a;
}
// retorna uma referência para a lista de atletas (PCLAthlete)
public PCLAthlete getPCLAthlete() throws SQLException {
return athleteList;
}
}
Engenharia de Software 15
JEDITM
Classe Descrição
Component Uma classe abstrata para objetos que podem ser mostrados na tela e interagir com o
usuário. É a raiz de todas as classes AWT.
contêiner Uma subclasse abstrata da classe Component. Um componente que pode conter outros
componentes.
Panel Estende a classe contêiner. Um quadro ou janela sem a barra de título, a barra de menu e
as bordas. Superclasse da classe Applet.
Window Estende a classe contêiner. Um janela de alto nível, o que significa que não pode estar
contida dentro de qualquer outro objeto. Não tem bordas ou barra de menu.
Frame Estende a classe Window. Uma janela com título, barra de menu, borda e cantos
redimensionáveis. Tem quatro construtores, dois dos quais têm as seguintes assinaturas:
Frame()
Frame(String title)
Tabela 1: Classes Contêineres AWT
2 O uso do texto do curso JEDI Introdução à Programação II teve autorização prévia dos seus autores.
Engenharia de Software 16
JEDITM
Por padrão, uma janela não está visível a menos que seja definida sua visibilidade como true.
Aqui está a sintaxe para o método setVisible.
void setVisible(boolean b)
No projeto de aplicações GUI, objetos Frame geralmente são usados. Aqui está um exemplo da
criação de tal aplicação.
import java.awt.*;
Observe que o botão fechar do quadro não funciona ainda pois nenhum mecanismo de tratamento
de evento foi adicionado ao programa ainda. Conheceremos sobre tratamento de eventos em
futuras lições.
Gráficos
Diversos métodos gráficos podem ser encontrados na classe Graphics. Aqui está uma lista com
alguns destes métodos.
drawLine() drawPolyline() setColor()
fillRect() drawPolygon() getFont()
drawRect() fillPolygon() setFont()
clearRect() getColor() drawString()
Tabela 2: Alguns métodos da classe Graphics
Relacionada a esta classe, temos a classe Color, que tem três construtores.
Aqui está um exemplo de programa que utiliza alguns dos métodos da classe Graphics.
import java.awt.*;
Engenharia de Software 17
JEDITM
f.add(gp);
f.setSize(600, 300);
f.setVisible(true);
}
}
Para que um painel se torne visível, ele deve ser colocado dentro de uma janela visível, como um
Frame.
O gerenciador de layout pode ser definido utilizando o método setLayout da classe contêiner. O
método tem a seguinte assinatura.
Engenharia de Software 18
JEDITM
Caso se opte pela não utilização de qualquer gerenciador de layout, é possível passar o valor null
como parâmetro para este método. Entretanto, todos os componentes devem ser posicionados
manualmente utilizando o método setBounds da classe Component.
public void setBounds(int x, int y, int width, int height)
Gerenciador FlowLayout
O FlowLayout é o gerenciador padrão para a classe Panel e suas subclasses, incluindo a classe
Applet. Ele posiciona os componentes no sentido esquerda pra direita e de cima para baixo,
começando do canto esquerdo superior. Imagine-se digitando em um editor de textos. É assim
que o gerenciador FlowLayout funciona. Ele tem três construtores que estão listados abaixo.
Construtores do FlowLayout
FlowLayout()
Cria um novo objeto FlowLayout com alinhamento central e 5 unidades de espaçamento
horizontal e vertical aplicadas aos componentes por padrão.
FlowLayout(int align)
Cria um novo objeto FlowLayout com o alinhamento especificado e 5 unidades de espaçamento
horizontal e vertical aplicadas aos componentes por padrão.
FlowLayout(int align, int hgap, int vgap)
Cria um novo objeto FlowLayout com o primeiro parâmetro como alinhamento e o valor de hgap
em unidades de espaçamento horizontal e o valor de vgap em unidades de espaçamento vertical
aplicadas aos componentes.
Tabela 5: Construtores do FlowLayout
Engenharia de Software 19
JEDITM
Gerenciador BorderLayout
O BorderLayout divide o Contêiner em cinco partes - norte, sul, leste, oeste e centro. Cada
componente é adicionado a uma região específica. As regiões norte e sul esticam horizontalmente
enquanto as regiões leste e oeste ajustam-se verticalmente. A região central, por outro lado,
ajusta-se horizontal e verticalmente. Este é o layout padrão dos objetos Window, incluindo os
objects das subclasse de Window do tipo Frame e Dialog.
Construtores de BorderLayout
BorderLayout()
Cria um novo objeto BorderLayout sem espaços entre os diferentes componentes.
BorderLayout(int hgap, int vgap)
Cria um novo objeto BorderLayout com espaçamento horizontal hgap unidades e espaçamento
vertical com o valor de vgap em unidades aplicados entre os diferentes componentes.
Tabela 6: Construtores de BorderLayout
Aqui está um exemplo de uma classe que demonstra como o BorderLayout funciona.
import java.awt.*;
Aqui está uma amostra da saída desta classe. A segunda figura mostra o efeito do
redimensionamento da janela.
Engenharia de Software 20
JEDITM
Gerenciador GridLayout
Com o gerenciador GridLayout, os componentes também são posicionados da esquerda para a
direita e de cima para baixo assim como no gerenciador FlowLayout. Além disso, o gerenciador
GridLayout divide o contêiner em um determinado número de linhas e colunas. Todas estas
regiões terão o mesmo tamanho. Ele sempre ignora o tamanho definido para o componente.
A seguir estão os construtores disponíveis para a classe GridLayout.
Construtores de GridLayout
GridLayout()
Cria um novo objeto GridLayout com uma única linha e uma única coluna, por padrão.
GridLayout(int rows, int cols)
Cria um novo objeto BorderLayout com o número de linhas e colunas especificado.
GridLayout(int rows, int cols, int hgap, int vgap)
Cria um novo objeto BorderLayout com o número de linhas e colunas especificado. O
espaçamento no valor de hgap em unidades horizontais e vgap unidades verticais é aplicado aos
componentes.
Tabela 7: Construtores de GridLayout
Engenharia de Software 21
JEDITM
Engenharia de Software 22
JEDITM
Componente Descrição
JComponent A classe raiz para todos os componentes Swing, excluindo os contêineres top-level
JButton Um botão. Corresponde à classe Button no pacote AWT
JCheckBox Um item que pode ser selecionado ou não pelo usuário. Corresponde à classe Checkbox
no pacote AWT
JFileChooser Permite ao usuário selecionar um arquivo. Corresponde à classe FileChooser no pacote
AWT
JTextField Permite editar uma linha única de texto. Corresponde à classe TextField no pacote AWT
JFrame Estende e corresponde à classe Frame no pacote AWT mas os dois são levemente
incompatíveis em termos da adição de componentes para este contêiner. É necessário se
obter o conteúdo do painel corrente antes de se adicionar um componente
JPanel Estende a classe JComponent. Uma classe de contêiner simples mas não top-level.
Corresponde à classe Panel no pacote AWT
JApplet Estende e corresponde à classe Applet no pacote AWT. Também é incompatível com a
classe Applet em termos da adição de componentes para este contêiner
JOptionPane Estende a classe JComponent. Provê uma maneira fácil de mostrar caixas de diálogo
JDialog Estende e corresponde à classe Dialog no pacote AWT. Geralmente usado para informar
algo ao usuário ou solicitar uma entrada do usuário.
JColorChooser Estende a classe JComponent. Permite ao usuário selecionar uma cor.
Engenharia de Software 23
JEDITM
Para a lista completa dos componentes Swing, favor consultar a documentação API.
Um Exemplo JFrame
import javax.swing.*;
import java.awt.*;
Observe que o pacote java.awt ainda é importado pois os gerenciadores de layout sendo usados
são definidos neste pacote. Além disso, o fato de se dar um título ao quadro e o empacotamento
dos componentes dentro do quadro também é aplicável aos quadros AWT.
Dicas de Codificação:
Observe o estilo de codificação aplicado neste exemplo, ao contrário dos exemplos para o AWT.
Os componentes são declarados como campos, um método launchFrame é definido, e a
inicialização e adição dos componentes são todos feitos no método launchFrame. Simplesmente
não estendemos mais a classe Frame. A vantagem de se utilizar este estilo se tornará aparente
quando chegarmos a trabalhar com tratamento de eventos.
Engenharia de Software 24
JEDITM
Um Exemplo JOptionPane
import javax.swing.*;
Observe como é simples solicitar dados do usuário. Este é o resultado da execução desta classe.
2. Iniciar um novo projeto para a criação da interface com o usuário. Para isso, selecionar File ->
New Project. A caixa de diálogo New Project mostrada na Figura 9 aparecerá.
Engenharia de Software 25
JEDITM
3. Desta caixa de diálogo, selecionar General -> Java Application. Pressionar o botão Next e a
caixa de diálogo New Java Application aparecerá.
4. Na caixa de diálogo New Java Application, informa o nome do projeto e o diretório que será
usado para manter todos arquivos relacionados ao projeto. Figura 10 mostra um exemplo. O
nome do projeto é AthleteDB e o diretório é /home/noel/TestHD/JStudio.
5. O Java Studio Enterprise apresentará a inicialização padrão mostrada na Figura 11.
Engenharia de Software 26
JEDITM
6. Para adicionar um quadro, selecionar File -> New File -> Java GUI Forms -> JFrame Form.
Figura 12 e Figura 13 mostram como fazer isto.
Engenharia de Software 27
JEDITM
7. Pressionar o botão Next. A caixa de diálogo New JFrame Form conforme mostrado Figura 14 irá
aparecer. Informe o nome da classe. Neste caso, o nome da tela é AForm. Então, pressione o
botão Finish.
Engenharia de Software 28
JEDITM
9. O Palette Manager está localizado na janela superior direita e abaixo está o Component
Properties. O Palette Manager contém objetos dos pacotes Swing, AWT, Layouts, e Beans.
10.Para utilizar o Palette Manager utilizando o estilo DragNDrop para a janela de Design,
certifique-se que o Selection Mode está habilitado. É o primeiro ícone ao lado do Design Tab.
Figura 17 mostra o Design Tab. O botão de seleção deve estar destacado; é o botão com a seta
e a caixa.
11.O Component Inspector consiste de um visão geral dos objetos GUIs adicionados ao Frame.
Figura 18 mostra o Component Inspector. É parte da janela rotulada Inspector. Uma Visão de
Engenharia de Software 29
JEDITM
12.Para construir ou salvar o projeto, selecionar Build -> Build Main Project. Isto é mostrado
em Figura 19.
13.O Build Output é gerado no Output Tab na parte de baixo do programa. Isto é mostrado na
Figura 20.
Engenharia de Software 30
JEDITM
14.Para executar o projeto específico, clique Run -> Run File -> Run "AForm.java". Isto é
mostrado na Figura 21.
Engenharia de Software 31
JEDITM
3. Para adicionar um Panel, clique com o botão direito no nome do quadro na janela do
Component Inspector. Neste exemplo, é o JFrame1. Selecionar Add From Palette -> AWT -
> Panel. Figura 24 mostra isto.
Engenharia de Software 32
JEDITM
4. Para renomear o painel, clique com o botão direito no nome do painel na janela do Component
Inspector. Selecionar Rename. Informar o novo nome do painel. Figura 25 mostra isto.
Engenharia de Software 33
JEDITM
6. O Component Inspector mostra agora que o Label label1 foi adicionado ao Panel p1 e o
Properties Tab agora mostra os Properties, Events, e Code para aquele label. Figura 27
mostra isto.
Engenharia de Software 34
JEDITM
7. A adição de GUIs ao Design também pode ser feito clicando-se com o botão direito o quadro ou
painel no Component Inspector. Isto é mostrado na Figura 28.
Engenharia de Software 35
JEDITM
9. Para testar o formulário, clique o ícone Test Form no Design Panel para ver o layout corrente.
Figura 30 e Figura 31 mostram o que acontece.
Engenharia de Software 36
JEDITM
11.Realize um DragNDrop nos componentes para às suas posições corretas conforme a disposição
mostrada na Figura 33.
Engenharia de Software 37
JEDITM
12.Feche-o e clique no ícono Test Form para ver as diferenças. A tela deve se parecer com a tela
na Figura 34.
13.Observe que tudo está centralizado. Volte ao GridBagLayout -> Customize para editar os
valores associados a cada um, assim como outras modificações necessárias. O layout final
quando o AForm.java é executado (BUILD ou Shift+F6) deve se parecer com a Figura 35.
Engenharia de Software 38
JEDITM
14.Para adicionar diálogos ao formulário, vá para Component Inspector, clique com o botão
direito em Other Components. Selecione Swing -> JDialog. Faça o mesmo processo para os
layouts.
15.Para habilitar o evento para o botão Find no Athlete Form, clique com o botão direito em seu
nome no Component Inspector. Selecione Events -> Action -> actionPerformed.
Engenharia de Software 39
JEDITM
16.Isto irá selecionar o tab Source ao lado do tab Design na janela Design. Modifique o código de
tal maneira que o Diálogo Find An Athlete seja visível. Faça o mesmo para os botões OK e
Cancel no Diálogo.
17.Teste o formulário. Do Formulário Athlete, clique o Botão Find. Ele deve mostrar o Formulário
Find An Athlete. Deste formulário, clique no botão OK. Será mostrado o Formulário Athlete
List.
18.Reconstrua e Execute.
Engenharia de Software 40
JEDITM
import javax.swing.JOptionPane;
Engenharia de Software 41
JEDITM
Engenharia de Software 42
JEDITM
Usando o Sun Java™ Studio Enterprise 8 com certeza vai tornar a colaboração entre os times
mais fácil nos projetos de software. Nenhuma ferramenta de software extra é necessária: tudo o
que é necessário é de um repositório de trabalho, participantes de time que irão ajudá-lo em seu
projeto e o Sun Microsystems Java™ Studio 8!
Engenharia de Software 43
JEDITM
Engenharia de Software 44
JEDITM
Engenharia de Software 45
JEDITM
11. Exercícios
11.1. Definindo o Formato da Documentação Interna
1. Defina o Bloco de Comentário Cabeçalho que será utilizado para a Documentação Interna
da classe. Como um guia, a seguir temos os componentes recomendados:
• Nome do Componente
• Autor do Componente
• Data da última criação ou modificação do Componente
• Lugar onde o componente se encaixa no sistema em geral
• Detalhes da estrutura de dados, algoritmo e fluxo de controle do componente
Às vezes, ajuda se colocarmos informações históricas sobre a classe. Os componentes
recomendados são:
• Quem modificou o componente?
• Quando o componente foi modificado?
• Qual foi a modificação?
O formato deve incluir como ele será escrito tal como o espaçamento, rótulos serão em letra
maiúscula, etc. Mostre um exemplo de código fonte.
2. Usando o Bloco de Comentário Cabeçalho definido no exercício 1 para a Documentação
Interna, implemente o AthleteRecordUI, FindAthleteRecordUI, AthleteListUI e FindAthleteRecord
projetados no capítulo anterior. Se o Banco de Dados não pode ser implementado neste ponto,
todos os métodos do controlador que utilizarem objetos da camada de persistência e banco de
dados deverão ser codificados para mostrar uma mensagem descrevendo o que o método
deveria fazer. Como um exemplo, para o método public getAthleteRecord(String searchCriteria) o
programador pode simplesmente mostrar uma caixa de diálogo mostrando ao usuário que este
método retornaria uma lista de registros de atletas conforme especificado pelo valor no
searchCriteria.
Engenharia de Software 46
Módulo 4
Engenharia de Software
Lição 6
Teste de Software
1. Objetivos
Sistemas são testados para detectar defeitos ou falhas antes de serem entregues aos usuários
finais. Um fato conhecido é a dificuldade em se localizar e corrigir falhas, uma vez que o sistema
esteja em uso. Nesta lição discutiremos métodos e técnicas para desenvolver casos de teste.
Estratégias de teste também serão apresentadas para que possamos entender as etapas
necessárias para planejar as séries de passos que resultarão em uma construção bem sucedida do
sistema.
Ao final desta lição, o estudante será capaz de:
• Utilizar métodos e técnicas no desenvolvimento de testes
• Utilizar métodos de projeto de casos de teste
• Aprender a como testar classes
• Entender o desenvolvimento voltado para testes
• Aprender a testar sistemas
• Utilizar testes de métricas
Engenharia de Software 4
JEDITM
Engenharia de Software 5
JEDITM
Engenharia de Software 6
JEDITM
11
enquanto
1 (condição1) faça
instrução1;
2 instrução2
instrução6 instrução7
7 8 instrução8
instrução9
9
Engenharia de Software 7
JEDITM
11
REGIÃO 1
instrução1;
2 instrução2
Nó 3 é contado com
2 predicados. Isto é
equivalente a duas
faça caso var1 instruções
3 aninhadas.
REGIÃO 2 REGIÃO 3
instrução6 instrução7
7 8 instrução8
REGIÃO 4
instrução9
9
Utilizando a fórmula:
• V(G) = 5 (regiões)
• V(G) = 4 (predicados) + 1 = 5
• V(G) = 13 (bordas) – 10 (nodes) + 2 = 5
ETAPA 4. Determinar caminho básico de trajetos da execução.
A complexidade ciclomática fornece o número de trajetos independentes no código, linearmente.
No exemplo acima, 5 trajetos lineares independentes são identificados.
Trajeto 1: node-1, node-2, node-3, node-4, node-9
Trajeto 2: node-1, node-2, node-3, node-5, node-9
Trajeto 4: node-1, node-2, node-3, node-6, node-8, node-9
Trajeto 3: node-1, node-2, node-3, node-6, node-7, node-9
Trajeto 5: node-1, node-11
ETAPA 5: Documentar os casos de teste baseados no trajeto identificado da execução.
Casos de teste são preparados para forçar a execução de cada trajeto. Condições ou predicados
de nodes devem ser corretamente ajustados. Cada caso de teste é executado e comparado com o
respectivo resultado. Exemplo:
TRAJETO 1 - Caso de Teste:
Engenharia de Software 8
JEDITM
Para node-1, condição2 deve avaliar como VERDADEIRO (Identifica os valores necessários)
Para node-3, avaliação da var1 deve conduzir ao node-4 (Identifica valor de var1)
Resultados esperados: deve produzir necessariamente resultado para node-9.
Para uma iteração simples, os casos de teste podem ser produzidos pelas seguintes possíveis
execuções de iteração ou repetição.
• Salte o laço.
• Somente uma passagem através do laço.
• Duas passagens através do laço.
• m passagens através do laço, onde m < n
• n – 1, n, n + 1 passagens através do laço
Engenharia de Software 9
JEDITM
Para iterações aninhadas, os casos de teste podem ser produzidos pelas seguintes possíveis
execuções de iteração ou repetição.
• Comece com o laço mais interno.
• Conduza testes de laço simples para o laço mais interno ao prender o laço exterior em seus
valores de parâmetros mínimos da iteração. Adicione o outro teste para valores fora de limite
ou valores excluídos.
• Trabalhe de dentro para fora, conduzindo testes para laço seguinte mas mantendo todos os
laços exteriores restantes em valores mínimos e em outros aninhados com valores “típicos”.
• Continue até todos os laços serem testados.
Para a Iteração Concatenada, os casos de teste podem ser produzidos pelas seguintes possíveis
execuções de iteração ou repetição.
• Se os laços são independentes, o teste para laços simples pode ser utilizado.
• Se os laços são dependentes, o teste para laços aninhados pode ser utilizado.
Para Iteração não estruturada, os casos de testes não devem ser produzidos desde que seja o
melhor para replanejar o laço e pode ser que não seja uma boa forma de iteração ou construção
de repetição.
3. Teste de fluxo de dados. É um método de produção de caso de teste que seleciona os
trajetos de acordo com a localização das definições e utilizações de variáveis no código.
Utilizando nodes e bordas, crie o gráfico dos objetos do sistema. Os nodes representam os
objetos. Propriedades podem ser usadas para descrever os nodes e bordas. Para engenharia de
software orientada a objetos, o diagrama de colaboração é uma excelente forma de entrada de
Engenharia de Software 10
JEDITM
dados para os testes baseados em gráficos, pois não se faz necessário a criação de gráficos. O
diagrama de colaboração na Figura 3 é usado como um exemplo.
PASSO 2: Utilizar os gráficos para definir casos de teste.
Os casos de teste são:
Caso de Teste 1:
• A classe FindAthleteUI envia uma solicitação para pesquisar uma lista de atletas baseada
em um critério de busca. A solicitação é enviada para FindAthleteRecord.
• FindAthleteRecord envia uma mensagem para DBAthlete para processar o critério de
busca.
• DBAthlete solicita ao servidor de banco de dados que execute a instrução SELECT. Isto
preenche a classe PCLAthlete com as informações do atleta. Retorna a referência de
PCLAthlete para AthleteListUI.
• AthleteListUI lista os nomes dos atletas.
Dicas para os Testes Baseados em Gráficos:
1. Identificar o ponto de inicio e término do gráfico. Estes poderão ser os nodes de entrada e
saída.
2. Nomear os nodes e especifique as propriedades.
3. Estabelecer seus relacionamentos através das bordas. Especifique suas propriedades.
4. Criar casos de teste e garantir que cobra todos os nodes e as bordas.
Engenharia de Software 11
JEDITM
Engenharia de Software 12
JEDITM
4. Testando Classes
Testes de projeto podem ser realizados em várias etapas ou tarefas. Testes de projeto se
preocupam com testes individuais (testes de unidade) ou com seus relacionamentos uns com os
outros (teste de integração de sistema). Nesta sessão iremos discutir os conceitos e métodos que
permitem realizar testes em classes.
Para se criar testes de unidade que sejam eficazes, faz-se necessário entender o comportamento
da unidade no sistema que se está testando. Isto geralmente é feito decompondo os requisitos do
sistema em pedaços simples que podem ser testados independentemente. É importante que os
requisitos do projeto possam ser transformados em casos de teste.
Na engenharia de software orientada a objetos, o conceito de encapsulamento é utilizado para
definir a classe; os dados (atributos) e funções (métodos e operações) são agrupados numa
mesma classe. As menores unidades de teste são as operações definidas nessas classes. Contrária
a forma de se realizar testes, operações definidas na classe não podem ser separadas para que o
teste seja realizado. Isto deve ser testado no contexto dos objetos da classe instanciada. Como
um exemplo, considere o diagrama de classe mostrado na Figura 5.
Engenharia de Software 13
JEDITM
O método draw() é definido na classe Shape. Todas as subclasses da classe Shape conterão
este método por meio de herança. Quando uma subclasses utiliza o método draw(), ele é
executado juntamente com os atributos privados e outros métodos no contexto da subclasse. O
contexto no qual o método é usado varia dependendo de que subclasse o executa.
Consequentemente, é preciso testar o método draw() em todas as subclasses que o utilizam.
Como o número de subclasses é definido para a classe base, mais testes serão necessários.
Engenharia de Software 14
JEDITM
6. A tela AthleteListUI será exibida contendo uma lista com os atletas que satisfazem os
critérios utilizados na pesquisa.
7. A comissão selecionará o atleta que se deseja recuperar.
8. A comissão pressiona o botão OK ou pressiona enter.
9. A tela AthleteRecordUI deverá ser mostrada contendo as informações do atleta nos
campos apropriados.
Para auxiliar na integração, Clustering pode ser usado. Clustering é o processo que define um
grupo de classes que podem ser integradas e testadas juntas. Estas são chamadas de clusters
porque são consideradas como sendo uma unidade. No exemplo, as três classes combinadas
podem ser identificadas como sendo um Cluster DBAthlete.
Engenharia de Software 15
JEDITM
Engenharia de Software 16
JEDITM
implementação dos requisitos. Usar essas duas fontes como informação torna muito mais
fácil para o desenvolvedor entender o módulo e realizar as mudanças que não irão introduzir
falhas no projeto.
7. Melhorar o projeto. Fazer com o que o desenvolvedor escreva os testes de unidade antes
da codificação ajuda o mesmo a entender melhor o comportamento do projeto como um todo
e ajudar a pensar no sistema do ponto de vista do usuário.
2. Fazer com que o teste rode de forma mais fácil e rápida possível. Não é necessário
preocupar-se com o código-fonte; deve fazer com que funcione. No exemplo de caso
utilizado, o código-fonte que estamos fazendo referência é a classe AthleteStatistics que
contém o método que calcula a média de um atleta em um jogo ou em uma temporada. Uma
vez o teste escrito, ele é executado para verificar a possível existência de falhas. A classe
falha pois o código para a implementar o comportamento ainda não foi escrito. Uma vez que
Engenharia de Software 17
JEDITM
1 Foi mantido o Software Java Studio™ Enterprise 8 conforme no original em inglês, entretanto, esta seção para as
vídeo-aulas utilizará o software NetBeans (N.T.).
Engenharia de Software 18
JEDITM
Figura 8 como a classe a ser testada. Crie um novo teste selecionando Tools → JUnit Tests →
Create Tests na barra de menus. Tenha certeza de que a classe a testar está devidamente
selecionada. De outro modo, os testes para uma classe podem ser criados com um clique direito
do mouse sobre o nome da classe e selecionando Tools → JUnit Tests → Create Tests.
Na janela Create Tests, selecionar as opções de Code Generation para a realização do teste. A
IDE gera um modelo com as opções que foram especificadas. Neste caso, nada será marcado com
a exceção da opção Public. O nome da classe para o teste pode, inclusive, ser modificado (Figura
9). As configurações do JUnit podem ser modificadas no JUnit Module Settings (Módulo de
Configuração do JUnit) ou ainda na própria janela para a criação de testes. Pressionar o botão OK
irá gerar uma estrutura básica de testes (Figura 10).
Os métodos podem ser escritos utilizando-se expressões de testes da classe Assert (Classjunit.
framework.Assert). Figura 11 nos mostra alguns métodos escritos para testar o código da Figura
Engenharia de Software 19
JEDITM
1. Para executar o teste, selecione Run → Test “project-name” na barra de menus. A saida do
teste será gerado pela IDE.
Se ocorrer alguma falha nos testes o erro será mostrado e, em seguida, o que causou o erro.
Neste caso, o testSampleMethod1 falhou, pois o que era esperado foi diferente do que foi
obtido. Já o testSampleMethod2 não falhou, por isso, nenhuma mensagem de erro foi
mostrada.
A suite de testes pode ser editada de forma a adicionar novos testes fora do arquivo. Outras
suites de testes podem ser incluídas no nosso teste. Outros métodos como setUp() e
tearDown() podem ser incluídos nos testes. Estes métodos são chamados de testes de fixação
pois os mesmo são executados antes ou depois dos testes.
Engenharia de Software 20
JEDITM
/*
* SampleClassTest.java
*/
import junit.framework.*;
Engenharia de Software 21
JEDITM
6. Testando o Sistema
O teste de sistema é preocupa-se em testar um sistema inteiro baseado em sua especificação. O
software a ser testado é comparado com a sua especificação funcional. Depois do teste de
integração, o sistema é testado como um todo com foco na funcionalidade e exatidão. Isto deve
incluir testes como o de performance, que testa o tempo de resposta e utilização de recursos;
teste de estresse, que testa o software sujeito a quantidade, freqüência e volume de dados,
pedidos e respostas anormais; teste de segurança, que testa os mecanismos de proteção do
software; teste de recuperação, que testa o mecanismo de recuperação do software quando ele
falha; etc.
No contexto de engenharia de software orientada a objeto, os requisitos de teste são derivados
dos artefatos de análise ou produtos que usem UML, como diagramas de classe, de seqüência e
de colaboração. Para derivar os casos de teste de sistema, o uso do diagrama de caso de uso é
uma boa fonte. Eles representam as funcionalidades de alto nível providas ao usuário pelo
sistema. Conceitualmente, a funcionalidade pode ser vista como um conjunto de processos, que
são executados horizontalmente pelo sistema, e de objetos, como componentes de subsistema
que são executados verticalmente. Cada funcionalidade não usa cada objeto; entretanto, cada
objeto pode ser usado por muitas requisições funcionais. Esta transição de visão funcional para
orientada à objeto é conseguida com casos e cenários.
Entretanto, estes casos não são independentes. Eles não têm apenas as dependências de
extensão e inclusão. Têm também dependências seqüenciais que vêm da lógica do negócio em
que o sistema se apóia. Quando planejamos casos de teste, precisamos identificar nas possíveis
seqüências de execução como elas podem disparar diferentes falhas.
Um cenário é uma instância de um caso de uso ou um caminho completo de um caso de uso. Os
usuários finais do sistema completo podem percorrer muitos caminhos enquanto executam a
funcionalidade especificada no caso de uso. Cada caso de uso deve ter um fluxo básico e um fluxo
alternativo. O fluxo básico cobre o fluxo normal do caso de uso. O fluxo alternativo cobre o
comportamento de uma exceção ou de um caminho opcional, levando em consideração o
comportamento normal do sistema.
A seção seguinte fornece os passos para derivar os casos de teste dos casos de uso. Ela consiste
em uma adaptação de Heumann2.
2 Heuman, J. Generating Test Cases for Use Cases. The Rational Edge, Rational Rose Software, 2001.
Engenharia de Software 22
JEDITM
Considere o RTM formulado durante a análise mostrado na Tabela 3. Os usuários devem decidir
fazer o Caso de Uso 1.0 e seus sub-casos de uso antes do resto.
PASSO 2: Para cada caso de uso, crie os cenários.
Para cada caso de uso, começando da prioridade maior para a menor, crie um conjunto suficiente
de cenários. Ter uma descrição detalhada de cada cenário como suas entradas, pré-condições e
pós-condições pode ser muito útil nos estágios futuros da geração de testes. A lista de cenários
deve incluir o fluxo básico e, pelo menos, um fluxo alternativo. Quanto mais fluxos alternativos,
mais compreensiva será a modelagem e, conseqüentemente, testes mais completos. Como
exemplo, considere a lista de cenários para incluir um atleta ao sistema na Tabela 4.
PASSO 3: Para cada cenário, obter pelo menos um caso de teste e identificar as condições de
execução.
As pré-condições e o fluxo de eventos de cada cenário podem ser examinadas para identificar as
variáveis de entrada e as restrições que trazem o sistema a um estado específico representado
pelas pós-condições. Uma matriz é apropriada para uma documentação clara dos casos de teste
para cada cenário. Como exemplo, considere a matriz mostrada na Tabela 5.
Mensagem de erro:
TC-05 Sistema indisponível V I
Sistema indisponível.
Engenharia de Software 23
JEDITM
A matriz de teste representa um framework de teste sem envolver valores específicos de dados. O
V indica válido, o I indica inválido e N/A indica não aplicável. Esta matriz é um passo
intermediário e provê um bom método para documentar as condições que estão sendo testadas.
PASSO 4: Para cada caso de teste, determinar os valores para os dados.
Uma vez que todos os testes foram identificados, eles devem ser completados, revisados e
validados para garantir a acurácia e identificar os casos de teste redundantes ou ausentes. Se isto
é alcançado, o próximo passo é determinar os valores para cada V e I. Antes de distribuir o
aplicativo, ele deve ser testado usando dados reais para ver se outros problemas, como
performance, são identificados. A Tabela 6 mostra algumas amostras de valores.
Engenharia de Software 24
JEDITM
Engenharia de Software 25
JEDITM
Engenharia de Software 26
JEDITM
8. Métricas de Teste
As métricas usadas para medir a qualidade de um projeto orientado a objeto mencionadas na
Engenharia de Projeto também podem prover uma indicação da quantidade de esforço de teste
necessária para testar software orientado a objeto. Além disso, outras métricas podem ser
consideradas para encapsulamento e herança. Exemplos de tais métricas seguem abaixo:
1. Falta de Coesão nos Métodos - Lack of Cohesion in Methods (LCOM). Se o valor do LCOM
é alto, mais estados da classe precisam ser testados.
2. Porcentagem Public e Protected - Percent Public and Protected (PAP). Esta é a medida da
porcentagem dos atributos de classe que são public ou protected. Se o valor do PAP é alto,
aumenta a probabilidade de efeitos colaterais em outras classes por lidar com um alto
acoplamento.
3. Acesso Público a Data Members - Public Access To Data Members (PAD). Esta é uma
medida do número de classes ou métodos que acessam atributos de outras classes. Se o
valor do PAD é alto, poderão ocorrer muitos efeitos colaterais.
4. Número de Classes Raiz - Number of Root Classes (NOR). Se o número de classes root
aumenta, o esforço de teste também aumenta.
5. Número de Filhos - Number of Children (NOC) – e Profundidade de Árvore de Herança
- Depth of the Inheritance Tree (DIT). Métodos de superclasses devem ser novamente
testados para cada subclasse.
Engenharia de Software 27
JEDITM
9. Exercícios
9.1. Especificando um Caso de Teste
1. Usando o Teste de Fluxo Básico, escreva os casos de testes que devem ser feitos para o
método Obter o Registro de um Atleta. Determine a complexidade ciclomática do código para
determinar o número de caminhos independentes. Cada um destes caminhos tornar-se-á um
caso de teste.
Engenharia de Software 28
Módulo 4
Engenharia de Software
Lição 7
Introdução ao Gerenciamento do Projeto de
Software
1. Objetivos
O desenvolvimento de software para computador envolve uma variedade de fases, atividades e
tarefas. Algumas dessas atividades são realizadas iterativamente até que o software fique pronto
e entregue aos usuários finais para sua utilização.
Entretanto, antes que o desenvolvimento possa começar, usuários e desenvolvedores precisam
estimar qual será a duração do projeto e quanto ele irá custar. Não é intenção deste capítulo
discutir detalhadamente o gerenciamento do projeto de software. Isto está reservado para o
Curso de Gerenciamento do Projeto de Software. A discussão nesta lição será realizada em torno
dos conceitos de gerenciamento de projeto que auxiliarão a gestão do gerenciamento de projetos
de software baseado em classes.
Ao final desta lição, o estudante será capaz de:
• Conhecer conceitos de gerenciamento básico de projeto de software
• Entender definição e identificação do problema
• Saber como organizar o projeto
• Saber como agendar atividades do projeto
• Saber como alocar recursos para o projeto
• Aprender métricas de software
• Saber calcular estimativas de custo e esforço para um projeto
• Entender gerenciamento de risco
• Entender gerenciamento de configuração de software
Engenharia de Software 4
JEDITM
Identificação do Problema
É a tarefa onde um projeto proposto é identificado, definido e justificado. Um projeto proposto
pode ser um novo produto, implementação de um novo processo ou um aprimoramento de um
recurso existente.
Definição do Problema
É a tarefa onde o propósito do projeto é esclarecido. A declaração da missão do projeto de
software é a principal saída desta tarefa. Ela deverá especificar como o gerenciamento de projeto
deverá ser utilizado para evitar perda de prazos, agendamentos mal elaborados, alocação
inadequada de recursos, falhas de coordenação, baixa qualidade e conflito de prioridades.
Planejamento do Projeto
Esta tarefa define o Plano de Projeto. Descreve uma série de ações ou passos necessários para
o desenvolvimento do produto de trabalho ou meta de acompanhamento. Isto é especificado
como uma inicialização do projeto e executa estes objetivos. Componentes comuns do plano de
projeto são incluídos nos objetivos do projeto, definição do projeto, time e critérios de
performance ou critérios de validação.
Organização do Projeto
É a tarefa que especifica como integrar as funções dos recursos humanos no projeto. Ele é
usualmente realizado concorrentemente com o planejamento do projeto. Requer habilidade de
direção, orientação e supervisão da equipe do projeto. É necessário tornar claras as expectativas
de cada pessoa da equipe e identificar como suas funções contribuirão no conjunto de metas
globais do projeto.
Alocação de Recursos
É a tarefa de alocar recursos para o projeto tais como, dinheiro, pessoas, equipamentos,
ferramentas, instalações, informações, técnicas, com o propósito de atingir as metas e objetivos
Engenharia de Software 5
JEDITM
do software.
Cronograma do Projeto
É a tarefa de alocar recursos para que todos os objetivos do projeto sejam alcançados dentro de
um espaço de tempo razoável. Envolve a definição de períodos de tempo específicos para tarefas
dentro da agenda de trabalho. Utiliza técnicas como: análise de disponibilidade de recursos
(humano, material, dinheiro) e técnicas elaboração de cronogramas de PERT, CPM e Gráficos de
Gantt.
Término do Projeto
É a tarefa que envolve a submissão do relatório final, a colocação em funcionamento do novo
equipamento ou o sinal para liberação de uma versão. Ela pode dar início a um projeto
subsequente ou complementar.
Engenharia de Software 6
JEDITM
Sumário Executivo
Ele oferece uma introdução para o projeto que inclui informações de suporte indicando o início do
projeto e o sumário do trabalho a ser realizado. Ele responde às questões de porque o projeto é
importante, qual é a oportunidade de negócio ou necessidade que irá atender e qual é o suporte
de informações pertinente.
Escopo
Define os limites do projeto. Descreve as funções e processos que estarão envolvidos no projeto.
Engenharia de Software 7
JEDITM
Responde à questão de qual é a realização final esperada desta proposta, o que estará incluído no
projeto, o que não estará incluído no projeto, quem é o cliente e que solicitou o desenvolvimento
do projeto.
Critério de Sucesso
Identifica os principais resultados que deverão ser atingidos para que o projeto esteja completo.
Oferece medidas específicas para utilização no julgamento de sucesso. Deverá dar suporte aos
objetivos do projeto. Responde às questões de como saberemos quando o projeto está completo,
quem irá julgar o sucesso do projeto e como irá julgar esse sucesso.
Alternativas
Define soluções alternativas para o problema do negócio ou necessidade. A alternativa pode ser
“fazer ou comprar” ou abordagem técnica tais como codificação tradicional, desenvolvimento
orientado a objetos ou ferramenta CASE, integração das edições, reengenharia de processo de
negócio. Cada alternativa deverá ser avaliada para determinar um cronograma. Responde às
questões de quais os principais produtos, qual relação lógica entre os principais produtos, que
pressupostos serão utilizados para definir o cronograma, qual é a dimensão razoável do
cronograma baseado no tamanho, esforço, dependências e compromissos.
Custos
Representa um custo estimado para o desenvolvimento do software. Ele é representado como
uma gama de valores. Responde às questões de quais são os custos associados com o esforço
requerido para produzir cada um dos principais subprodutos, quais são os custos associados com
hardware e software, quais são ou outros custos não laborais que devem ser considerados e qual
é o custo operacional que precisa ser identificado e considerado.
Benefícios
Podem ser benefícios de curto ou longo prazo. Inclui potenciais economias, recuperações,
posicionamento de produtos ou da empresa, aumento de quantidade ou qualidade, crescimento
de produtividade e outros benefícios tangíveis ou intangíveis.
Riscos
Identifica riscos de cada alternativa e como os riscos podem ser reduzidos. Deverá ser analisado
com base na probabilidade de ocorrência e impacto.
Recomendações
A equipe da proposta de projeto deverá trabalhar junto para selecionar a melhor alternativa que
ofereça maior equilíbrio em termos de cronograma, custo/benefício e riscos do projeto. Deverá
atender aos objetivos do projeto da melhor forma possível.
Engenharia de Software 8
JEDITM
4. Organização do Projeto
A organização do projeto integra as funções das pessoas em um projeto. É necessário
identificar claramente as expectativas de cada pessoa e que seja comunicado como sua função
contribuirá no conjunto de metas e objetivos do projeto para que haja colaboração. Esta tarefa
exige a compreensão da estrutura de desenvolvimento de sistemas da empresa. Figura 2 ilustra
esta estrutura.
Comitê Diretivo
Define alguns problemas da empresa que têm grande efeito no desenvolvimento do projeto. Ele é
composto pela cúpula gerencial (Presidente, CEO ou Diretor Administrativo ou Parceiro), linha de
Gerentes (Vice-presidentes ou Chefes de Divisão), Gerentes (Planejamento da Empresa,
Controladores), MIS ou gerentes EDP e opcionalmente Consultores. Suas funções consistem em:
• formalizar a composição da equipe do projeto;
• revisar e aprovar os planos de projeto e recomendações;
• aprovar e alocar recursos para o projeto;
• sincronizar o esforço de desenvolvimento do sistema com as demais atividades da
organização;
• averiguar regularmente o progresso do projeto;
• resolver situações de conflito;
• aprovar requisições de alterações críticas; e
• liberar versões operacionais do sistema para o usuário.
Equipe de Projeto
Composta de dois grupos, denominados, desenvolvedores e usuários finais. Desenvolvedores
consistem de gerente de projeto, analistas, projetistas, programadores e membros do controle de
qualidade. O grupo de usuários finais consiste de EDP e Equipe MIS, equipe de usuários,
colaboradores casuais e consultores. É um pequeno grupo com um líder ou gerente. Eles
regularmente interagem para que as metas sejam atingidas. Requer espírito de equipe,
contribuição e coordenação.
Engenharia de Software 9
JEDITM
Características do Projeto DD CD CC
Nível de Dificuldade do Problema Alto Baixo Baixo
Tamanho do Software (Linhas de Código ou Pontos por Função) Pequeno Grande Grande
Duração da Equipe Longa Curta Curta
Modularidade do Programa Baixa Alta Alta
Requisito de Confiabildade do Sistema (Reliability) Alta Alta Baixa
Rigidez na Data de Entrega Flexível Flexível Rígido
Grau de Sociabilidade Alta Baixa Baixa
Tabela 1: Característica do Projeto versus Estrutura da Equipe
É uma matriz que consiste de colunas de áreas funcionais ou individuais, e linhas com ações
requeridas. Ele representa a necessidade de comunicar expectativas e responsabilidades entre o
pessoal envolvido no desenvolvimento do software. Evita problemas encontrados na comunicação
e na possibilidade de indefinição de obrigações. Ele responde às seguintes questões:
• Quem faz o que?
• Quanto tempo levará?
• Quem informará quem sobre algo?
• Quem deverá aprovar o que?
• Quem é responsável por cada resultado?
• Quais interfaces pessoais são necessárias?
• Qual suporte é necessário para quem e quando?
Um modelo de matriz de responsabilidade do projeto é mostrada na Tabela 2.
Atividade Presid. Líder Proj. Analista Progr. 05/Nov 06/Nov 07/Nov 08/Nov
1. Tarefa Reunião Conjunta
1.1 Redigir pedido do produto R T
1.2 Marcar reunião conjunto R R T
1.2.1 Marcar data e hora I R R T
1.2.2 Marcar lugar I R R T
1.2.3 Identificar particip. e facilitadores C I R E
1.3 Convidar participantes R E
1.4 Distribuir pedido do produto C R
Tabela 2: Matriz de Responsabilidade do Projeto
Legenda:
• Código de Responsibilidade: R-Responsável I-Informa C-Consulta S-Suporte
• Código Tarefa: T-Terminada E-Execução A-Atrasada
Engenharia de Software 10
JEDITM
5. Cronograma do Projeto
Cronograma do Projeto é a tarefa que descreve o processo de desenvolvimento do software
para um projeto particular. Enumera fases ou estágios do projeto, e divide cada um dentro de
tarefas ou atividades discretas que serão executadas, identifica as interações entre as partes do
trabalho e estima o tempo para cada tarefa ou atividade ser executada. É uma sequência de
atividades planejadas no tempo sujeitas a relacionamentos de precedências, restrições de tempo
e limitações de recursos com a finalidade de atingir objetivos específicos.
É um processo da equipe que dá início à formulação do programa de trabalho. É um processo
iterativo que deve ser flexível para acomodar mudanças. Há certos princípios básicos utilizados na
criação do cronograma do projeto. Alguns deles estão enumerados abaixo:
1. Compartimentalização. O produto e o processo são decompostos em atividades e tarefas
tangíveis.
2. Interdependência. Cada atividade ou tarefa compartimentalizada deve ser determinada.
Tarefas podem ocorrer em sequência ou em paralelo. Tarefas podem ocorrer
independentemente.
3. Alocação de Tempo. Cada tarefa deverá ser alocada em algum número de unidades de
trabalho (pessoa/dia ou homem/dia). Cada tarefa deverá ter uma data de início e fim
sujeitas às interdependências e pessoas responsáveis pela tarefa (part-time ou full-time).
4. Validação de Esforço. Em nenhum momento o número de pessoas alocadas é maior que o
número de pessoas disponíveis.
5. Definição de Responsabilidade. Cada tarefa deverá ter um dono. Ele deverá ser um
membro da equipe.
6. Definição de Resultado. Cada tarefa deverá ter um resultado definido. Os produtos do
trabalho são combinados em entregas.
7. Definição de Milestones. Cada tarefa ou grupo de tarefas deverão ser associadas com um
marco do projeto. Milestones do projeto são pontos de revisão para qualidade e para
aprovação do patrocinador do projeto.
O Cronograma do Projeto identifica conjuntos de atividades ou tarefas, marcos e entregas.
1. Conjuntos de Atividades ou Tarefas. Uma coleção de atividades da engenharia de
software, marcos e entregas que deverão ser realizadas para completar um projeto em
particular. É a parte do projeto que tem lugar sobre um período de tempo. É descrito como
um verbo no gerúndio.
2. Milestones. Uma indicação de que alguma coisa foi completada. Faz referência a um
momento particular no tempo. Significa pontos de realização dentro do cronograma do
projeto. Ele não é a duração do trabalho. Exemplos de milestones de projeto são aprovação
do usuário, aprovação do projeto do sistema e data de recuperação do investimento no
sistema.
3. Entregáveis. Uma lista de itens que um cliente espera ver durante o desenvolvimento do
projeto. Pode incluir documentos, demonstrações de funcionalidades, demonstrações de
subsistemas, demonstrações de precisão, confiabilidade, segurança ou velocidade.
A WBS - Work Breakdown Structure é uma ferramenta que permite aos gerentes de projeto
definir o conjunto de tarefas, milestones e entregáveis. É uma abordagem de análise sistemática
de detalhamento do projeto como um conjunto discreto de unidades de trabalho. As tarefas e os
milestones podem ser usados no projeto para acompanhar o desenvolvimento e a manutenção.
Dois métodos são utilizados na definição da estrutura de divisão do trabalho. São denominados
Análise da Divisão do Trabalho, Decomposição top-down e Integração bottom-up.
Engenharia de Software 11
JEDITM
Há dois formatos comuns que podem ser utilizados para representar a WBS, denominados
diagrama gráfico ou hierárquico e esquema de tópicos.
Diagrama Gráfico ou Hierárquico
Um exemplo de um diagrama hierárquico da Tarefa Reunião Conjunta Prévia da Engenharia de
Requisitos é mostrada na Figura 3.
Engenharia de Software 12
JEDITM
Gráfico de GANTT
Este é um modo fácil de escalonar tarefas. Ele é um diagrama que consiste de barras que indicam
a duração da tarefa. A dimensão horizontal indica o tempo, enquanto que a dimensão vertical
indica a tarefa. Tabela 3 mostra um exemplo de gráfico de GANTT.
1 2 3 4 5 6
Engenharia de Software 13
JEDITM
Há diversos fatores que devem ser considerados quando da alocação de recursos. Alguns deles
são listados abaixo.
• Limitações na disponibilidade do recurso
• Restrições de precedências
• Restrições de subdivisões de atividades
• Atividades imprevistas
• Data de término do projeto
• Substituição de recursos
• Assinalamento parcial de recursos
• Atividades mutuamente exclusivas
• Disponibilidade variável de recursos
• Variação na duração das atividades
Alocação de recursos para um grupo de tarefas do Projeto.
Grupo de Tarefas do Projeto Recursos
1. Tarefa reunião conjunta prévia
1.1 Redigir pedido do produto Usuários finais que irão redigir o pedido do produto
Engenharia de Software 14
JEDITM
Engenharia de Software 15
JEDITM
7. Métricas de Software
Referem-se a uma variedade de indicadores utilizados em software de computadores. Esses
indicadores podem ser aplicados ao processo de software com o objetivo de melhoria contínua do
processo. Podem ser utilizadas através do projeto para auxiliar em estimativas, controle de
qualidade, avaliação de produtividade e controle do projeto. Podem ainda ser utilizadas pelos
engenheiros de software para assegurar a qualidade dos produtos e auxiliar na tomada de
decisões táticas conforme o projeto evolui.
Métricas de Software são utilizadas como indicadores para propiciar melhor compreensão do
processo de software, do projeto ou do software. Permitem aos engenheiros de software tomar
decisões de como prosseguir com o esforço de desenvolvimento.
Categorias de Métricas
Estas são as linhas gerais de duas categorias métricas:
1. Métricas Diretas. No processo de software elas podem ser o custo e o esforço dispendido.
No software, podem ser linhas de código (LOC – Lines of Codes) produzidas, número de
classes, velocidade de execução, espaço em memória e defeitos reportados em um período
de tempo.
2. Métricas Indiretas. Podem ser medidas de produtos tais como funcionalidade, qualidade,
complexidade, eficiência, confiabilidade, manutenibilidade, etc.
Exemplos de métricas que são aplicadas a projetos de software são brevemente enumeradas
abaixo.
Um medida direta utilizada para métrica de software é Linhas de Código (LOC). Ela é uma métrica
orientada ao tamanho utilizada para estimar esforço e custo. É importante que as métricas de
outros projetos sejam colocadas em uma tabela para servir de referência durante a realização da
estimativa. Tabela 5 mostra um exemplo disto.
Projeto Esforço Custo KLOC Págs Erros Pessoas
(em pessoas-mês) (em P) (mil linhas de cód.) (de Doc.)
Projeto Um 24 120 12.1 365 29 3
Projeto Dois 62 450 27.2 1224 86 5
Projeto Três 43 213 20.2 1050 64 6
Engenharia de Software 16
JEDITM
Nesta tabela, esforço em pessoas-mês especifica o número de meses em que o projeto foi
desenvolvido, custo é o dinheiro gasto na produção do software, KLOC são as linhas de código
produzidas, páginas é o número de páginas de documentação, erros é o número de erros
reportados depois que o software foi entregue para o cliente e pessoas é o número de pessoas
que desenvolveram o software.
Alguém poderia derivar métricas desta tabela. Exemplos de cálculos são mostrados abaixo.
Produtividade = KLOC / pessoas-mês
Qualidade = erros / KLOC
Custo = Custo / KLOC
Documentação = Páginas / KLOC
Outra métrica comumente utilizada é a métrica de Pontos por Função (PF). É focada na
funcionalidade ou utilidade do programa. Utiliza um relacionamento empírico baseado em
mensurações contáveis de domínio de informação e estimativas de complexidade do software.
Engenharia de Software 17
JEDITM
4. Performance é crítica?
5. Sistema irá rodar em ambiente operacional conhecido e bastante utilizado?
6. Sistema requer entrada de dados on-line?
7. Entrada de dados on-line requer múltiplas telas e operações ?
8. Arquivos principais são atualizados on-line?
9. Entradas, saídas, arquivos ou consultas são complexos?
10. Processamento interno é complexo?
11. Código modelado pode ser reusável?
12. Procedimentos de instalação e migração foram incluídos no projeto?
13. Sistema foi projetado para múltiplas instalações em diferentes organizações?
14. Sistema foi projetado para facilitar alterações e utilização pelo usuário?
Engenharia de Software 18
JEDITM
8. Métricas de Software
Avaliações de Projeto
São necessárias para auxiliar engenheiros de software a determinar o esforço e o custo requeridos
na construção do software. Para fazer a avaliação, é necessário experiência, acesso a uma boa
série histórica de dados, e comprometimento para quantificar medidas quando dados qualitativos
é tudo o que existe.
Pode-se usar LDC e PF para o provimento de estimativas de custo e esforço. Ambos têm variáveis
para quantificar o "tamanho" de cada elemento de software. Ambos têm métricas de baseline
coletadas de projetos anteriores e utilizadas em conjunto com variáveis de estimativa para o
cálculo de projeções de esforço e custo.
Como exemplo, considere as estimativas de projeto de um sistema de manutenção de associados
de um clube. Utilize LDC e PF para determinar as estimativas de custo e esforço. Calculamos
primeiro o PF.
Domínio de Informação Fator de Peso
Parâmetro de Medição Qtd Simples Média Complexa
Engenharia de Software 19
JEDITM
Engenharia de Software 20
JEDITM
9.1. Histórico
Define um conjunto de problemas ou áreas de melhoria que podem ser vistas dentro do histórico
do sistema.
Declaração do que será alcançado ou será feito. Define as metas globais do projeto sem
considerar como estas metas serão alcançadas. Deveria ser SMART (Esperto):
Specific – Específico
Measurable – Mensurável
Attainable – Atingível
Result-oriented – Orientado a resultado
Time-bound – De tempo limitado
Engenharia de Software 21
JEDITM
Identifica as pessoas necessárias para realizar o projeto e os papéis que eles precisam
desempenhar.
Engenharia de Software 22
JEDITM
A primeira coluna lista todos os riscos possíveis, inclusive aqueles que muito provavelmente não
Engenharia de Software 23
JEDITM
irão acontecer. Cada risco é então categorizado. A categorização identifica os tipos de risco,
enumerados abaixo de forma genérica.
1. Tamanho do Produto. São os riscos relacionados com o tamanho geral do software que
precisa ser desenvolvido.
2. Impacto no Negócio. São os riscos relacionados às restrições de mercado e gerenciamento.
3. Característica do Cliente. São os riscos relacionados aos requisitos do usuários final e a
habilidade da equipe de desenvolvimento de entender-se e comunicar-se com os mesmos.
4. Definição de Processo. São os riscos relacionados ao processo de software e como as
pessoas envolvidas no esforço de desenvolvimento estão organizadas.
5. Ambiente de Desenvolvimento. São os riscos relacionados à disponibilidade e qualidade
das ferramentas utilizadas no desenvolvimento do software.
6. Tecnologia. São os riscos relacionados à complexidade do sistema e ao grau de inovação
que faz parte do software.
7. Tamanho e Experiência da Equipe. São os riscos relacionados à técnica em geral e
experiência em projetos dos engenheiros de software.
O valor provável do risco é identificado como valor percentual dele ocorrer. A seguir, o seu
impacto quando verificada sua ocorrência. É estimado utilizando os seguintes valores.
1. Catastrófico. Resultaria em fracasso no atendimento dos requisitos e a não aceitação do
software.
2. Crítico. Resultaria em fracasso no atendimento de requisitos relacionados com a degradação
de performance do sistema a um ponto em que seu sucesso seja questionável.
3. Marginal. Resultaria em fracasso no atendimento de requisitos, o que acarretaria
degradação da missão secundária.
4. Desprezível. Resultaria em inconveniências e problemas de uso.
A última coluna contém plano de MMGR(Mitigação, Monitoração e Gerenciamento de Risco) de
cada risco. Tem os seguintes componentes:
1. Identificador (ID) do Risco. É um número único de identificação atribuído ao risco.
2. Descrição. Breve descrição do risco.
3. Contexto de Risco. Define a condição pela qual o risco pode ser concretizado.
4. Mitigação e Monitoração. Define os passos necessários a serem executados a fim de
mitigar e monitorar o risco.
5. Plano de Contingência. Define os passos necessários a serem executados quando o risco é
concretizado.
Pode-se utilizar a lista abaixo para determinação dos riscos inerentes ao projeto de
desenvolvimento de software.
Riscos de Tamanho do Produto
O tamanho do produto é diretamente proporcional ao risco do projeto. Como engenheiros de
software, devemos prestar atenção no seguinte:
• O quão grande foi estimado o software em termos de linhas de código e pontos por função?
• Qual a quantidade de programas, arquivo e transações?
• Qual o tamanho do banco de dados?
• Qual a quantidade de usuários estimada?
• Quantos componentes são reutilizados?
Engenharia de Software 24
JEDITM
Riscos de Negócio
• Qual é o valor de negócio do software para a empresa ou departamento?
• Qual é a visibilidade do software para a alta direção?
• Quão razoável é a data de entrega?
• Qual a quantidade de clientes?
• Quantos produtos e sistemas interagem com o software?
• Qual o tamanho da documentação do produto?
• Que qualidade tem a documentação do produto?
• Quais são as restrições governamentais inerentes ao desenvolvimento do projeto?
• Qual o custo associado a uma entrega tardia?
• Qual o custo associado a produto defeituoso?
Riscos Relacionados ao Cliente
• Como é o relacionamento de trabalho com o cliente?
• Qual é o nível técnico do cliente para definir seus requisitos?
• Os clientes estarão dispostos a perder tempo para coleta de requisitos?
• Os clientes estarão dispostos a participar de revisões técnicas formais?
• Qual é o nível de conhecimento dos clientes em termos de aspectos tecnológicos do
software?
• O cliente conhece o processo de desenvolvimento do software e o seu papel nesse
desenvolvimento?
Riscos de Processo – Problemas de Processo
• A alta direção apóia ou tem compromisso total com o esforço de desenvolvimento do
software?
• A empresa tem a descrição do processo de software a ser utilizada no projeto?
• A equipe conhece o processo de desenvolvimento do software?
• O processo de software foi utilizado antes em outros projetos pelo mesmo grupo de pessoas?
• A empresa desenvolveu ou adquiriu cursos de treinamento para os gerentes e equipe
técnica?
• Existem padrões de engenharia de software publicados que serão utilizados pelos
desenvolvedores e gerentes?
• Existem esboços e exemplos de entregáveis?
• As revisões técnicas formais de especificação de requisitos, modelagem e código são feitas
regularmente? Têm procedimentos definidos?
• As revisões técnicas formais de procedimentos de teste e casos de teste são feitas
regularmente? Têm procedimentos definidos?
• Os resultados de cada revisão técnica formal são documentados, incluindo erros encontrados
e recursos utilizados? Têm procedimentos definidos?
• Têm procedimentos que assegurem que o trabalho efetuado no projeto esteja em
conformidade com os padrões de engenharia de software?
• Têm gerenciamento de configuração para manter consistência entre sistema/requisitos de
software, modelagem, casos, e casos de teste?
• Existem documentos para declaração de trabalho, especificação de requisitos e plano de
desenvolvimento de software de cada subcontrato?
Riscos de Processo – Problemas Técnicos
• Existe algum mecanismo que facilite uma clara comunicação entre cliente e desenvolvedor?
• Existem métodos específicos utilizados para análise de software?
• Existem métodos específicos para modelagem de componentes?
Engenharia de Software 25
JEDITM
Engenharia de Software 26
JEDITM
11.1. Baseline
Engenharia de Software 27
JEDITM
Tarefas SE
Modificada
Nova Baseline
Uma tarefa de engenharia de software desenvolve um módulo que torna-se um item ou unidade
de configuração de software. Passa pela revisão técnica formal para detecção de erros e falhas.
Uma vez que o módulo passe na verificação ou seja aceitável, torna-se uma baseline e é salva no
banco de dados do projeto. Às vezes, este módulo é extraído do banco de dados do projeto como
entrada de alguma outra tarefa de engenharia de software. Observe que "atualizar" uma ICS
envolve controles e procedimentos. Durante a execução de uma tarefa de ES (Engenharia de
Software), é possível que a ICS tenha sido modificada. Neste caso, a ICS modificada irá passa por
uma outra revisão técnica formal. Se aprovada ou aceitável, a versão modificada torna-se a nova
baseline.
Identificação de Mudança
É o processo de identificação de itens que alteram o processo de desenvolvimento de software.
Tal processo identifica de forma específica os itens de configuração de software (ICS) e atribui um
nome e identificador únicos.
Controle de Versão
É o conjunto de procedimentos e ferramentas utilizados para gerenciar as diferentes versões de
objetos de configuração que são criados durante o processo de desenvolvimento de software.
Uma versão é uma coleção de ICS que pode ser utilizada de forma quase independente.
Controle de Mudança
Consiste em procedimentos manuais e ferramentas automatizadas que proporcionam o
mecanismo para o controle de mudança. Tem o seguinte subconjunto de tarefas:
• Uma requisição de mudança é submetida e avaliada para estimar o mérito técnico,
potenciais efeitos colaterais e impacto geral nos outros itens de configuração.
• Um relatório de mudança é criado para identificar a decisão final no status e prioridade da
mudança.
Engenharia de Software 28
JEDITM
• Uma Ordem de Engenharia de Mudança (OEM) é criada para descrever a mudança a ser
efetuada, as restrições e os critérios para revisão e auditoria.
• Os ICS são conferidos para modificação.
• É, então, verificado numa revisão posterior e passado ao controle de versão.
Auditoria de Configuração
É o processo de avaliar a ICS por características que geralmente não são consideradas durante
um revisão técnica formal. Atende às seguintes questões:
• A mudança especificada na OEM foi efetuada? Existem modificações adicionais que foram
executadas?
• A revisão técnica formal avaliou a correção técnica do produto?
• Os procedimentos de engenharia de software foram observados?
• Os procedimentos de GQS foram observados?
• Todos os ICSs foram apropriadamente atualizados?
Relatório Informativo
É o processo de informar às pessoas que são afetadas pela mudança. Responde às seguintes
questões:
• O que aconteceu?
• Quem fez?
• Quando aconteceu?
• O que mais será afetado?
Engenharia de Software 29
JEDITM
12. Exercícios
O objetivo da tarefa é reforçar os conhecimentos e habilidades obtidas nesta lição.
1. Contacte outros alunos do JEDI e crie um grupo de trabalho.
2. Como exercício, o grupo deve criar o plano de projeto para seu projeto.
Engenharia de Software 30
Módulo 4
Engenharia de Software
Lição 8
Ferramentas de Desenvolvimento de Software
1. Objetivos
A implementação requer uma variedade de ferramentas. Assegurar que estejam disponíveis em
versões compatíves e com licenças suficientes é parte do gerenciamento de projeto. Muitas
dessas ferramentas foram construídas e implementadas para tornar o trabalho de engenharia de
software mais fácil e organizado.
Ao final desta lição, o estudante será capaz de:
• Conhecer as diferentes ferramentas disponíveis no auxílio ao processo de desenvolvimento
de software
Engenharia de Software 4
JEDITM
2. Tipos de Ferramentas
2.1. Case
Ferramentas Computer-Aided Software Engineering (CASE) permitem que o analista crie modelos
do sistema e do projeto. Existem hoje diversas ferramentas que dão suporte à Unified Modeling
Language (UML). A principal característica é o repositório de projetos que permite a manutenção
dos caminhos entre as descrições textuais e estruturais de todas as classes, atributos, operações,
estados, etc, para a representação em diagramas.
Outras ferramentas CASE dão suporte a geradores de código. Isso assegura que a implementação
reflita os diagramas construídos. Existem ferramentas que geram automaticamente o código em
linguagem Java, Visual Basic, C++ e instruções SQL. Exemplos de ferramentas CASE são
ArgoUML, JUDE, umlet, Rational Rose e Dia.
Engenharia de Software 5
JEDITM
que é mais desejável é que os programadores desenvolvam suas próprias ferramentas para testar
classes e subsistemas.
Engenharia de Software 6
Módulo 4
Engenharia de Software
Apêndice A
Instalando o Java Studio Enterprise
Se você quer especificar um diretório temporário para sua instalação, use os seguintes comandos
na linha de diálogo do comando.
> cd /installer-location
> ./jstudio_ent8_linux-jds.bin -is:tempdir temp-directory
Se Então
Deseja utilizar a instalação do Sun Java System Desmarque o checkbox Sun Java(tm) System
Application Server 8.1 Platform Edition, Update Application Server 8.1 PE UR2, e clique Next.
Engenharia de Software 4
JEDITM
Se Então
Forneça as informações necessárias sobre o seu
Release 2 com a instalação do IDE servidor de aplicações na página Application Server
Selection, e clique Next.
Desmarque o checkbox Collaboration Runtime, e
Não deseja instalar o Collaboration Runtime
clique Next.
Deseja instalar todas as propriedades Clique Next.
4. Escolha qual Java Development Kit (JDK) você quer usar para a instalação deste IDE na
página do Java Development Kit Selection e clique Next.
5. Verifique as configurações na página Start Copying Files e clique Next para começar a
instalação.
6. Marque o checkbox Start Sun Java(TM) Studio Enterprise 8 se você quiser lançar a IDE após
a instalação wizard terminar.
7. Clique Finish.
Notas Pós-Instalação
A IDE instalada pode ser executada usando um comando digitado a ser executado em uma janela
de terminal.
> cd /location-of-IDE-executable
> ./runide.sh
Referência
http://docs.sun.com/source/819-2807/chap_linux_installing.html
Engenharia de Software 5
Módulo 4
Engenharia de Software
Apêndice B
Solução dos Exercícios
Engenharia de Software 4
JEDITM
Engenharia de Software 5
JEDITM
Engenharia de Software 6
JEDITM
Engenharia de Software 7
JEDITM
Engenharia de Software 8
JEDITM
• Telefone
• Sexo
• Esportes preferidos e posições
• Informações do Guardião
• Nome do Guardião
• Endereço
• Telefone
3. Orientações do Revisão do Projeto da Tela do Atleta
• Verifique o projeto de banco de dados para mais detalhes do formato
• Incluir o seguinte:
• Dados relacionados à aplicação
• Número da Aplicação (campo texto)
• Data da Aplicação (campo texto)
• Dados Adicionais do Atleta
• Sexo (botões radio ou listas drop-down)
• Status (lista drop-down)
• Nível de habilidade (lista drop-down)
• Dados do Guardião
• Nome (campo texto)
• Telefone (campo texto)
• Endereço (campo texto)
• Modificação dos seguintes campos:
• Esportes e Posições
• Deve estar apto a receber múltiplas entradas.
• Possível uso de um list box ou combo box.
• Remover campo:
• Ano do último pagamento de inscrição
• Adicionar um botão para ir a função “Achar Atleta ou Aplicação”. Neste caso, outra
janela e layout de diálogo deverá ser feito para essa função.
4. Orientações sobre o projeto da janela e sobre o projeto do diálogo do Sistema de Informações
de Treinadores
Para o FormularioTreinador:
• Incluir os seguintes campos de dados; verifique o design de banco de dados para mais
detalhes:
• ID do Treinador
• Nome do Treinador
• Endereço do Treinador
• Número SSS
• Telefone
• Email
• Celular
Engenharia de Software 9
JEDITM
Engenharia de Software 10
JEDITM
Engenharia de Software 11
JEDITM
4. Lição 5 – Implementação
Definição para a formatação da documentação interna
1. Comentário para cabeçalho. Assegurar de que as seguintes funcionalidades serão apresentadas.
• Nome do componente
• Autor do componente
• Data da criação ou ultima modificação do componente
• Lugar onde o componente se enquadra no sistema geral
• Detalhes da estrutura dos dados,algoritmos e fluxo de controle
• Para o histórico de revisão:
• Quem modificou o componente?
• Quando o componente foi modificado?
• Qual foi a modificação feita no componente?
2. Dicas de implementação
• Implenetar RegistroAtletaUI, EncontrarRegistroAtletaUI e ListaAtletaUI. Use o protótipo
de tela como guia.
• Implementar EncontrarRegistroAtleta(controlador) com message dialog boxes para que
os métodos que necessitem acessar objetos de persistência ou da camada do Banco de
Dados.
• Assegurar que a definição de comentário de cabeçalho está presente no código.
• Tentar integrar todos os usuários da interface gráfica com seus correspondentes
controladores.
Engenharia de Software 12
JEDITM
Engenharia de Software 13
JEDITM
Instituto CTS
Patrocinador do DFJUG.
Sun Microsystems
Fornecimento de servidor de dados para o armazenamento dos vídeo-aulas.
DFJUG
Detentor dos direitos do JEDITM nos países de língua portuguesa.
Banco do Brasil
Disponibilização de seus telecentros para abrigar e difundir a Iniciativa JEDITM.
Politec
Suporte e apoio financeiro e logístico a todo o processo.
Borland
Apoio internacional para que possamos alcançar os outros países de língua
portuguesa.
Instituto Gaudium/CNBB
Fornecimento da sua infra-estrutura de hardware de seus servidores para que os
milhares de alunos possam acessar o material do curso simultaneamente.
Engenharia de Software 14