Você está na página 1de 286

Anlise e Desenvolvimento de Sistemas

Tecnlogo em

Anlise e desenvolvimento de sistema cliente e servidor

1o semestre de 2014 - 1a edio

www.metodista.br

Organizador Andr Luiz Perin

Universidade Metodista de So Paulo


Diretor Geral Wilson Roberto Zuccherato Conselho Diretor Stanley da Silva Moraes (Presidente), Nelson Custdio Fr (Vice-Presidente), Osvaldo Elias de Almeida (Secretrio). Vogais: Aires Ademir Leal Clavel, Augusto Campos de Rezende, Aureo Lidio Moreira Ribeiro, Jonas Adolfo Sala, Ktia de Mello Santos, Marcos Vinicius Sptizer, Oscar Francisco Alves Jnior. Suplentes: Regina Magna Araujo, Valdecir Barreros Reitor: Marcio de Moraes Pr-Reitora de Graduao: Vera Lcia Gouva Stivaletti Pr-Reitor de Ps-Graduao e Pesquisa: Fbio Botelho Josgrilberg Direo da Faculdade de Exatas e Tecnologia: Carlos Eduardo Santi Coordenao do NEAD: Adriana Barroso de Azevedo Coordenador do Curso de Tecnologia em Anlise e Desenvolvimento de Sistemas Prof. Me. Andr Luiz Perin Organizador Prof. Me. Andr Luiz Perin Professores Autores Prof. Alexandre Atanes de Jesus Prof. Me. Andr Luiz Perin Prof. Cristiano Camilo dos Santos de Almeida Prof. Esp. Durval de Oliveira Dorta Junior Prof. Me. Leonardo Mairene Muniz Prof. Rafael Guimares Sakurai Profa. Dra. Silvia Brunini Assessoria Pedaggica Adriana Barroso de Azevedo Celeste Yanela Millaray Panik Castro Eliana Vieira dos Santos Thais Helena Santinelli Coordenao Editorial Prof. Me. Andr Luiz Perin Produo de Materiais Didtico-Pedaggicos EAD Bruno Tonhetti Galasse Editorao Eletrnica Editora Metodista Projeto Grfico Cristiano Leo Reviso Victor Hugo Lima Alves Data desta edio 1o semestre de 2014

Dados Internacionais de Catalogao na Publicao (CIP) (Biblioteca Central da Universidade Metodista de So Paulo)

expediente

Un3a

Universidade Metodista de So Paulo Anlise e desenvolvimento de sistema cliente e servidor / Universidade Metodista de So Paulo. Organizao de Andr Luiz Perin. So Bernardo do Campo : Ed. do Autor, 2014. 286 p. (Cadernos didticos Metodista - Campus EAD) Bibliografia ISBN 978-85-7814-255-1 1. Anlise de sistemas 2. Processamento eletrnico de dados I. Perin, Andr Luiz II. Ttulo.

CDD 004.21

Rua do Sacramento, 230 - Rudge Ramos 09640-000 So Bernardo do Campo - SP Tel.: 0800 889 2222 - www.metodista.br/ead
permitido copiar, distribuir, exibir e executar a obra para uso no comercial, desde que dado crdito ao autor original e Universidade Metodista de So Paulo. vedada a criao de obras derivadas. Para cada novo uso ou distribuio, voc deve deixar claro para outros os termos da licena desta obra.

Anlise e Desenvolvimento de Sistemas

Tecnlogo em

Organizador Andr Luiz Perin

UMESP
1o semestre de 2014 - 1a edio

www.metodista.br

Anlise e desenvolvimento de sistema cliente e servidor

Palavra do Reitor

Caro(a) aluno(a) do Campus EAD Metodista, com muita alegria que acolhemos voc na Universidade Metodista de So Paulo! O Guia de Estudos digital que est recebendo faz parte da nossa preocupao com a educao superior de qualidade da Metodista. Este material foi elaborado pelos professores do seu curso e ser utilizado durante o semestre nas suas atividades de estudos. Nosso desejo que voc aproveite ao mximo o contedo aqui disponibilizado, explorando todas as possibilidades para aprofundamento dos temas tratados. O Guia uma parte dos esforos que tm marcado as atividades do Campus EAD Metodista. Ao longo dos anos, buscamos intensamente o cumprimento do nosso compromisso em propiciar interao professor-aluno, formao continuada da equipe de docentes e tcnicos que atuam na modalidade, qualidade das atividades propostas e estmulo para a construo de conhecimentos. Tudo isso para voc se sentir parte de uma instituio que prima pela qualidade em seus processos formativos. Temos certeza de que ainda h muito por fazer no processo de aperfeioamento das diferentes estratgias de ensino e aprendizagem na modalidade EAD, mas o caminho trilhado sinaliza que temos acertado. No ano de 2013, concentramos nossos esforos para estabelecimento de parcerias com novos polos em todas as regies do Brasil. Tambm ampliamos nosso portflio de cursos de Ps-Graduao EAD para que voc, aluno de graduao Metodista, possa continuar sua formao com excelncia e qualidade desejadas. Em 2014, o desafio continua: tornar a EAD da Metodista sinnimo de qualidade nacional e internacional, levar a formao cidad e humanizadora a mais pessoas e, por consequncia, valorizar ainda mais seu diploma. O melhor de tudo isso saber que voc est conosco e, como ns, acredita na Metodista. Bons estudos e um timo semestre! Prof. Dr. Marcio de Moraes Reitor

6
Universidade Metodista de So Paulo

Mdulo: Modelagem e Documentao de Sistemas

9 21 47 65 77 101 131 149 165

Laboratrio de Modelagem Professor Alexandre Atanes de Jesus Modelagem de Banco de Dados Prof. Esp. Durval de Oliveira Dorta Junior Engenharia de Requisitos Parte 1 Prof. Me. Andr Luiz Perin Engenharia de Requisitos Parte 2 Prof. Me. Andr Luiz Perin Mdulo: Organizao de Dados Introduo ao Banco de Dados Parte 1 Prof. Esp. Leonardo Mairene Muniz Introduo ao Banco de Dados Parte 2 Prof. Esp. Leonardo Mairene Muniz Organizao de Dados I Professora Dra. Silvia Brunini Organizao de Dados II Professora Dra. Silvia Brunini Organizao de Dados III Professora Dra. Silvia Brunini

sumrio

Mdulo: Implementao de Sistemas Cliente Servidor

173 195 209 223 245 261

Introduo ao desenvolvimento de interface grfica utilizando swing Prof. Rafael Guimares Sakurai Criando aplicaes desktop que gravam informaes em arquivos texto Prof. Rafael Guimares Sakurai Criando uma aplicao Swing com acesso ao banco de dados Prof. Rafael Guimares Sakurai Conexo com bancos de dados utilizando a Java Database Connectivity. Prof. Cristiano Camilo dos Santos de Almeida Enumeraes e tipos genricos Prof. Cristiano Camilo dos Santos de Almeida Collections Prof. Cristiano Camilo dos Santos de Almeida

Modelagem e Documentao de sistemas

Laboratrio de Modelagem

Mdulo

Professor Alexandre Atanes de Jesus

Apresentar ao aluno os principais conceitos ligados modelagem e documentao de sistemas utilizando o paradigma de projeto orientado a objetos em conjunto com uma metodologia para Modelar e Documentar Sistemas de Informao bastante utilizada pelas empresas que trabalham com desenvolvimento de sistemas; ajudar o aluno a identificar os principais requisitos dos sistemas e agrup-los em diagramas que ajudaro no desenvolvimento e na documentao final da soluo. Praticar a modelagem e documentao de sistemas utilizando a notao da UML (Unified Modeling Language) e seus principais diagramas.

Objetivos:

Modelagem; Documentao; Unified Modeling Language (UML); Metodologia; Diagramas; Classes; Objetos, Requisitos; Anlise.

Palavras-chave:

www.metodista.br/ead

Por QUe modelar e docUmentar soFTWaRE?


Por que no podemos simplesmente conversar com o nosso cliente e/ou usurio e j sair programando? Muitos profissionais podem afirmar que conseguem determinar todas as necessidades de um sistema de informao de cabea e que sempre trabalharam assim, mas a concepo de um software, muitas vezes, complexa e demanda um bom tempo para o entendimento do problema a ser solucionado. Neste caso, a documentao dessa soluo deve seguir alguns padres que possam ser entendidos e acompanhados por todos os envolvidos no desenho e na construo da soluo, o que nunca foi uma tarefa fcil. Mesmo em sistemas simples importante fazermos a sua modelagem e documentao, pois todo sistema est sujeito a novas verses, atualizaes e manutenes e nesses casos que vamos precisar analisar a documentao para verificar como a soluo foi construda e como podemos modific-la. Hoje em dia os softwares tem uma importncia muito grande para qualquer ramo de atuao e isso faz com que eles tenham uma dinmica muito grande e sejam modificados e atualizados com muita frequncia e sem seus modelos e documentao seria impossvel realizar essa tarefa. Precisamos documentar e gerenciar todas as solicitaes e necessidades do nosso cliente e/ou usurio para direcionar a soluo de uma forma que atenda da melhor forma possvel essas necessidades, sem perder o foco do objetivo final do sistema e sem criar falsas expectativas em relao ao que deve ser entregue. Outro ponto importante da documentao est ligado ao custo final dos sistemas, pois quanto mais tarde se descobre um erro maior o custo para consert-lo e as consequncias podem ser irreparveis. Segundo Pressman (2006), cerca de 60% dos erros ocorrem j na fase de elaborao do projeto, nas atividades exercidas pela engenharia de requisitos e anlise de sistemas. Obviamente esses erros podem ser corrigidos antes do final do projeto. Porm, o custo para a correo desses erros tende a aumentar conforme o sistema vai chegando prximo a sua verso final. Aps a sua entrega, a correo de um defeito pode custar at 1.000 vezes mais que na fase de levantamento dos requisitos. A imagem abaixo mostra os dados coletados por Boehm (1981) que demostram a relao entre o custo de uma soluo e as etapas de desenvolvimento de um sistema.

Figura 1 Fonte: Boehm (1981)

10
Universidade Metodista de So Paulo

Mas o QuE ModELaGEm?


um recurso de suporte para a sntese da soluo, um modelo ajuda a planejar um sistema antes de cri-lo. Os modelos tambm podem ajud-lo a se certificar de que o design confivel, que os requisitos foram entendidos e cumpridos por todos os envolvidos no projeto. Modelos so ferramentas para melhorar o entendimento do sistema, pois apresentam de forma clara e direta as funcionalidades do sistema, quais informaes so manipuladas pelo sistema e seu comportamento dinmico. Um modelo uma simplificao da realidade, eles podem ser estruturais, dando nfase organizao do sistema, ou podem ser comportamentais, dando nfase dinmica do sistema. Modelos Visuais so essenciais para a comunicao entre os envolvidos no projeto e o cliente.

Modelo de SoFTWaRE Definio!


Um modelo de software captura a viso de um sistema fsico e faz a abstrao do sistema com certo propsito, como descrever aspectos estruturais ou comportamentais do software. Esse propsito determina o que deve ser includo no modelo e o que considerado irrelevante. Assim, um modelo descreve completamente aqueles aspectos do sistema fsico que so relevantes ao propsito do modelo em um nvel apropriado de detalhe. Um modelo de software define semntica e notao: informao semntica: descreve o significado ou inteno do sistema; notao: apresentao visual, mostram o modelo de forma facilmente compreensvel e podem ser apresentados de vrias formas, incluindo texto e diagramas. Vises de um modelo de Software: Diferentes pontos de vista devem ser usados para refletir os aspectos desejados. Cada viso mostra um conjunto de aspectos do sistema numa notao adequada sua compreenso. A arquitetura de um sistema pode ser refletida em cinco vises distintas:

Figura 2 Fonte: Professor Alexandre Atanes

11
www.metodista.br/ead

Possibilitando aos desenvolvedores analisar o sistema de diferentes perspectivas, so propostas as seguintes vises:

Viso de Casos de Uso: descreve o sistema de um ponto de vista externo como um conjunto de interaes entre o sistema e os agentes externos do sistema. Viso de projeto: enfatiza as caractersticas do sistema. Viso de implementao: abrange o gerenciamento de verses do sistema. Viso de implantao: corresponde distribuio fsica do sistema em seus subsistemas e conexo entre essas partes. Viso de processos: enfatiza as caractersticas de concorrncia, sincronismo e desempenho do sistema.

PaRadiGma da ORiENTao a OBjETos.


O paradigma da orientao a objetos visualiza um sistema de software como uma coleo de agentes interconectados chamados de objetos. Cada objeto responsvel por realizar tarefas especificas. atravs da interao entre objetos que uma tarefa computacional realizada. Sendo uma tcnica para a modelagem que diminui a diferena semntica entre a realidade sendo modelada e os modelos construdos. A orientao a objetos tem sua origem nos anos 60, na Noruega, com Kristen Nygaard e Ole-Johan Dahl, no Centro Noruegus de Computao. Atravs da linguagem Simula 67, foram introduzidos os conceitos de classe e herana. A orientao a objetos passou a ser mais conceituada e elaborada nos laboratrios da Xerox, em Palo Alto, sendo refinada numa sequncia de prottipos da linguagem Smalltalk. O lder desse projeto foi Alan Curtis Kay, considerado um dos criadores do termo programao orientada a objetos. Alan Key estabeleceu alguns princpios bsicos relacionados programao orientada a objetos como: Qualquer coisa um objeto. Objetos realizam tarefas atravs da requisio de servios a outros objetos. Cada objeto pertence a uma determinada classe. A classe um repositrio para o comportamento associado ao objeto. Classes so organizadas em hierarquia.

CLassEs E OBjETos
O mundo real formado por coisas, como carros, pessoas, vendas, casas, etc. Na terminologia orientada a objetos essas coisas do mundo real so chamadas de objetos. Seres humanos costumam agrupar os objetos. Este processo mental de agrupamento ajuda a gerenciar a complexidade de entender as coisas do mundo real. muito fcil entender a ideia de um carro independente das suas variaes e modelos. Na terminologia da orientao a objetos cada ideia denominada classe de objetos ou simplesmente classe. Uma classe uma descrio dos atributos e servios comuns a um grupo de objetos, entende-se uma classe como sendo o molde do qual os objetos so construdos. Nesta terminologia ainda diz-se que um objeto uma instncia de uma classe. 12
Universidade Metodista de So Paulo

A programao Orientada a Objetos traz alguns conceitos importantes como:

Mensagens Para que uma operao em um objeto seja executada deve haver um estmulo enviado a esse objeto. Independentemente da origem do estmulo, quando ele ocorre, diz-se que o objeto em questo est recebendo uma mensagem requisitando que ele realize alguma operao. Encapsulamento Objetos possuem comportamentos. O termo comportamento diz respeito a operaes realizadas por um objeto e tambm ao modo pelo qual essas operaes so executadas. O Mecanismo de encapsulamento uma forma de restringir o acesso ao comportamento do objeto. Quando um objeto faz uma requisio a outro objeto ele no precisa saber como o objeto realizar a operao. Ele s precisa saber que o objeto capaz de fazer determinada requisio e ele ser capaz de saber atravs da interface do objeto que diz apenas o que o objeto capaz de fazer, sem dizer como. Polimorfismo caracterizado quando duas ou mais classes distintas tm mtodos de mesmo nome, de forma que uma funo possa utilizar um objeto de qualquer uma das classes polimrficas, sem necessidade de tratar de forma diferenciada conforme a classe do objeto. Herana Na herana, classes semelhantes so agrupadas em hierarquias. Cada classe em um nvel de hierarquia herda as caractersticas das classes nos nveis acima. Esse mecanismo facilita o compartilhamento de comportamento comum entre um conjunto de classes semelhantes.

A ModELaGEm oRiENTada a oBjETos.


A essncia do desenvolvimento baseado em objetos a identificao e a organizao de conceitos do domnio da aplicao, em vez de sua representao em uma linguagem de programao. A viso orientada a objetos evoluiu mais facilmente, pois somos incentivados a usar classes para representar coisas do nosso dia a dia. Na viso da Orientao a Objetos, o principal bloco de construo de todos os sistemas de softwares o objeto ou a classe, sendo que uma classe a descrio de um conjunto de objetos comuns. Todos os objetos tm uma identidade (um nome), um estado (normalmente ele possui dados associados a ele) e um comportamento (podemos fazer algo com ele ou ele poder fazer algo com outros objetos).

13
www.metodista.br/ead

Algumas observaes importantes sobre Modelagem: A escolha dos modelos a serem criados tem profunda influncia sobre a maneira como um determinado problema atacado e como uma soluo definida; Cada modelo poder ser expresso em diferentes nveis de preciso; Os melhores modelos so relacionados realidade; Nenhum modelo nico suficiente. Qualquer sistema no trivial ser mais bem investigado por meio de um pequeno conjunto de modelos quase independentes com vrios pontos de vista.

A UML (UNiFiEd ModELiNG LaNGuaGE).


De acordo com o prefcio do livro UML Guia do Usurio, da editora Elsevier, a Linguagem Unificada de Modelagem (UML) uma linguagem grfica para visualizao, especificao, construo e documentao de artefatos de sistemas complexos de software. A UML proporciona uma forma padro para a preparao de planos de arquitetura de projetos de sistemas, incluindo aspectos conceituais tais como processos de negcios e funes do sistema, alm de itens concretos como as classes escritas em determinada linguagem de programao, esquemas de banco de dados e componentes de softwares reutilizveis.

Figura 3 Fonte: Internet nerdson.com

A UML surgiu da fuso de trs grandes mtodos, do BOOCH, OMT (Rumbaugh) e OOSE (Jacobson). Esta linguagem de modelagem no proprietria de terceira gerao no um mtodo de desenvolvimento. Tem como papel principal auxiliar na visualizao do desenho e na comunicao dos objetos. Ela permite que desenvolvedores visualizem os produtos de seu trabalho em diagramas padronizados e muito usada para criar modelos de sistemas de software. Alm de fornecer a tecnologia necessria para apoiar a prtica de engenharia de software orientada a objetos, a UML poder ser a linguagem de modelagem padro para modelar sistemas 14
Universidade Metodista de So Paulo

concorrentes e distribudos. Utiliza-se de um conjunto de tcnicas de notao grfica para criar modelos visuais de software de sistemas intensivos, combinando as melhores tcnicas de modelagem de dados, negcios, objetos e componentes. uma linguagem de modelagem nica, comum e amplamente utilizvel. Embora com a UML seja possvel representar o software atravs de modelos orientados a objetos, ela no demonstra que tipo de trabalho deve ser feito, ou seja, no possui um processo que define como o trabalho tem que ser desenvolvido. O objetivo ento descrever o que fazer, como fazer, quando fazer e porque deve ser feito. necessria a elaborao completa de um dicionrio de dados, para descrever todas as entidades envolvidas, refinando, com isso, os requisitos funcionais do software. A Linguagem Unificada de Modelagem possui diagramas (representaes grficas do modelo parcial de um sistema) que so usados em combinao, com a finalidade de obter todas as vises e aspectos do sistema.

ModELos, VisEs E DiaGRamas da UML


Para permitir a aplicao e utilizao da UML em todas as fases do projeto e para possibilitar que todos os diferentes pontos de vista dos especialistas envolvidos no projeto estejam contemplados no projeto, a UML possui vrios diagramas diferentes! A imagem abaixo mostra uma parte desses diagramas:

Figura 4 Fonte: Internet

15
www.metodista.br/ead

Os Diagramas da UML esto divididos em:

Diagramas Estruturais De Classe: este diagrama fundamental e o mais utilizado na UML e serve de apoio aos outros diagramas. O Diagrama de Classe mostra o conjunto de classes com seus atributos e mtodos e os relacionamentos entre classes. De Objeto: o diagrama de objeto esta relacionado com o diagrama de classes e praticamente um complemento dele. Fornece uma viso dos valores armazenados pelos objetos de um Diagrama de Classe em um determinado momento da execuo do processo do software. De Componentes: est associado linguagem de programao e tem por finalidade indicar os componentes do software e seus relacionamentos. De implantao: determina as necessidades de hardware e caractersticas fsicas do Sistema. De Pacotes: representa os subsistemas englobados de forma a determinar partes que o compem. De Estrutura: descreve a estrutura interna de um classificador.

Diagramas Comportamentais De Caso de Uso (Use Case): geral e informal para fases de levantamento e anlise de Requisitos do Sistema. De Mquina de Estados: procura acompanhar as mudanas sofridas por um objeto dentro de um processo. De Atividades: descreve os passos a serem percorridos para a concluso de uma atividade. De Interao: dividem-se em: De Sequncia: descreve a ordem temporal em que as mensagens so trocadas entre os objetos. Geral interao: variao dos diagramas de atividades que fornece viso geral dentro do sistema ou processo do negcio. De comunicao: associado ao diagrama de Sequncia, complementando-o e concentrando-se em como os objetos esto vinculados. De tempo: descreve a mudana de estado ou condio de uma instncia de uma classe ou seu papel durante o tempo.

Os pRiNcipais diaGRamas da UML a) Diagrama de Casos de Uso (Use Cases)


O Diagrama de Casos de Uso tem o objetivo de auxiliar a comunicao entre os analistas e o cliente. Um diagrama de Caso de Uso descreve um cenrio que mostra as funcionalidades do sistema do ponto de vista do usurio. 16
Universidade Metodista de So Paulo

O cliente deve ver no diagrama de Casos de Uso as principais funcionalidades de seu sistema. O diagrama de Caso de Uso representado por: atores; casos de uso; relacionamentos entre estes elementos. Estes relacionamentos podem ser: associaes entre atores e casos de uso; generalizaes entre os atores; generalizaes, extends e includes entre os casos de uso. Exemplos:

Figura 5 Fonte: Internet

b) Diagrama de Classes
Exibe um conjunto de classes, interfaces e colaboraes, bem como seus relacionamentos. Esses diagramas so encontrados com maior frequncia em sistemas de modelagem orientados a objetos e abrangem uma viso esttica da estrutura do sistema. Exemplos:

Figura 6 Fonte: Internet

17
www.metodista.br/ead

c) Diagrama de Objetos
Exibe um conjunto de objetos e seus relacionamentos. Representa retratos estticos de instncias de itens encontrados no diagrama de classes sob uma perspectiva de casos reais ou de prottipos. Exemplos:

Figura 7 Fonte: Internet

d) Diagrama de Sequncia
Tem por objetivo descrever as comunicaes necessrias entre objetos para a realizao dos processos em um sistema computacional. Os diagramas de sequncia tem este nome porque descrevem ao longo de uma linha de tempo a sequncia de comunicaes entre objetos. Exemplo:

Figura 8 Fonte: Internet

18
Universidade Metodista de So Paulo

Referncias BOEHM, Barry. Software Engineering Economics. Prentice-Hall, 1981. GUEDES, Gilleanes T. A. UML 2: uma abordagem prtica, 2. ed. So Paulo: Novatec, 2011. PRESSMAN, Roger S. Engenharia de Software. 6. ed. Rio de Janeiro: McGrawHill, 2006. SOMMERVILLE, Ian. Engenharia de Software. 9. ed. So Paulo: Pearson Addison Wesley, 2011.

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________
19
www.metodista.br/ead

_________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________
20
Universidade Metodista de So Paulo

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________

Modelagem e Documentao de sistemas

Modelagem de Banco de Dados


Prof. Esp. Durval de Oliveira Dorta Junior

Mdulo

Objetivos:
Apresentar conceitos detalhados de modelagem de banco de dados, teoria relacional e do projeto de banco de dados. Tambm sero apresentados conceitos de modelagem conceitual e lgica de banco de dados, a partir de requisitos.

Palavras-chave:
Modelo lgico; modelo conceitual; teoria relacional; projeto de banco de dados; banco de dados; entidade; relacionamento; atributo; cardinalidade.

www.metodista.br/ead

INTRoduo
Um dos principais propsitos da tecnologia da informao automatizar processos existentes ou, no caso de processos de alta complexidade, possibilitar a existncia deles. Para atingir este objetivo so desenvolvidos os sistemas de informao. A modelagem de banco de dados um fator importante no desenvolvimento destas solues, considerando que todo processo utiliza e tambm pode criar dados. Para ilustrar, vamos analisar um ambiente de negcios tpico, em que constatamos a existncia de vrios departamentos de diferentes reas de atuao. Independentemente do nome destes departamentos podemos afirmar que eles so responsveis pelos processos de negcios, por exemplo, Vendas, Compras, Contabilidade, Produo e outros tantos. Estes processos de uma empresa produzem e/ou utilizam dados para desempenhar o seu papel. Por exemplo, no mnimo, o processo de vendas manipula dados dos clientes, dos pedidos e dos produtos, ento podemos afirmar que o sistema Vendas o conjunto dos processos automatizados por programas de computador e os dados criados ou alterados por estes. Conclumos que o conjunto de dados utilizados pelos processos um componente imprescindvel para o projeto de sistemas. Ao conjunto destes dados armazenados damos o nome de Banco de Dados. A definio de Banco de dados : Conjunto de dados integrados que tem por objetivo atender a uma comunidade de usurios (HEUSER, 2009). A forma como armazenamos estes dados tem se desenvolvido desde o incio da era da informao, criando uma nova rea de conhecimento, que chamamos de Modelagem de Banco de Dados. O seu propsito o estudo das metodologias utilizadas na descrio formal dos tipos de dados que esto armazenados em um banco de dados. A esta descrio chamamos de Modelo de Banco de Dados. O modelo de dados amplamente utilizado modelo de dados relacional. Por este motivo, o nosso estudo ser focado neste tipo de modelo.

O modELo dE dados RELacioNaL


O modelo de dados relacional foi introduzido inicialmente por Ted Codd, na poca funcionrio da IBM no ano de 1970, por meio de seu artigo clssico (CODD, 1970; CHEN, 1976) que atraiu grande ateno imediata devido a sua simplicidade e base matemtica. Sua base terica reside na teoria de conjuntos e lgica de predicado de primeira ordem. O modelo relacional representa o banco de dados como uma reunio de relaes. Cada relao semelhante a uma tabela de valores, ou seja, esta tabela composta de cabealhos de colunas que representam o nome dos dados. Cada uma destas colunas possuem valores, que so os dados, e cada linha desta tabela representa uma ocorrncia da tabela. Formalmente, os nomes no modelo relacional so os seguintes: a linha chamada Tupla, um cabealho da coluna chamado de Atributo, os valores dos dados na coluna chamado de Domnio e a tabela chamada de Relao.

22
Universidade Metodista de So Paulo

Veja o exemplo abaixo:

Nome da Relao
FUNCIONRIO

Atributos

Nome Joo S. Rios Paula R. Santos Barbara Passos

CPF

Celular

Rua Consolao Jardim Goiabeiras

Nmero CEP 2019 300 230 09000-430 01415-300 03445-212

Cidade So Paulo So Paulo So Paulo

UF SP SP SP

306.610.243-51 9995-3535 381.620.124-45 8476-9821 533.690.123-80 NULL

Note, neste exemplo, cada coluna um Atributo e cada linha uma Tupla que representa uma ocorrncia da Relao Funcionrio, ou seja, cada Tupla um Funcionrio diferente e, tambm, chamada de uma Ocorrncia da Relao.
Figura 1

Tuplas

No modelo de dados relacional, a integrao dos dados vai alm dos atributos agrupados em uma relao, apresentando o relacionamento entre estas relaes. Por exemplo, em uma empresa, em que todo funcionrio trabalha em um departamento, e lembrando que departamento outra relao de dados, necessrio representar a informao associando corretamente cada funcionrio ao nico departamento no qual ele trabalha. Esta informao que caracteriza a associao entre as relaes tratada no modelo relacional com o nome de Relacionamento. A representao do conjunto das relaes e de seus relacionamentos chamamos de Esquema de Banco de Dados. Veja um exemplo de um Diagrama de Esquema de Banco de Dados:

Na figura 2, acima, destaca-se: A relao que retrata o Funcionrio participa de dois relacionamentos, um com o Departamento ao qual este funcionrio pertence e o outro com a Alocao de suas horas em projetos. 23
www.metodista.br/ead

A relao Alocao registra as horas que cada funcionrio dedica a um determinado projeto, e se relaciona com o funcionrio e o projeto para a devida associao do Funcionrio com cada Projeto dos vrios que ele pode trabalhar. Alm dos valores de dados que cada relao armazena (nome, horas, departamento, etc.) o relacionamento entre estas relaes tambm uma informao gerada, ou seja, com o relacionamento sabemos a qual departamento o funcionrio pertence e em qual projeto ou projetos trabalha.

PROJETO DE BANCO DE DADOS


O projeto de banco de dados envolve trs fases, descritas a seguir (HEUSER, 2009): Modelagem Conceitual a primeira fase. construdo um modelo conceitual na forma de um diagrama entidade-relacionamento, comumente chamado de DER. Este modelo captura as necessidades da organizao em termos de armazenamento de dados e as regras de negcio. Modelo Lgico A segunda etapa, tambm chamada de projeto lgico, quando se transforma o modelo conceitual da primeira fase em um modelo lgico. O modelo lgico define como o banco de dados ser implementado em um SGBD especfico. Lembrando que o SGBD, o software que gerencia o banco de dados, sua sigla significa Sistema Gerenciador de Banco de dados. Projeto fsico Terceira e ltima etapa do projeto de Banco de Dados, o modelo do banco de dados transcrito para um script na linguagem SQL e, tambm, enriquecido com detalhes que influenciam no desempenho do banco de dados, mas no interferem em sua funcionalidade. O modelo obtido neste passo o modelo fsico do banco de dados pronto para ser usado no SGDB a fim de se criar o Banco de Dados.

MODELAGEM CONCEITUAL
A modelagem conceitual independente do SGDB a ser utilizado e utilizaremos a abordagem Entidade-Relacionamento (E-R), que no contm aspectos tcnicos que poderiam se relacionar a um SGDB especfico. O objetivo da utilizao deste tipo de modelagem permitir um foco na captura de necessidades do usurio e suas regras de negcio. O resultado um modelo grfico chamado de Diagrama Entidade-Relacionamento ou mais comumente chamado DER ou MER (Modelo E-R), que por ser uma representao grfica sem detalhes tcnicos facilmente usada tambm na validao com o usurio ou usurios que forneceram as necessidades e regras de negcio.

24
Universidade Metodista de So Paulo

A figura abaixo um exemplo do Diagrama Entidade-Relacionamento (DER):

Figura 3

A seguir, abordaremos cada componente desta tcnica, que foi criada em 1976 por Peter Chen (CHEN, 1976), podendo ser considerada como um padro de fato para a modelagem conceitual. Mesmo as tcnicas de modelagem orientada a objetos, que tm surgido nos ltimos anos, como a UML, baseiam-se nos conceitos da abordagem ER (HEUSER, 2009).

PRINCIPAIS ELEMENTOS DA ABORDAGEM ENTIDADE-RELACIONAMENTO

ENTIDADE
A entidade um conceito fundamental da abordagem E-R. Segundo Heuser (2009), a entidade o conjunto de objetos da realidade modelada sobre os quais deseja-se manter informaes no banco de dados. Importante observar que, neste texto, o termo objeto possui a conotao que lhe dada na linguagem natural, de coisa, tudo que perceptvel ou manipulvel. No falaremos, neste texto, do termo objeto como ele usado na Teoria de programao de Orientao a Objetos. Uma entidade representa um conjunto de objetos da realidade modelada. Como o objetivo de um modelo ER modelar de forma abstrata um BD, interessam-nos somente os objetos sobre os quais deseja-se manter informaes. Por exemplo, em um sistema de informaes para controlar os processos de uma escola, alguns exemplos de entidades poderiam ser Alunos, Cursos, Turmas, Avaliaes, Disciplinas e Professores. J em um sistema para controlar os processos de contas a pagar, algumas entidades podem ser os Fornecedores, Boletos, Notas fiscais e Bancos, entre outras.

25
www.metodista.br/ead

A entidade representada atravs de um retngulo, que contm o nome da entidade. Alguns exemplos so mostrados abaixo:

Figura 4

Cada retngulo, que cada entidade, representa um conjunto de objetos sobre os quais deseja-se guardar informaes. Assim, no exemplo da Figura 4, o primeiro retngulo designa o conjunto de todos os funcionrios sobre os quais se deseja manter informaes no banco de dados, enquanto o segundo retngulo designa o conjunto de todos os projetos sobre os quais se deseja manter informaes. Caso seja necessrio referir-se a um objeto particular (um determinado funcionrio ou um determinado departamento) fala-se em ocorrncia de entidade ou instncia de entidade. Da forma como est apresentada, o modelo da Figura 4 indica apenas quais os conjuntos de objetos sobre os quais deseja-se manter informaes, mas no quais as informaes que devem ser mantidas para cada objeto. Estas informaes so definidas pelas propriedades das entidades, dadas pelos relacionamentos, atributos e generalizaes/especializaes.

ATRIBUTO
O conceito de atributo serve para associar informaes a ocorrncias de entidades ou de relacionamentos. O atributo o elemento que representa um determinado dado de uma ocorrncia de uma entidade ou de um relacionamento.

O atributo pode ser de diferentes tipos. Um atributo simples tem a seguinte representao:

Figura 5

Nesta figura, acima, nota-se que os atributos cdigo e tipo esto associados por meio de uma linha ligando o crculo que representa o atributo a uma entidade.

26
Universidade Metodista de So Paulo

ATRIBUTO IDENTIFICADOR
Uma condio que toda entidade possua uma identificao demostrando que cada entidade nica, por exemplo, a entidade projeto, na figura 5, tem o atributo cdigo associado a ela para identificar que um projeto diferente do outro. Este tipo de atributo chamado de atributo identificador com o seu crculo preenchido.

RELACIONAMENTO
Uma das propriedades sobre as quais pode ser desejvel manter informaes a associao entre objetos. Exemplificando, em um sistema de contas a pagar importante saber-se a qual fornecedor se associa um boleto a ser pago. A propriedade de entidade que especifica as associaes entre objetos o relacionamento. O relacionamento associa as ocorrncias de uma entidade outra entidade, conforme comentado no pargrafo anterior, por exemplo, cada boleto, que uma ocorrncia da entidade boleto, estar associado a um fornecedor especfico que, por sua vez, uma ocorrncia da entidade fornecedor. O relacionamento representado por um losango, ligado por linhas aos retngulos, que representam as entidades que participam do relacionamento. A figura 6, a seguir, representa o relacionamento comentado anteriormente:

Figura 6

Neste modelo, vemos que o Fornecedor se associa ao Boleto pelo relacionamento Emite, ou seja, o fornecedor que emite o boleto para pagamento. Este modelo expressa que o BD mantm informaes sobre:

um conjunto de objetos classificados como Fornecedores (entidade FORNECEDOR); um conjunto de objetos classificados como Boletos (entidade BOLETO); e um conjunto de associaes, cada uma ligando um Fornecedor a cada Boleto emitido por ele (relacionamento EMITE); Note os atributos, de fato sem eles a entidade no corretamente representada, pois os dados residem nos atributos da entidade.
27
www.metodista.br/ead

Quando nos referirmos a associaes especficas em um relacionamento, vamos nos referir a ocorrncias ou instncias de relacionamentos. No caso do relacionamento EMITE, uma ocorrncia seria um par especfico, formado por uma determinada ocorrncia da entidade FORNECEDOR e por uma determinada ocorrncia da entidade BOLETO.

Para fins didticos, vamos utilizar um diagrama de ocorrncias (HEUSER, 2009), apresentado na Figura 7. Este diagrama refere-se ao Diagrama ER da Figura 6. Em um diagrama de ocorrncias, ocorrncias de entidades so representadas por crculos brancos e ocorrncias de relacionamentos por crculos negros. As ocorrncias de entidade participantes de uma ocorrncia de relacionamento so indicadas pelas linhas que ligam o crculo negro representativo da ocorrncia de relacionamento aos crculos brancos representativos das ocorrncias de entidades relacionadas. Assim, a Figura acima representa que, entre outras, h uma ocorrncia de EMITE que liga o fornecedor f1 com o boleto b1. Observe-se que, na forma como est, o modelo da Figura acima no informa quantas vezes uma entidade associada atravs de um relacionamento (veremos como isso pode ser representado mais adiante). O modelo apresentado permite que uma ocorrncia de entidade (por exemplo, o fornecedor f4) no esteja associada a alguma ocorrncia de entidade atravs do relacionamento, e que uma ocorrncia de entidade (por exemplo, o boleto b3) esteja associada a exatamente uma ocorrncia de entidade atravs do relacionamento ou, ainda, que uma ocorrncia de entidade fornecedor (por exemplo, o forncedor f1) esteja associada a mais de uma ocorrncia de entidade boleto atravs do relacionamento.

AUTORRELACIONAMENTO
No obrigatrio um relacionamento associar-se a ocorrncias de entidades diferentes. A Figura abaixo mostra um DER de um autorrelacionamento, isto , um relacionamento entre ocorrncias de uma mesma entidade. Neste caso, necessrio um conceito adicional, o de papel da entidade no relacionamento. 28
Universidade Metodista de So Paulo

Figura 8

No caso do relacionamento de superviso, os funcionrios so supervisionados por um chefe que, por sua vez, tambm um funcionrio, uma ocorrncia de funcionrio exerce o papel de chefe e a outra ocorrncia de pessoa exerce o papel de supordinado. Papis so anotados no DER como mostrado na Figura 8. No caso de relacionamentos entre entidades diferentes, como o de FORNECEDOR EMITE BOLETO mostrado na Figura 6 anteriormente, no necessrio indicar os papis das entidades, j que eles so bvios. A Figura 9 apresenta um diagrama de ocorrncias para o Modelo ER da Figura 8. Observe os papis de chefe e subordinado das ocorrncias da entidade Funcionrio, em cada ocorrncia de relacionamento as linhas que ligam os crculos representativos das ocorrncias Chefecom as ocorrncias representativas de Subordinado.

Figura 9

No diagrama da figura 9, notamos que a relao de superviso para as ocorrncias a seguinte: Funcionrio f4 chefe do funcionrio f5 que , por consequncia, subordinado ao f4; Funcionrio f5 chefe do funcionrio f3 que , por consequncia, subordinado ao f5; ao f3. Funcionrio f3 chefe dos funcionrios f1 e f2 que so, por consequncia, subordinados

O motivo de se usar a mesma entidade para caracterizar os papis que partimos do princpio de que todos so funcionrios. O atributo cargo da entidade cumpre o papel de diferenciao entre os diferentes cargos existentes. O aluno poder pensar em criar uma entidade diferente para 29
www.metodista.br/ead

cada cargo, mas esta soluo fraca, pois a cada novo cargo ou nvel hierrquico criado haveria a necessidade de alterar fisicamente o banco de dados, o que tornaria o sistema pouco prtico. Tambm existem outros motivos relacionados performance e integridade da informao que tornam a soluo do autorrelacionamento a melhor para o requisito de diferentes papis exercidos por uma mesma entidade.

CARDINALIDADE
O conceito de cardinalidade de grande importncia para a modelagem de banco de dados. Para fins de projeto de banco de dados, a cardinalidade uma caracterstica do relacionamento. A cardinalidade qualifica quantas ocorrncias de uma entidade se relacionam com as ocorrncias da entidade a qual est associada no relacionamento. traduziada pela anotao do nmero mnimo e mximo de ocorrncias relacionadas entre as entidades. As cardinalidades possveis so as seguintes:

- (0,1) L-se no mnimo Zero ocorrncia e no mximo Uma ocorrncia; - (1,1) L-se no mnimo Uma ocorrncia e no mximo Uma ocorrncia; - (0,n) L-se no mnimo Zero ocorrncia e no mximo vrias ocorrncias; - (1,n) L-se no mnimo Uma ocorrncia e no mximo vrias ocorrncias; - (n,n) ou (n,m) L-se no mnimo Vrias ocorrncias e no mximo Vrias ou Muitas ocorrncias, (n,n) e (n,m) so equivalentes e tm o mesmo significado. Importante ressaltar que este tipo de cardinalidade existe somente no modelo conceitual e no estar presente no modelo lgico, as demais persistem no modelo lgico.
Agora, vamos para um exemplo prtico, vamos modelar os seguintes requisitos:

Uma empresa composta de empregados que so organizados em departamentos no qual trabalham com atividades de uma rea especfica, por exemplo, finanas, vendas, oficina e assim por diante. Todo empregado trabalha em um nico departamento. Todo departamento composto de, no mnimo, um empregado. Departamento pode ter mais de um empregado.
O modelo abaixo atende a estes requisitos:

Figura 10

30
Universidade Metodista de So Paulo

A figura 10 um Diagrama ER, ou seja, um Modelo ER, contendo o relacionamento e as entidades Empregado trabalha no Departamento. Agora, para melhor entendimento da quantidade de ocorrncias que se relacionam entre uma entidade e a outra, vamos analisar o Diagrama de Ocorrncias:

Figura 11

No diagrama de ocorrncias da figura 11, podemos analisar os seguintes requisitos:

Todo Empregado trabalha para um departamento e somente um departamento. Neste caso, sabemos que cada ocorrncia da entidade Empregado se relaciona com no mnimo uma ocorrncia da entidade Departamento e tambm que cada ocorrncia da entidade Empregado se relaciona com mximo uma ocorrncia da entidade Departamento. Todo Departamento composto de um ou mais empregados. Neste caso, sabemos que cada ocorrncia da entidade Departamento se relaciona com no mnimo uma ocorrncia da entidade Empregado e tambm que cada ocorrncia da entidade Departamento se relaciona com no mximo vrias ocorrncias da entidade Empregado. O Modelo ER correspondente aos requisitos acima com as suas cardinalidades representadas, o seguinte:

31
www.metodista.br/ead

Figura 12

Na Figura 12, note os nmeros entre parnteses. O primeiro nmero a cardinalidade mnima e o segundo a mxima. Ao lado da entidade Empregado est a sua cardinalidade (1,N) e o mesmo ocorre com o departamento com a sua cardinalidade (1,1) no relacionamento Trabalha. A cardinalidade caracterstica de todo relacionamento e sempre haver a indicao da cardinalidade mnima e mxima para cada extremo do relacionamento. Neste exemplo acima, l-se, cada ocorrncia da entidade Empregado est relacionada com no mnimo uma e no mximo uma ocorrncia da entidade Departamento, e cada ocorrncia entidade Departamento est relacionada com no mnimo uma e no mximo vrias ocorrncias da entidade Empregado.

TIPOS DE RELACIONAMENTO
Os relacionamentos so classificados quanto a sua cardinalidade mxima nos seguintes tipos de relacionamento:

Relacionamento 1:1 ou Relacionamento Um para Um; Relacionamento 1:n ou Relacionamento Um para Vrios; Relacionamento n:n (ou n:m) ou Relacionamento Vrios para Vrios ou Vrios para Muitos. As anotaes n:n e n:m so equivalentes e tm o mesmo significado. Importante ressaltar que este tipo de relacionamento existe somente no modelo conceitual e no estar presente no modelo lgico, os demais persistem no modelo lgico.

32
Universidade Metodista de So Paulo

A seguir, so apresentados os exemplos dos tipos de Relacionamentos: Relacionamento 1:1 ou Relacionamento Um para Um

Figura 13

Para entender este relacionamento, sua cardinalidade e tipo, vamos primeiro entender seus requisitos: - A pessoa pode estar Viva ou Morta, sendo assim pode No ter um Atestado de bito. Por este motivo, a cardinalidade mnima no atestado Zero e somente um atestado pode existir por pessoa quando esta falecer; - Todo atestado de bito, quando existir, est relacionado a somente uma pessoa no mnimo e no mximo. O tipo de relacionamento aqui apresentando do tipo um para um. Note que a cardinalidade mxima de ambos os extremos do relacionamento denotam esta caracterstica. Relacionamento 1:n ou Relacionamento Um para Vrios

Figura 14

Este relacionamento da figura 14 atende aos seguintes requisitos: - O curso pode ter no mnimo nenhum aluno matriculado e no mximo vrios alunos matriculados. - O Aluno para ser aluno deve estar matriculado no mnimo em um curso e em mais nenhum outro. O tipo de relacionamento aqui apresentando do tipo um para vrios. Note que a cardinalidade mxima de ambos os extremos do relacionamento denotam esta caracterstica. 33
www.metodista.br/ead

Mais um exemplo deste tipo de relacionamento, agora analisando um exemplo de autorrelacionamento apresentado anteriormente na figura 8 e representado na figura abaixo com as suas cardinalidades:

Figura 15

O relacionamento da figura 15 atende aos seguintes requisitos:

- O funcionrio possui no mnimo nenhum e no mximo vrios funcionrios como subordinados, a cardinalidade mnima igual a zero representa o caso do assistente que no possui Subordinados.
- O funcionrio responde a no mnimo nenhum e no mximo a nico Chefe. Neste caso, a cardinalidade mnima igual a Zero para contemplar ao requisito que h funcionrios que no possuem Chefe, por exemplo, o presidente da empresa no possui Chefe. O tipo de relacionamento aqui apresentando do tipo um para vrios. Note que a cardinalidade mxima de ambos os extremos do relacionamento denotam esta caracterstica. Relacionamento n:n ou Relacionamento Vrios para Vrios (ou tambm chamado Vrios para Muitos).

Figura 16

34
Universidade Metodista de So Paulo

Este relacionamento da figura 16 representa aos seguintes requisitos: - O Empregado pode estar alocado ou no em um ou mais projetos; - O projeto para existir deve ter alocado para ele, um Empregado, e tambm pode ter alocado vrios Empregados. O tipo de relacionamento aqui apresentando do tipo vrios para vrios muitas vezes chamado, tambm, de vrios para muitos ou, ainda, muitos para muitos. Note que a cardinalidade mxima de ambos os extremos do relacionamento denotam esta caracterstica.

ATRIBUTO ASSOCIADO A UM RELACIONAMENTO


Uma novidade neste relacionamento da figura 16 o atributo associado a um relacionamento. Assim como entidades os relacionamentos podem possuir atributos. No exemplo da figura 16, o atributo Horas Alocadas tem o objetivo de registrar a quantidade de horas que o funcionrio dedicar a cada um dos projetos que pode participar. Podemos, tambm, alternativamente representar este tipo de relacionamento Vrios para Vrios com dois relacionamentos Um para Vrios, com a mesma funo no Modelo ER, ,alis, esta ser a soluo a ser empregada no modelo lgico que logo mais veremos.

ATRIBUTO MULTIVALORADO
O Atributo multivalorado representa a informao que ocorre mais de uma vez para uma mesma entidade.

Figura 17

Analisando o modelo ER acima, conclumos que o Empregado pode ter nenhum, um ou mais telefones, por exemplo, pode ter o telefone residencial e dois telefones Celulares ou mesmo pode no ter telefones. No exemplo da figura 17, este requisito esta representado pela cardinalidade atribuda ao atributo Telefone, em que podemos ler que o atributo telefone pode no mnimo no existir e no mximo existir vrias vezes para um mesmo Empregado.

ATRIBUTO DERIVADO
O Atributo derivado representa a informao que obtida por clculo a partir de outro atributo, o atributo derivado meramente informativo no modelo e no existir no modelo lgico. 35
www.metodista.br/ead

Figura 18

Neste modelo ER, acima, o atributo idade representado por linhas pontilhadas denotando que este atributo do tipo atributo derivado, o motivo que a idade uma informao obtida por um clculo a partir da informao da data de nascimento e por este motivo o atributo derivado idade est ligado ao atributo data de nascimento. Os atributos derivados no constaro no modelo lgico, porque realmente no so armazenados. A sua representao no modelo ER tem por finalidade ajudar ao desenvolvedor, mostrando qual a informao que ser obtida. Neste caso do exemplo da figura 18, o modelo indica que o desenvolvedor dever fazer um clculo com a informao do atributo Data de Nascimento para obter a idade.

ATRIBUTO COMPOSTO
O Atributo Composto representa a informao agrupada, ou seja, este tipo de atributo composto por outros atributos.

Figura 19

Na figura 19, apresentando o modelo ER com o atributo Endereo do tipo composto. Todo atributo composto tem em sua estrutura outros ligados a ele. Neste caso, o endereo composto pelos atributos Rua, Nmero, Cidade, Estado e CEP. 36
Universidade Metodista de So Paulo

GENERALIZAO E ESPECIALIZAO
Utilizamos o recurso de generalizao e especializao quando h subtipos relevantes a serem modelados. Com este recurso podemos atribuir propriedades particulares a um subgrupo de ocorrncias de uma mesma entidade.

MODELO ER, DIAGRAMA ER


Ambos so sinnimos, o Modelo Entidade Relacionamento (MER) e o Diagrama Entidade Relacionamento (DER). comum referir- se com mais frequncia utilizando a abreviatura DER.
Figura 20

EXEMPLO PRTICO
O DER da figura abaixo um modelo proposto para um sistema que controla o cadastro de funcionrios, seus dependentes, departamentos, e os projetos em que os funcionrios trabalham.

Figura 21

37
www.metodista.br/ead

No DER apresentado na figura 21 podemos verificar vrios conceitos apresentados anteriormente, agora consolidados em nico DER.

ENTIDADE FRACA
chamada de entidade fraca quando no relacionamento a sua cardinalidade mnima Zero, ou seja, ela opcional no relacionamento. No exemplo da figura 21, observamos uma entidade fraca no relacionamento Empregado Possui Dependente. Neste caso, a entidade fraca Dependente, pois para uma ocorrncia de Empregado existir no necessrio existir uma ocorrncia de Dependente, mas para Dependente existir necessrio que exista uma ocorrncia de Empregado. A entidade fraca tambm chamada de entidade opcional. Tambm pode ser utilizada a opo de representar a entidade fraca no somente pela sua cardinalidade, mas tambm por uma linha mais larga do seu lado do relacionamento.

PROPRIEDADES RELEVANTES NA MODELAGEM ER


importante considerar algumas propriedades relevantes na fase de modelagem conceitual (HEUSER, 2009):

Um modelo ER um modelo formal:

Um modelo ER um modelo formal, preciso, no ambguo. Em outras palavras, diferentes pessoas lendo o mesmo modelo ER devem entender exatamente o mesmo significado. Modelos ER tm poder de expresso limitado: Em um modelo ER esto registradas apenas algumas propriedades de um banco de dados, h mais elementos importantes para o projeto do banco de dados, principalmente relevantes para a implementao fsica, tais como, restries de integridade entre outras. Diferentes modelos podem ser equivalentes: Considerando a finalidade do projeto de banco de dados, dois modelos ER so equivalentes quando ambos geram o mesmo esquema de banco de dados.

CONSIDERAES SOBRE O ASPECTO TEMPORAL DA INFORMAO


O Banco de dados e o seu modelo ER correspondente devem refletir o aspecto temporal quando exigido no requisito, e, portanto, deve ser considerado na modelagem. Um exemplo o relacionamento Empregado Trabalha Departamento, que foi representado na figura 18. Da forma como foi implementado o modelo nesta figura, no seria possvel registrar historicamente os vrios departamentos em que um Empregado pode trabalhar em uma empresa durante a sua trajetria profissional. Caso o requisito para o sistema exija este registro histrico, o modelo ER que cobre adequadamente esta exigncia o seguinte: 38
Universidade Metodista de So Paulo

Figura 22

Na figura 22 foi adicionada a entidade Lotao. Seu objetivo registrar o histrico dos departamentos que o funcionrio trabalhou na empresa durante a sua carreira. A entidade Lotao associa o empregado ao departamento que trabalha ou que trabalhou. Na entidade Lotao, o seu atributo identificador sendo a data de incio, assegura que haver somente uma lotao por data. Para se consultar onde este funcionrio, atualmente, est trabalhando, basta consultar a ltima ocorrncia da entidade Lotao e, em seguida, consultar a ocorrncia da entidade Departamento que estiver associada a esta ocorrncia especfica da entidade Lotao. Note, ainda, que no exemplo da figura 22, as cardinalidades asseguram que cada ocorrncia da entidade Lotao estar associada a uma nica ocorrncia das entidades Departamento e Empregado, e que tambm toda ocorrncia da entidade Empregado e da entidade Departamento poder ter uma ou mais lotaes.

MODELO LGICO
Este modelo a representao do Banco de Dados Relacional e geralmente a transformao do modelo ER, que um modelo abstrato. Adotamos a abordagem de transformao do Modelo ER em Modelo Lgico, sendo esta uma fase do projeto de Banco de Dados Relacional posterior a Modelagem Conceitual na qual obtemos o Diagrama Entidade Relacionamento (DER). Antes de iniciarmos o estudo dos passos de transformao do Modelo ER para o Modelo Lgico, apresentamos a composio de um Banco de Dados Relacional.

BANCO DE DADOS RELACIONAL


O Banco de Dados Relacional composto por tabelas tambm chamadas de relaes. Vamos empregar a terminologia tabela que a mais comum e tambm a adotada pelos produtos comerciais de gerenciamento de banco de dados.

TABELA
A tabela um conjunto de linhas (tuplas, na terminologia acadmica). A tabela identificada pelo seu nome. Cada linha composta por uma srie de campos (valor de atributo, na terminologia acadmica). 39
www.metodista.br/ead

Cada campo identificado por um nome de campo (nome do atributo). O conjunto de campos de um mesmo nome forma a coluna da tabela. Os valores, que so as informaes armazenadas nos campos da tabela, so atmicos e monovalorados. Atmico significa que o campo no pode ser composto de outros. E monovalorado significa que o campo possui somente um valor, ele no um campo do tipo vetor (arranjo ou array).

Figura 22

CHAVE
um conceito bsico que tem as funes de identificar as linhas e de estabelecer relaes entre as tabelas. H trs tipos de chaves: Chave Primria, Chave Estrangeira e Chave Alternativa.

CHAVE PRIMRIA
A chave primria uma coluna ou combinao de colunas que tornam cada linha da tabela nica, ou seja, identifica cada linha da tabela como distinta das demais. Na figura abaixo, um exemplo de tabela com chave primria composta.

Figura 24

40
Universidade Metodista de So Paulo

Na figura abaixo, um exemplo de tabela com chave primria no composta.

Figura 25

CHAVE ESTRANGEIRA
A chave estrangeira uma coluna ou combinao de colunas que correspondem aos valores de uma chave primria de outra tabela. A chave estrangeira o meio pelo qual implementado o relacionamento entre tabelas de um banco de dados relacional. Na figura abaixo, encontra-se um exemplo de chave estrangeira.

Figura 26

Na Figura 26, a tabela Aluno possui uma chave estrangeira que formada pelo atributo Curso, que tem valores iguais aos valores de uma chave primria de outra tabela chamada Curso. Note que, tambm, possui a chave primria Matrcula para atender ao requisito obrigatrio da modelagem relacional em que toda tabela deve conter uma coluna que identifica cada ocorrncia como nica. Neste caso, o nmero da matrcula ser nico mesmo que ocorram alunos com nomes idnticos.

41
www.metodista.br/ead

Na figura 27, podemos ver o relacionamento entre a chave estrangeira da tabela Aluno e a chave primria da tabela Curso, verificando os valores correspondentes em cada tabela do atributo Curso, que contm o cdigo de cada curso.

Figura 27

CHAVE ALTERNATIVA
H situaes em que h mais de uma coluna ou mais de um conjunto de colunas que pode perfeitamente indicar a distino de uma linha das demais, uma destas colunas ou conjunto de colunas ser a chave primria e as demais sero as chaves alternativas. As chaves alternativas so muito utilizadas para se encontrar a informao por meio de outras referncias alm da coluna ou colunas que determinam a chave primria.

Figura 28

Na figura acima, h um exemplo de chave alternativa.

42
Universidade Metodista de So Paulo

AS CHAVES E A RESTRIO DE INTEGRIDADE


importante ressaltar que o conceito de chave primria e de chave estrangeria so importantes restries de integridade, ou seja, existem no somente para identificar as linhas e construir relacionamentos, respectivamente, mas tambm garantem a integridade da informao de forma que somente os valores permitidos possam ser inseridos e / ou alterados nas suas colunas.

ESQUEMA TEXTUAL DO BANCO DE DADOS RELACIONAL


Uma notao compacta de esquema textual bem prtica e de fcil utilizao. A seguir, mostrado um esquema textual correspondente s tabelas da figura 27.

Figura 29

Na figura 29, o esquema textual utiliza o sublinhado para indicar a chave primria. O nome da tabela est fora dos parnteses enquanto que dentro dos parnteses esto os atributos (colunas). A chave estrangeira indicada pela seta quando liga a coluna, que chave estrangeira, ao seu correspondente de chave primria na outra tabela. Note que as cardinalidades mnimas e mximas so representadas nos extremos do relacionamento indicado pela seta que une a chave estrangeira com a chave primria.

DIAGRAMAO DO BANCO DE DADOS RELACIONAL


Existem diversos esquemas diagramticos para o modelo relacional. A seguir, um exemplo muito utilizado atualmente: O diagrama da figura 30 trata os elementos da seguinte forma: Chave Primria: A coluna ou o conjunto de colunas a que se atribui o papel de chave primria tem ao extremo do lado esquerdo as iniciais PK entre parnteses. Estas iniciais so a traduo de chave primria para a lngua inglesa (Primary Key). Chave Estrangeira: A coluna ou o conjunto de colunas a que se atribui o papel de chave estrangeira tem ao extremo do lado esquerdo as iniciais FK entre parnteses. Estas iniciais so a traduo de chave estrangeira para a lngua inglesa (Foreign Key) e a seta liga a tabela que contm a chave estrangeira com a tabela que contm a chave primria correspondente no relacionamento.
Figura 30

43
www.metodista.br/ead

TRANSFORMAO ENTRE OS MODELOS ER E LGICO


A transformao entre os modelos Entidade Relacionamento (ER) e o Modelo Lgico (Banco de dados Relacional) implementada por um processo de passos. A seguir, descrevemos um processo simplificado:

PASSOS DA TRANSFORMAO
Para toda entidade no Modelo ER cria-se uma tabela para o modelo relacional. Os atributos desta tabela sero os atributos simples da entidade ou componentes simples de atributos compostos. A chave primria desta tabela ser um dos atributos identificadores da entidade. Os atributos compostos sero sempre decompostos em atributos simples. Para toda entidade fraca, ou seja, com cardinalidade mnima Zero no Modelo ER, cria-se uma nova tabela no modelo relacional. Os atributos desta tabela sero os atributos simples da entidade ou componentes simples de atributos compostos mais a chave primria (como chave estrangeira) da tabela proprietria. A chave primria desta tabela ser a chave primria da tabela proprietria mais o identificador da entidade fraca. Para todo relacionamento do Um para Um, na chave primria de uma das tabelas envolvidas no relacionamento (preferencialmente a de cardinalidade mnima zero, se houver), inclui-se como chave estrangeira a chave da outra tabela envolvida no relacionamento. Os atributos do relacionamento acompanham a chave estrangeira. Para todo relacionamento do tipo Um para Vrios pega-se a chave primria da tabela do lado 1 e inclui-se como chave estrangeira na tabela do lado N. Os atributos do relacionamento acompanham a chave estrangeira. Para todo relacionamento do tipo Vrios para Vrios cria-se uma nova tabela. Os atributos desta tabela sero as chaves primrias das tabelas envolvidas, includas como chave estrangeira, mais os atributos do prprio relacionamento. A chave primria desta tabela ser as chaves primrias das tabelas envolvidas. Para todo atributo multivalorado cria-se uma nova tabela. Os atributos desta tabela sero a chave primria da tabela de origem mais o prprio atributo multivalorado. A chave primria dessa tabela deve ser composta destes dois atributos. Preferencialmente, eliminar a especializao utilizando atributos adicionais na entidade generalizada. Estes atributos devem conter como domnio as especializaes. Caso no seja possvel o procedimento acima, optar por incluir nas entidades especficas a chave primria da entidade geral como chave estrangeira.

44
Universidade Metodista de So Paulo

EXEMPLO DE TRANSFORMAO ENTRE MODELOS


Utilizando o software BR-Modelo, geramos o seguinte Modelo Lgico de um banco de dados relacional com base na transformao do modelo conceitual, ou seja, o Modelo Entidade Relacionamento do DER da figura 21.

Figura 31

Na figura 31, o modelo produzido com a ferramenta BR-Modelo utiliza a seguinte nomenclatura: - Chave Primria Chaves em Amarelo. - Chave Estrangeira Chaves em Cinza. - Coluna de uma chave primria composta, que tambm uma chave estrangeira - Chaves em dourado com uma parte em cinza. - Atributos com nomes e tipos de dados. - Nome da Tabela no topo do retngulo. - Relacionamentos so as linhas ligando as entidades e apresentando as cardinalidades mnimas e mximas de cada relacionamento. Nota-se o seguinte: - Cada entidade do modelo conceitual se torna uma tabela. - O relacionamento muitos para muitos, que alocava os Empregados nos Projetos, foi substitudo por uma nova tabela e dois relacionamentos um para vrios. 45
www.metodista.br/ead

- A chave Primria da tabela Alocao criada a partir de um relacionamento do modelo conceitual possui uma chave primria composta de duas colunas e estas duas colunas tambm so chaves estrangeiras cada uma. - Note que no lugar do atributo multivalorado Telefone foi criada a tabela Telefone. - Nesta tabela Telefone, a chave primria composta pelo prprio atributo telefone e mais o atributo cdigo do empregado, sendo este ltimo tambm uma chave estrangeira.

Referncias CHEN, P. P.-S. The entity-relationship modeltoward a unified view of data. ACM Transactions on Database Systems (TODS) , 1 (1), 9-36, (1976). CODD, E. F. A relational model of data for large shared data banks. (P. Banxedale, Ed.) Communications of the AMC , 13 (6), (1970), p. 377-387. DATE, C. J. Introduo a Sistemas de Banco de Dados. Sao Paulo, SP: Editora Campus, (2004). ELMASRI, R. Sistemas de Banco de Dados. Traduo da 6. ed. americana). So Paulo, SP: Pearson, (2011). HEUSER, C. Projeto de Banco de Dados. Porto Alegre/RS, Brasil: Bookman, (2009).

46
Universidade Metodista de So Paulo

Modelagem e Documentao de sistemas

Engenharia de Requisitos Parte 1


Prof. Me. Andr Luiz Perin

Mdulo

Apresentar a disciplina e definir os conceitos bsicos de engenharia de software. Apresentar o ciclo de vida de software e os processos de software.

Objetivos:

Engenharia de software; engenharia de requisitos; ciclo de vida de software.

Palavras-chave:

www.metodista.br/ead

INTRoduo
Software de computador pode ser entendido como o conjunto de programas que podem ser executados em computadores de qualquer tipo e arquitetura, seu contedo e seus documentos, em formato digital ou impresso. Os profissionais de software so aqueles que constroem e/ou mantm o software ao longo do tempo. Tanto a construo quanto a manuteno do software no seguem os mesmos processos conhecidos de outras reas. A essncia da engenharia de software envolve algumas etapas que podem ser resumidas nos seguintes itens: compreenso do problema, planejamento da soluo, execuo do plano e verificao do resultado.

Compreenso do Problema
A Compreenso do Problema a etapa inicial e envolve as tarefas de Comunicao e Anlise. A fase de Comunicao feita atravs da interao entre as partes interessadas, ou seja, o cliente ou seus representantes e o desenvolvedor ou grupo de desenvolvedores.

Planejamento da soluo
Alm das tarefas de gerenciamento de projetos, que so entendidas como as tarefas que no fazem parte do ciclo de vida de software e podem ser utilizadas por qualquer tipo de produto, envolve as tarefas de Modelagem e Projeto de Software. A tarefa de Modelagem de Software define o conjunto de atividades necessrias para a construo de um ou mais modelos do sistema. O Projeto de Software envolve a elaborao de modelos mais aprofundados e tcnicos, voltados ao programador, com o objetivo de fornecer detalhes tcnicos que, muitas vezes, no so de conhecimento do cliente.

Execuo do Plano
A execuo do plano de projeto envolve a gerao de cdigo, sua transformao em executvel e alguns testes iniciais.

Verificao do Resultado
Para verificar o resultado so conduzidos testes com os objetivos de achar defeitos ou falhas do software, tanto no processo que o software automatiza quanto na sua aderncia aos desejos e necessidades do cliente. As atividades de garantia da qualidade do software so estabelecidas com o objetivo de minimizar ou eliminar os defeitos do software durante e aps a sua construo.

ENGENhaRia dE SisTEmas
A engenharia de sistemas parte do princpio que o software parte de algo maior e os objetivos do sistema devem ser estabelecidos antes de serem estabelecidos os objetivos do software. O profissional responsvel pelo sistema, ou engenheiro de sistemas, trabalha com o objetivo de entender as necessidades dos sistemas, ou requisitos, atravs da interao com o cliente, os futuros usurios e quaisquer outros interessados.

48
Universidade Metodista de So Paulo

Sistemas baseados em computador


Um sistema baseado em computador pode ser definido como um conjunto ou arranjo de elementos organizados para atingir alguma meta pr-definida por meio do processamento da informao (PRESSMAN, 2006). A meta ou objetivo definido pode ser desde a automao, uma simples funo do negcio, at a gerao de um produto completo.

ELEmENTos dE um sisTEma BasEado Em compuTadoR


Um sistema pode ser composto e utilizar diversos elementos do sistema. So eles:

Software
Pode ser definido como programas de computador, estruturas de dados e outros produtos de trabalho necessrios.

Hardware
So os equipamentos ou dispositivos eletrnicos ou eletromecnicos que possuem capacidade computacional (computadores, microcontroladores e conexes de comunicao) e permitem o fluxo de informaes e acesso s funes do mundo externo (sensores e atuadores).

Pessoal
So as pessoas que utilizam o sistema (usurios) e as pessoas que mantm o sistema (operadores), tanto na parte de hardware quanto de software.

Banco de dados
o grande conjunto de informaes organizadas, persistente ao longo do tempo e acessvel por meio de software.

Documentao
So os documentos que descrevem o sistema, o seu uso e a sua operao, tanto para os operadores quanto para os usurios. Podem tambm incluir os documentos utilizados para a construo do sistema.

Procedimentos
So as etapas que definem o uso e o contexto de cada elemento especfico do sistema.

HiERaRQuia da ENGENhaRia dE SisTEmas


Um sistema complexo pode ser interpretado como um conjunto de elementos que so eles mesmos outros sistemas. A hierarquia da engenharia de sistemas envolve um conjunto de procedimentos que trata o sistema a partir de seu nvel mais alto para o mais baixo, chamados de top-down, e outro conjunto que trata o sistema a partir de seu nvel mais baixo para o mais alto, chamados de bottom-up. Ao percorrer a hierarquia do sistema deve-se utilizar tais mtodos. A Figura 1 mostra um exemplo de hierarquia de sistemas, em que o seu nvel mais alto, chamado de viso de mundo pode ser decomposto em elementos menores, chamados de domnio. Os domnios podem ser sistemas ou conjuntos de sistemas e podem ser divididos em elementos. Os elementos, por sua vez, podem ser divididos em componentes tcnicos (programas, mdulos, classes ou at mesmo comandos de linguagens de programao).

49
www.metodista.br/ead

Figura 1 - Hierarquia da Engenharia de Sistemas Fonte: adaptado de Pressman (2006)

ModELaGEm do SisTEma
A modelagem do sistema define os processos que servem s necessidades da viso considerada. Cada nvel da hierarquia deve ser representado pelo conjunto adequado de modelos. Ela representa o comportamento dos processos e os pressupostos nos quais o comportamento est baseado. Esses pressupostos podem conter alguns fatores restritivos, como por exemplo, os prprios pressupostos, simplificaes, limitaes, restries e preferncias. Os pressupostos podem reduzir a quantidade dae possveis variaes do sistema. As simplificaes permitem a criao dos modelos nos prazos adequados. As limitaes ajudam a cercar o escopo do sistema. As restries ajudam no direcionamento da criao dos modelos. Por fim, as preferncias indicam as solues de tecnologia, dados, funes e etc. que tm relao direta com a satisfao do cliente. A definio explcita, tanto as entradas exgenas quanto as endgenas do modelo, tambm faz parte da modelagem. As entradas exgenas so aquelas entradas que ligam uma parte de 50
Universidade Metodista de So Paulo

uma determinada viso a outras partes do mesmo nvel ou de outros nveis. As entradas endgenas so aquelas que ligam componentes individuais de uma parte em uma determinada viso. A modelagem do sistema tambm representa todas as ligaes (inclusive sadas) que permitiro ao engenheiro compreender melhor a viso.

PRocEssos dE SoFTWaRE
Os chamados processos de software so os conjuntos de atividades para especificar, projetar, implementar e testar sistemas de software.

Processo de software
Uma definio mais adequada a um processo de software pode ser dada por um conjunto estruturado de atividades necessrias para desenvolver um sistema de software. Um processo de software contm as etapas de especificao, projeto, validao, etc. e pode ser caracterizado por um modelo de processo. Um modelo de processo de software uma representao abstrata de um processo. Ele apresenta uma descrio de um processo de uma perspectiva particular. Cada organizao pode definir e adotar o seu prprio modelo de processo, porm, a maioria das organizaes adota um modelo genrico e desenvolve adaptaes desse modelo para ajust-lo sua prpria cultura.

ModELos GENRicos dE pRocEsso dE soFTWaRE


Os modelos genricos de processo de software foram desenvolvidos para organizar as atividades de desenvolvimento de software. Existem diversos modelos genricos de processo de software, por exemplo, o modelo em cascata, o modelo incremental, o desenvolvimento evolutivo, o modelo espiral, etc.

Modelo Cascata
O modelo cascata de desenvolvimento de software foi o primeiro modelo publicado e teve sua origem em processos mais gerais da engenharia de sistemas. O modelo cascata apresenta fases separadas encadeadas que representam os principais processos de desenvolvimento de software (Figura 2).

Figura 2 - Modelo cascata de desenvolvimento de software Fonte: adaptado de Sommerville (2011)

51
www.metodista.br/ead

Fases do modelo cascata


A primeira fase a fase de anlise e definio de requisitos, que tem por objetivo definir os servios, as restries e os objetivos do sistema detalhadamente para serem utilizados como uma especificao do sistema. Em seguida, a fase de projeto de sistema e de software, que tem como objetivo definir a arquitetura do sistema ou do software. A etapa de implementao e teste de unidade segue a de projeto e tem a finalidade de gerar os programas ou unidades dos programas assim como de realizar os testes iniciais nessas unidades. A etapa de integrao e testes do sistema realizada aps a fase de implementao e nela as unidades individuais de programas ou os programas so integrados e testados como um sistema completo. Um dos objetivos dessa fase garantir que os requisitos tenham sido atendidos e, aps os testes, o sistema liberado ao cliente ou usurio. A fase de operao e manuteno a ltima do processo e nela o sistema instalado e colocado em operao. A manuteno descrita nessa fase envolve a correo de erros no encontrados anteriormente, o aprimoramento das unidades desenvolvidas e na ampliao das funcionalidades medida que novos requisitos so encontrados.

Problemas do modelo cascata


Uma desvantagem do modelo cascata em relao a outros modelos a dificuldade de acomodar as mudanas no software aps o processo estar em andamento. Isso devido ao fato de o modelo ter as fases bem definidas e estanques, em que no possvel iniciar uma fase sem a anterior ter terminado. Isso faz com que esse modelo seja apropriado quando os requisitos so bem compreendidos.

DEsENvoLvimENTo EvoLucioNRio
O desenvolvimento evolucionrio tem base no desenvolvimento de uma implementao inicial, que mostrada ao cliente para que ele faa crticas e d sugestes e, ento, o resultado refinado por meio de vrias verses do sistema, que so criadas at que um sistema adequado seja obtido, como pode ser visto na Figura 3. Existem, basicamente, dois tipos de desenvolvimento evolucionrio, o desenvolvimento exploratrio e a prototipao.

Figura 3 - Desenvolvimento evolucionrio Fonte: adaptado de Sommerville (2011)

52
Universidade Metodista de So Paulo

Desenvolvimento exploratrio
Este processo possui o objetivo de trabalhar com clientes para explorar os requisitos e evoluir para o sistema final a partir de uma especificao inicial. Deve iniciar com requisitos bem compreendidos para as partes iniciais do sistema.

Prototipao
A prototipao possui o objetivo de entender os requisitos do sistema e, a partir disso, desenvolver uma melhor definio de requisitos do sistema. O prottipo deve se concentrar na experimentao dos requisitos mal compreendidos. O processo deve iniciar com requisitos mal compreendidos.

Problemas do Desenvolvimento Evolucionrio


Um dos problemas do desenvolvimento evolucionrio a falta de visibilidade do processo, pois se as verses so desenvolvidas rapidamente, no economicamente vivel produzir os documentos correspondentes s vrias verses. Outra desvantagem que os sistemas so mal estruturados devido s contnuas mudanas e cada nova mudana aumenta a dificuldade de introduzir outras mudanas.

DEsENvoLvimENTo BasEado Em REuso


Este processo baseado no reuso sistemtico de componentes em que os sistemas so integrados a partir de componentes existentes ou sistemas de prateleira. As etapas do desenvolvimento baseado em reuso so: anlise de componentes, modificao de requisitos, projeto de sistema com reuso, e desenvolvimento e integrao (Figura 4). Na anlise de componentes, a partir de uma especificao de requisitos dada, feita a busca pelos componentes que sejam adequados especificao, mas no necessariamente exatos. Na modificao de requisitos, primeiramente, so feitas anlises nos requisitos em funo das informaes dos componentes encontrados. Quando a modificao dos requisitos no possvel, novos componentes podem ser buscados. Na etapa de projeto do sistema com reuso, o framework do sistema projetado ou um framework j existente reusado. Aps o projeto do sistema com reuso, realizado o desenvolvimento. A integrao se encarrega de construir o software que no puder ser adquirido externamente, integrar os componentes de prateleira (componentes prontos disponveis no mercado) e testar o sistema completo.

Figura 4 - Desenvolvimento baseado em reuso Fonte: adaptado de Sommerville (2011)

PRocEssos ITERaTivos
Os requisitos do sistema sempre evoluem no decorrer de um projeto e, com isso, h mudanas no projeto do sistema, principalmente se ele for de grande porte. Um processo iterativo, em que os estgios iniciais so retrabalhados, um processo comum para os sistemas desses sistemas e, inclusive, a iterao pode ser aplicada a qualquer um dos modelos de processos genricos. 53
www.metodista.br/ead

Normalmente, so tratadas duas abordagens relacionadas, o processo de desenvolvimento incremental e o processo de desenvolvimento em espiral.

Desenvolvimento Incremental
O processo de desenvolvimento incremental (Figura 5) se concentra em ao invs de entregar o sistema todo em uma nica entrega, o desenvolvimento e a entrega so divididos em parcelas, chamadas incrementos, com cada incremento entregando uma parte da funcionalidade requerida. Os requisitos do usurio so priorizados e os requisitos de alta prioridade so includos nos incrementos iniciais. Uma vez que o desenvolvimento de um incremento iniciado, os requisitos so congelados, ou seja, no mudaro neste incremento, embora os requisitos para incrementos posteriores possam continuar a evoluir.

Figura 5 - Processo de desenvolvimento incremental Fonte: adaptado de Sommerville (2011)

Vantagens do Desenvolvimento Incremental


Algumas vantagens do desenvolvimento incremental em relao a outros processos podem ser vistas como, por exemplo, a funcionalidade do sistema estar disponvel ao cliente mais cedo ou os incrementos iniciais agirem como um prottipo para ajudar a descobrir requisitos para incrementos posteriores. Outras caractersticas tambm se mostram vantajosas como o menor risco de falha geral do projeto, uma vez que cada iterao envolve testes completos do sistema e tambm porque os servios de sistema de alta prioridade tendem a receber mais testes.

DEsENvoLvimENTo Em EspiRaL
No processo de desenvolvimento em espiral (Figura 6), o processo representado como uma espiral em vez de uma sequncia de atividades rastreveis. Cada volta na espiral representa uma fase no processo e no existem fases fixas como especificao ou projeto, por isso, as voltas na espiral so escolhidas dependendo do que exigido pelo cliente e os riscos so explicitamente avaliados e resolvidos ao longo do processo.

54
Universidade Metodista de So Paulo

Figura 6 - Processo de desenvolvimento de software em espiral Fonte: Sommerville (2011)

ATividadEs do PRocEsso dE DEsENvoLvimENTo dE SoFTWaRE Especificao de Software


A especificao de software o processo de estabelecer quais servios so necessrios e as restries na operao do sistema e do desenvolvimento. Normalmente, definida pelo processo de engenharia de requisitos, que, por sua vez, engloba as fases de estudo de viabilidade, coleta e anlise de requisitos, especificao de requisitos e validao de requisitos.

Projeto e Implementao de Software


o processo responsvel pela converso da especificao do sistema em um sistema executvel e envolve as tarefas de projeto de software e programao de software. O projeto de software consiste em projetar uma estrutura de software que atenda especificao e a implementao consiste em traduzir essa estrutura em um programa executvel. As atividades de projeto e implementao esto intimamente relacionadas e podem ser entrelaadas. As atividades do processo de projeto podem ser divididas em: projeto de arquitetura, especificao abstrata, projeto de interface, projeto de componentes, projeto da estrutura de dados, e projeto de algoritmos. O projeto geralmente documentado como um conjunto de modelos grficos, sendo que os possveis modelos a serem usados so: modelo de fluxo de dados, modelo Entidade-Relacionamento-Atributo, modelo estrutural, e modelos de objetos.

Programao e depurao
A etapa de programao e depurao consiste em transformar um projeto em um programa e remover erros desse programa. Nota-se que a programao uma atividade pessoal e no h 55
www.metodista.br/ead

um processo genrico de programao. Ainda nessa etapa, os programadores realizam alguns testes para descobrir e remover falhas no programa pelo processo de depurao (debugging).

Validao de Software
A verificao e a validao tm o objetivo de mostrar que um sistema est de acordo com sua especificao e cumpre os requisitos do cliente do sistema. Envolvem os processos de verificao, reviso e de testes de sistema. Os testes do sistema envolvem a execuo do sistema de acordo com os casos de teste, que so derivados a partir da especificao dos dados reais a serem processados pelo sistema. A fase de testes do sistema pode ser dividida nas seguintes etapas: teste unitrio (teste de componentes individuais), testes modulares (teste de conjuntos de componentes relacionados e dependentes), testes de subsistema (testes dos mdulos integrados em subsistemas cujo foco deve ser o teste de interfaces), teste do sistema (teste do sistema como um todo e anlise das propriedades emergentes), teste de aceitao (testes com dados do cliente para verificar se o sistema pode ser aceito).

EvoLuo do SoFTWaRE
O produto software flexvel e pode mudar. Como os requisitos mudam com as circunstncias de mudana do negcio, o software que suporta o negcio tambm deve evoluir e mudar.

ENGENhaRia dE PRocEsso dE NEGcio


A engenharia de processo de negcio utiliza um conjunto integrado de procedimentos, mtodos e ferramentas para identificar como os sistemas de informao podem alcanar as metas estratgicas de uma empresa. Ela foca primeiro na empresa e depois na rea de negcio. Para atender s metas da empresa criam-se modelos de empresa, modelos de dados e modelos de processos. Um framework para administrar, distribuir e controlar melhor a informao tambm criado. Trs arquiteturas diferentes devem ser analisadas e desenhadas no contexto dos objetivos e metas do negcio. So elas:

Arquitetura de dados
A arquitetura de dados necessria para fornecer a estrutura para as necessidades da informao de um negcio ou parte dele. Define os objetos de dados usados pelo negcio, ou seja, o conjunto de informaes manipuladas pelo negcio e suas caractersticas.

Arquitetura de aplicaes
A arquitetura de aplicaes abrange os elementos de um sistema que transformam objetos da arquitetura de dados para alguma finalidade do negcio, ou seja, so os programas aplicativos que suportam o processo de negcio ou parte dele.

INFRaEsTRuTuRa TEcNoLGica
A infraestrutura tecnolgica fornece a base para a arquitetura de dados e arquitetura de aplicaes, trata da definio dos equipamentos de computao e comunicao, softwares bsicos e gerenciadores, etc..

56
Universidade Metodista de So Paulo

ENGENhaRia dE REQuisiTos Definio


Segundo o dicionrio Aurlio, engenharia significa cincia, tcnica e arte da construo de obras de grande porte, mediante a aplicao de princpios matemticos e das cincias fsicas. Tambm segundo o dicionrio Aurlio, requisito significa condio que se deve satisfazer para alcanar certo fim. Pela juno das duas definies pode-se definir a engenharia de requisitos como a cincia, tcnica ou arte de obter as condies que se deve satisfazer para alcanar certo objetivo. Ainda, segundo Pressman (2006), a definio de engenharia de requisitos pode ser dada como o conjunto de tarefas que levam a um entendimento de qual ser o impacto do software sobre o negcio, do que o cliente quer e de como os usurios finais vo interagir com o software. A engenharia de requisitos, por ser um conjunto de tarefas, pode ser enquadrada como um processo e, por isso, pode ser aplicada a vrios tipos de produtos (sistemas). Ela auxilia a engenharia de software a compreender melhor o problema, de modo que as atividades da engenharia de requisitos tm como objetivo a definio das necessidades dos envolvidos. Ela define uma base para as etapas seguintes, projeto e construo, do desenvolvimento do software. O conjunto de tarefas da engenharia de requisitos requer a participao de vrios tipos de envolvidos, entre eles, o prprio engenheiro de requisitos, representantes do cliente e os usurios finais. O engenheiro de requisitos dependendo da organizao, pode receber outros nomes como, por exemplo, analista de negcio.

ETapas da ENGENhaRia dE REQuisiTos


O processo da engenharia de requisitos pode ser dividido em etapas de acordo com a sua caracterstica principal. So elas: concepo, levantamento, elaborao, negociao, especificao e validao. Todas essas etapas podem ser conduzidas por um processo de gesto que envolve as etapas de planejamento, execuo e controle.

CoNcEpo ou INcio do PRocEsso


Na etapa de concepo, o engenheiro de requisitos deve fazer um conjunto de perguntas aos envolvidos (inicialmente) que estabeleam a compreenso bsica do problema, as pessoas que querem uma soluo (clientes e/ou usurios), a natureza da soluo (tipo e ambiente), e a efetividade da comunicao e colaborao preliminares entre o cliente e o desenvolvedor (quem e qual ser a disponibilidade).

LEvaNTamENTo
O levantamento de requisitos, ou coleta de requisitos, tem como objetivo extrair os requisitos de todos os participantes. Deve tentar coletar informaes sobre os objetivos do sistema ou produto, o que precisa ser alcanado, como o sistema se encaixa no negcio, que processos do negcio ele suporta, e como e por quem ele ser utilizado na rotina da organizao.

ELaBoRao
Na etapa de elaborao, o engenheiro de requisitos deve expandir e refinar as informaes das etapas anteriores com o objetivo de criar um modelo de anlise, que um modelo tcnico, que identifique os requisitos de dados, os requisitos funcionais e os requisitos comportamentais. Os modelos criados podem ser representados por diagramas e descries textuais de cenrios, interaes dos usurios e processos. 57
www.metodista.br/ead

NEGociao
A negociao define um acordo sobre o escopo do sistema de modo que seja realstico para o desenvolvedor e para o cliente. O escopo do sistema define com preciso o que deve ser feito, baseado nas funes do sistema, caractersticas e restries do software. Frequentemente so colocados em discusso riscos e conflitos de requisitos para que aps a negociao seja estabelecido um conjunto de requisitos reconhecido de comum acordo.

EspEciFicao
Nesta etapa, o engenheiro de requisitos fornece o produto de trabalho que ser utilizado nas outras etapas do desenvolvimento do sistema. O produto de trabalho pode ser qualquer um ou mais de um dos seguintes itens: documentao escrita, conjunto de modelos (diagramas), modelo matemtico formal, coleo de cenrios e casos de uso (use-cases), e, tambm, prottipos.

VaLidao
A validao um mecanismo de reviso e avaliao que procura por erros no contedo dos produtos de trabalho ou na interpretao dos requisitos que podem levar a falhas e erros no software a ser construdo. Ela procura, tambm, reas em que um esclarecimento pode ser necessrio devido a falta de detalhe ou modelos inconsistentes ou vagos, devido informao faltante. As inconsistncias so frequentes e representam um grande problema em produtos grandes. Em alguns casos, podem ocorrer requisitos conflitantes ou no realsticos (inatingveis), que devem ser resolvidos em uma nova etapa de negociao.

GEsTo dE REQuisiTos
A gesto de requisitos necessria devido caracterstica mutante dos requisitos, ou seja, os requisitos mudam ao longo do desenvolvimento do sistema e mesmo aps a implantao do sistema. Esse processo envolve a identificao dos requisitos (identificador ou cdigo de identificao nico), a criao de tabelas de rastreamento (para relacionar os requisitos s suas caractersticas, fontes, dependncias, subsistemas, interfaces, etc.), e o controle dessas informaes. Desenvolvimento do Processo de Engenharia de Requisitos

Incio
A etapa de concepo requer a identificao dos interessados, que pode ser qualquer pessoa, grupo ou departamento que pode se beneficiar direta ou indiretamente do software que ser desenvolvido. O engenheiro de requisitos deve criar uma lista inicial de pessoas que sero perguntadas sobre as suas necessidades e tambm apontaro outras pessoas a serem perguntadas. Quanto mais interessados forem apontados mais pontos de vista diferentes sero estabelecidos e o engenheiro de requisitos deve realizar o reconhecimento de diversos pontos de vista desses envolvidos, uma vez que cada um dos envolvidos pode ter a sua viso do sistema. Para que sejam evitados problemas e falta de informao, os envolvidos devem estabelecer o trabalho em busca da colaborao, no qual a colaborao no significa que os requisitos devem ser tratados em uma comisso, mas que os envolvidos devem participar do processo. Os envolvidos sero questionados sobre as suas necessidades e seus objetivos em relao ao projeto e as questes iniciais devero ser criadas. Essas perguntas podem ser do tipo: Quem solicitou este trabalho? 58
Universidade Metodista de So Paulo

Quem vai usar a soluo? Qual ser o benefcio econmico dessa soluo (ganho)?

Levantamento de Requisitos
A coleta colaborativa de requisitos a etapa inicial do levantamento de requisitos em que uma equipe de desenvolvedores e interessados trabalha para compreender o problema, propor uma soluo para o problema, negociar e especificar um conjunto inicial (preliminar) de requisitos para a soluo. As seguintes diretrizes bsicas devem ser utilizadas para a coleta colaborativa de requisitos: As reunies definidas para a coleta de requisitos devem ser conduzidas e assistidas por engenheiros de software e por clientes; As regras para preparao e participao devem ser estabelecidas; Uma agenda para as reunies deve ser sugerida; Deve ser escolhido um facilitador, que pode ser um cliente, um desenvolvedor ou at mesmo uma pessoa de fora, para controlar a reunio; Deve ser utilizado um mecanismo de definio, podem ser usadas folhas de rascunho, flip charts ou papel autoadesivo, ou ainda um quadro de avisos eletrnico, salas de conversa ou frum virtual.

Processo de Levantamento de Requisitos


O processo de levantamento de requisitos pode ser detalhado em funo das diretrizes bsicas da seguinte forma: primeiramente so conduzidas reunies rpidas, em seguida so criadas listas de funes (ou classes), depois disso so criadas listas de restries e definidas as prioridades dos requisitos, de modo formal ou informal, e, finalmente, so criados os casos de uso para esse conjunto preliminar de requisitos definido e priorizado. A Figura 7 mostra graficamente o processo detalhado.

Figura 7 - Processo de Levantamento de Requisitos Fonte: adaptado de Pressman (2006)

59
www.metodista.br/ead

Implantao da Funo de Qualidade


Para definir a prioridade dos requisitos pode ser utilizada a Implantao da Funo de Qualidade (IFQ) (Quality Function Deployment - QFD) para traduzir as necessidades do cliente para os requisitos de software. Essa tcnica permite que seja determinado o valor de cada funo necessria ao sistema de acordo com a percepo do cliente. A IFQ possibilita a identificao de trs tipos de requisitos, os requisitos normais, os requisitos esperados e os requisitos excitantes. Os requisitos normais so aqueles que surgem das reunies e, se eles estiverem presentes, o cliente ficar satisfeito. Os requisitos esperados so aqueles implcitos e podem ser to bsicos que no so designados explicitamente e a falta deles pode causar insatisfao no cliente. Os requisitos excitantes so aqueles que vo alm da expectativa do cliente e podem causar grande satisfao no cliente quando esto presentes. A IFQ permite identificar tanto objetos de dados como eventos e tambm as tarefas para examinar o comportamento do sistema Atravs da anlise de valor possvel determinar a prioridade relativa dos requisitos em relao ao cliente.

Produtos de Trabalho
O resultado da atividade de levantamento de requisitos um conjunto de documentos. Abaixo so identificados alguns desses produtos de trabalho: Declarao da necessidade e da viabilidade. Definio do escopo do sistema ou produto. Lista de clientes, usurios e outros interessados que participaram do levantamento de requisitos. Descrio do ambiente tcnico do sistema. Lista de requisitos e as suas respectivas restries de domnio. Conjunto de cenrios de uso que fornecem informaes sobre o uso do sistema e/ou produto sob condies de uso diferentes. Prottipos desenvolvidos para definir melhor os requisitos.

ELaBoRao
A elaborao consiste em realizar o desenvolvimento de casos de uso, que, por sua vez, so uma coleo de cenrios de usurio que descreve a sequncia de uso do sistema. Cada cenrio de usurio deve ser descrito do ponto de vista de um ator e cada cenrio deve responder s seguintes perguntas: Quem (so) o(s) ator(es) principal(is) e secundrio(s)? Quais so as metas dos atores? Que pr-condies devem existir antes da histria comear? Quais tarefas ou funes principais so executadas pelo ator? Que excees deveriam ser consideradas quando a histria descrita? Que variaes na interao dos atores so possveis? 60
Universidade Metodista de So Paulo

Que informaes do sistema o ator vai adquirir, produzir ou modificar? O ator ter de informar o sistema sobre alteraes no ambiente externo? Que informaes do sistema o ator deseja? O ator deseja ser informado sobre modificaes inesperadas?

DiaGRama dE Caso dE Uso


De acordo com a linguagem de modelagem unificada, ou em ingls Unified Modeling Language (UML), os cenrios de usurio podem ser descritos por diagramas chamados de diagramas de casos de uso que tm por objetivo descrever a funcionalidade fornecida por um sistema em termos de atores, seus objetivos representados como casos de uso, e quaisquer dependncias entre os casos de uso. A Figura 8 mostra um exemplo de diagrama de caso de uso de um sistema de alarme em que os atores so representados pelo dono da casa, pelo administrador e pelos sensores, e as funcionalidades representadas pelas interaes so associadas aos atores.

Figura 8 - Diagrama de caso de uso de um sistema de alarme Fonte: adaptado de Pressman (2006)

CoNsTRuo do ModELo dE ANLisE


Um modelo de anlise pode ser construdo buscando-se uma melhor compreenso do problema e das necessidades dos clientes e usurios. Os elementos que compem o modelo de anlise podem ser divididos em quatro categorias: elementos baseados em cenrio (funcional, casos de uso), elementos baseados em classes (diagramas de classe, Figura 9), elementos comportamentais (diagramas de estado) e elementos orientados a fluxo (diagrama de fluxo de dados).

61
www.metodista.br/ead

Figura 9 - Exemplo de uma classe de um sistema de alarme Fonte: adaptado de Pressman (2006)

NEGociao
A etapa de negociao abrange um conjunto de tarefas, comeando com a identificao dos interessados-chave, ou seja, aqueles que sero envolvidos na negociao. A segunda etapa consiste em determinar as condies de ganho dos interessados, que nem sempre so bvias. Em seguida, deve-se partir para a negociao propriamente dita e, para finalizar o processo, deve-se trabalhar em um conjunto de requisitos que levem ao resultado ganha-ganha, ou seja, quando as partes envolvidas ganham algo.

VaLidao
Na etapa de validao deve-se questionar se: Cada requisito est consistente com o objetivo global do sistema ou produto, Todos os requisitos foram especificados no nvel de abstrao adequado, O requisito realmente necessrio ou representa uma caracterstica adicional que pode no ser essencial ao objetivo do sistema, Cada requisito limitado e no ambguo, Cada requisito tem atribuio, Uma fonte est associada a cada requisito, Algum requisito conflita com outros requisitos, etc. Outras questes mais focadas no processo podem ser definidas como, por exemplo: 62
Universidade Metodista de So Paulo

Cada requisito realizvel no ambiente tcnico que alojar o sistema ou produto?; Cada requisito pode ser testado quando estiver implementado?; O modelo de requisitos reflete adequadamente a informao, a funo e o comportamento do sistema a ser construdo?; O modelo de requisitos foi particionado de modo a expor cada vez mais informaes detalhadas do sistema?; Os padres de requisitos foram usados para simplificar o modelo de requisitos?; Todos os padres foram validados apropriadamente?; Todos os padres so consistentes com os requisitos do cliente?

Referncias PRESSMAN, Roger S. Engenharia de software. So Paulo: Makron Books, 2006. SOMMERVILLE, Ian. Engenharia de software. 9. ed. So Paulo: Pearson Prentice Hall, 2011. LARMAN, Craig. Utilizando UML e padres. 2. ed. Porto Alegre: Bookman, 2004. BOOCH, Grady. UML: guia do usurio 2. ed. Rio de Janeiro: Campus, 2006.

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________
63
www.metodista.br/ead

_________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________
64
Universidade Metodista de So Paulo

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________

Modelagem e Documentao de sistemas

Engenharia de Requisitos Parte 2


Prof. Me. Andr Luiz Perin

Mdulo

Apresentar os vrios tipos de requisitos e esclarecer as diferenas entre eles. Apresentar o processo de engenharia de requisitos.

Objetivos:

Engenharia de software; Engenharia de requisitos.

Palavras-chave:

www.metodista.br/ead

INTRoduo
Como j foi visto antes, a engenharia de requisitos pode ser definida como a cincia, tcnica ou arte de obter as condies que se deve satisfazer para alcanar certo objetivo. possvel, tambm, definir engenharia de requisitos como o processo de estabelecer os servios que o cliente necessita de um sistema e as restries sob as quais o sistema ir operar e ser desenvolvido. Nesse caso, os prprios requisitos so as descries dos servios do sistema e as restries que so geradas durante o processo de engenharia de requisitos.

Requisitos de Software
Os requisitos de um sistema podem ser entendidos como a descrio e a especificao de um sistema, contudo, essa descrio pode variar de uma declarao abstrata de alto nvel de um servio at uma restrio do sistema para uma especificao matemtica funcional. Pode ser a base para uma proposta de um contrato e, neste caso, est aberto interpretao e detalhamento. Por outro lado, pode ser o prprio contrato e deve ser definido em detalhe, normalmente aps a especificao. Apesar das diferenas no nvel de detalhamento, ambas as declaraes podem ser chamadas de requisitos. Segundo Davis (1993), Se uma empresa quer estabelecer um contrato para o desenvolvimento de um grande projeto de software, ela precisa definir as suas necessidades de maneira suficientemente abstrata, para que uma soluo no seja pr-definida. Os requisitos devem ser redigidos de modo que os diversos fornecedores possam apresentar propostas, oferecendo, talvez, diferentes maneiras de atender s necessidades organizacionais do cliente. Aps a aprovao do contrato, o fornecedor deve redigir uma definio mais detalhada do sistema para o cliente, de modo que o cliente possa compreender e validar o que o software far. Esses dois documentos podem ser chamados de documentos de requisitos do sistema.

Tipos de requisitos
Os requisitos com diferentes nveis de detalhamento podem se misturar no processo de desenvolvimento de software se no forem devidamente separados. Dessa forma, pode-se definir, basicamente, dois tipos, os requisitos de usurio e os requisitos de sistema. Cada tipo de requisito adequado a alguns tipos de leitores especficos entre os envolvidos no desenvolvimento de software. A Tabela 1 mostra a relao dos tipos de requisitos e seus respectivos leitores. Tabela 1 - Leitores dos requisitos
Tipo de requisitos Requisitos de Usurios Tipos de leitores Gestores do cliente Usurios finais do sistema Engenheiros do cliente Gerentes do contrato Arquitetos do sistema Usurios finais do sistema Engenheiros do cliente Arquitetos do sistema Desenvolvedores de software Engenheiros do cliente (talvez) Arquitetos do sistema Desenvolvedores de software

Requisitos de Sistema

Especificao de Projeto de Software

Fonte: Sommerville (2011)

66
Universidade Metodista de So Paulo

Requisitos de Usurio
So declaraes em linguagem natural, ou seja, escritas no idioma dos envolvidos, e diagramas dos servios que o sistema fornece e suas restries operacionais. Os requisitos de usurios so escritos para os clientes e no tm a inteno de detalhar itens tcnicos do sistema, devem descrever requisitos funcionais e no funcionais de forma que sejam compreensveis pelos usurios do sistema, que no tm conhecimento tcnico detalhado. Os requisitos do usurio podem ser definidos usando linguagem natural, tabelas e diagramas. Quando escritos em linguagem natural, os requisitos podem trazer alguns problemas como, por exemplo, a falta de clareza, confuso entre os requisitos e a prpria fuso de requisitos. Os problemas com a linguagem natural esto normalmente associados falta de clareza da definio dos requisitos e a preciso na definio pode ser difcil de ser obtida sem tornar o documento de especificao difcil de ler. Em relao aos requisitos confusos, podem ser misturados requisitos funcionais e no funcionais, que torna a validao deles muito mais complicada. A fuso de requisitos ocorre quando vrios requisitos diferentes podem ser expressos em um nico conjunto e tambm torna a validao deles muito mais complicada, pois exige vrios tipos de teste para validar um nico requisito. A fim de evitar os problemas da definio de requisitos em linguagem natural, podem ser adotadas diretrizes para a escrita de requisitos. Algumas destas diretrizes podem ser definidas da seguinte maneira: Inventar um formato padro para todos os requisitos (por exemplo, uma tabela ou ficha); Usar a linguagem de uma forma consistente, utilizar o termo deve, para os requisitos obrigatrios e deveria para os requisitos desejveis; Usar o realce de texto (negrito) para identificar as partes importantes do requisito; Evitar o uso de jarges da informtica.

Requisitos de Sistema
Os requisitos de sistema so colocados em um documento estruturado que estabelece descries detalhadas dos servios do sistema e deve ser bastante preciso. Os requisitos de sistema so muitas vezes chamados de especificao funcional e so escritos como parte do contrato entre cliente e fornecedor. Eles oferecem especificaes mais detalhadas dos requisitos do usurio e, dentro do processo de desenvolvimento de software, servem de base para o projeto do sistema e tambm podem ser usados como parte do contrato do sistema. Os requisitos do sistema podem ser expressos utilizando os diversos modelos de sistema. Entre os mais comuns esto a definio em linguagem natural e os diagramas (atualmente os diagramas da UML Unified Modeling Language, Linguagem de Modelagem Unificada so muito utilizados). Os requisitos de sistema em linguagem natural tambm trazem problemas, assim como os requisitos de usurio. Os mais comuns so descritos a seguir:

Ambiguidade
Os leitores e os redatores dos requisitos devem interpretar as mesmas palavras da mesma maneira. A linguagem natural e naturalmente ambgua, portanto, isso e muito difcil.

67
www.metodista.br/ead

Excesso de Flexibilidade
Neste caso, a mesma coisa pode ser dita de vrias maneiras diferentes na especificao.

Falta de Modularizao
Estruturas de linguagem natural so inadequadas para estruturar requisitos de sistema. Em relao a estes problemas, as alternativas para a especificao em linguagem natural podem ser as seguintes:

Especificaes em Linguagem Estruturada


Apresenta uma forma limitada da linguagem natural e pode ser usada para expressar os requisitos. Ela remove alguns dos problemas resultantes da ambiguidade e flexibilidade e impe um grau de uniformidade a uma especificao. Podem, muitas vezes, serem suportadas usando uma abordagem baseada em formulrios, em que, nestes formulrios podem ser relacionadas algumas informaes como, por exemplo: definio da funo ou entidade, descrio de entradas e de suas origens, descrio das sadas e para onde vo, indicao de outras entidades necessrias, pr-condies e ps-condies (se for o caso), efeitos colaterais (se houverem). Outra possibilidade o uso de uma linguagem de descrio de projetos (PDL - Project Description Language), em que os requisitos podem ser definidos operacionalmente utilizando uma linguagem diferenciada, como uma linguagem de programao, mas com maior flexibilidade de expresso. Pode ser mais apropriada em duas situaes. A primeira, sempre que uma operao e especificada como uma sequncia de aes e a ordem dessas aes e importante e, a segunda, quando devem ser especificadas interfaces de hardware e software. Porm as PDLs tambm apresentam desvantagens, entre elas: a PDL pode no ser suficientemente expressiva para definir a funcionalidade do sistema de forma compreensvel (conceitos de domnio) e a especificao poder ser tomada como um projeto em vez de uma especificao. No caso da especificao de interfaces, a maioria dos sistemas deve operar com outros sistemas e as interfaces de operao devem ser especificadas como parte dos requisitos. Podem ser definidos trs tipos de interface: interfaces de procedimentos, estruturas de dados que so trocados, e representaes de dados (dicionrio de dados). As notaes formais so uma tcnica efetiva para especificao de interfaces.

Especificao de Software
O documento de especificao de software, ou tambm documento de especificao de requisitos, fornece uma descrio detalhada do software que pode servir como uma base para uma concepo ou implementao, alm do prprio contrato. Esse documento escrito, normalmente, para os desenvolvedores.

Requisitos Funcionais, No Funcionais e de Domnio


Os requisitos de sistema de software podem ainda ser classificados em requisitos funcionais, no funcionais, e de domnio, de acordo com o tipo de caracterstica ou funo do sistema definida.

68
Universidade Metodista de So Paulo

Requisitos Funcionais
Os requisitos funcionais so declaraes dos servios que o sistema deve fornecer, de como o sistema deve reagir a entradas especficas e de como o sistema deve se comportar em determinadas situaes. Basicamente, os requisitos funcionais definem as aes do sistema, ou seja, descrevem as funcionalidades ou servios do sistema. Os requisitos funcionais podem ser validados pela constatao ou no da funcionalidade realizada. Dependem do tipo de software a ser desenvolvido, pois tipos diferentes de software possuem funes diferentes, dependem tambm dos usurios previstos, porque diferentes usurios necessitam de funes especficas e, finalmente, dependem do tipo do sistema em que o software utilizado. Os requisitos funcionais dos usurios podem ser declaraes de alto nvel do que o sistema deve fazer, porm os requisitos funcionais do sistema devem descrever os servios do sistema em detalhes. Exemplos: O usurio deve ser capaz de pesquisar em todo o conjunto inicial de bases de dados ou selecionar um subconjunto a partir dele. O sistema fornecer telas apropriadas para o usurio ler documentos no repositrio de documentos. Cada pedido deve ser alocado a um identificador nico no qual o usurio ser capaz de copiar para a rea de armazenamento permanente da conta.

Requisitos No Funcionais
Os requisitos no funcionais so mais bem definidos como restries sobre os servios ou funes oferecidos pelo sistema. Podem definir caractersticas ou atributos do sistema. Por exemplo, restries de tempo ou restries no processo de desenvolvimento, padres, etc. Os requisitos no funcionais podem, muitas vezes, ser validados pelo atendimento mtricas definidas como, por exemplo, tempo dado em segundos. A Tabela 2 mostra alguns exemplos de propriedades e restries. Tabela 2 - Exemplos de propriedades e restries
Propriedades Confiabilidade Tempo de resposta Requisitos de armazenamento
Fonte: Sommerville (2011)

Restries Capacidade do dispositivo de E/S Ambientes do sistema

Os requisitos de processo tambm podem ser especificados atravs de uma ferramenta CASE (Computer-Aided Software Engineering - Engenharia de Software Auxiliada por Computador), por uma linguagem de programao ou por um mtodo de desenvolvimento especfico. Os requisitos no funcionais podem ser mais crticos do que os requisitos funcionais porque se no forem atendidos, o sistema intil. Alm disso, os usurios ou clientes frequentemente definem os requisitos no funcionais de maneira abstrata, vaga ou at mesmo subjetiva. Para que seja possvel verific-los adequadamente, necessrio que eles sejam representados de forma objetiva e, sempre que possvel, verificvel por teste ou quantitativamente. 69
www.metodista.br/ead

Para verificar um requisito no funcional quantitativamente so utilizadas mtricas, ou seja, medidas de caractersticas que podem ser tomadas de forma direta ou indireta. A Tabela 3 relaciona alguns exemplos de mtricas de requisitos no funcionais que podem ser utilizadas na especificao de um sistema. Tabela 3 - Mtricas de requisitos no funcionais

Propriedade Velocidade

Mtrica Transaes processadas/segundo Tempo de resposta do evento de usurio Tempos de carga da tela K Bytes Nmero de chips de RAM Tempo de treinamento Nmero de quadros de ajuda Tempo mdio de falha Probabilidade de indisponibilidade Taxa de ocorrncia de falhas Disponibilidade Tempo de reincio aps a falha

Tamanho Facilidade de Uso

Confiabilidade

Robustez

Porcentagem de eventos que causam falha Probabilidade de corrupo de dados na falha Percentual de declaraes dependentes do destino Nmero de sistemas de destino

Portabilidade
Fonte: Sommerville (2011)

Classificao dos Requisitos No Funcionais


Devido grande quantidade de requisitos no funcionais interessante organiz-los de acordo com a sua origem. Nesse caso, existem basicamente trs tipos: requisitos de produto, requisitos organizacionais, e exigncias externas. Os requisitos de produto especificam quais caractersticas o produto que ser entregue dever ter, por exemplo, velocidade de execuo, confiabilidade, etc. Os requisitos organizacionais so consequncia de polticas e procedimentos organizacionais, ou seja, dependem da organizao do cliente. So exemplos de requisitos organizacionais: padres de processo usados, requisitos de implementao, etc. As exigncias externas so os requisitos que surgem de fatores que so externos ao sistema e ao seu processo de desenvolvimento. Por exemplo, requisitos de interoperabilidade, requisitos legais, etc. possvel ainda classificar cada um destes tipos em outras categorias, conforme mostra a Figura 1.
Figura 1 - Classificao dos requisitos no funcionais

70
Universidade Metodista de So Paulo

Fonte: adaptado de Sommerville (2011)

Requisitos de Domnio
Os requisitos de domnio podem ser classificados como funcionais ou no funcionais. So os requisitos que vm do domnio de aplicao do sistema e que refletem as caractersticas desse domnio. Muitas vezes, os requisitos de domnio so muito especficos e precisam de grande conhecimento da rea de negcio para serem elaborados. Podem ser novos requisitos funcionais, restries sobre os requisitos existentes ou podem definir clculos especficos. Se os requisitos de domnio no forem satisfeitos, o sistema pode no funcionar. Os requisitos de domnio apresentam alguns problemas comuns em vrios tipos de projetos, por exemplo, a compreensibilidade (que representa a aptido para ser compreendido) e a implicitude (define algo que est envolvido, mas no expresso claramente). No caso da compreensibilidade, os requisitos so expressos na linguagem do domnio da aplicao e muitas vezes no so entendidos pelos engenheiros de software que desenvolvem o sistema. Em relao implicitude, os especialistas do domnio compreendem a rea de negcio to bem que eles no pensam em tornar explcitos os requisitos de domnio e os engenheiros de software desconhecem a existncia deles.

Problemas da Definio de Requisitos


Alguns problemas comuns da definio dos requisitos so devidos impreciso, abrangncia e consistncia dos requisitos. Alm disso, os requisitos podem interferir uns nos outros.

Impreciso dos Requisitos


Quando os requisitos no so definidos com preciso podem dar origem a requisitos ambguos que, por sua vez, podem ser interpretados de maneiras diferentes pelos desenvolvedores e pelos usurios. 71
www.metodista.br/ead

Para evitar estes problemas, o analista deve redigir os requisitos com o mximo de clareza e preciso possvel dentro de um entendimento comum com os usurios.

Abrangncia e Consistncia dos Requisitos


Em princpio, os requisitos devem ser completos e consistentes. Como completo, entende-se que eles devem incluir descries de todos os recursos ou funes necessrios. Consistente, refere-se a no existncia de conflitos ou contradies nas descries dos recursos e funcionalidades do sistema. Na prtica, verificou-se que impossvel produzir um documento de requisitos totalmente completo e consistente (SOMMERVILLE, 2011).

Interao dos Requisitos


Alguns conflitos entre diferentes requisitos no funcionais so comuns em sistemas grandes ou complexos. Por exemplo, um requisito aponta para uma determinada soluo e outro aponta para uma soluo oposta.

O Documento de Requisitos
O documento de requisitos e a declarao oficial do que e exigido dos desenvolvedores de sistemas e deve incluir tanto uma definio como uma especificao dos requisitos. Os envolvidos devem ter em mente que o documento de requisitos no e um documento de projeto. Na medida do possvel, ele deve definir o que o sistema deve fazer ao invs de definir como deve constru-lo. Os usurios de um documento de requisitos podem ser identificados entre os envolvidos do lado do cliente e, tambm, principalmente, do lado do desenvolvedor. A Tabela 4 mostra a relao dos usurios e seu uso por estes usurios. Tabela 4 - Relao de usurios do documento de requisitos e seus respectivos usos
Usurio Clientes do Sistema Uso Especificar os requisitos e l-los para verificar se eles cumprem suas necessidades. Especificar mudanas nos requisitos. Gerentes Engenheiros de Sistemas Usar o documento de requisitos para planejar uma proposta para o sistema e planejar o processo de desenvolvimento do sistema. Usar os requisitos para entender qual sistema ser desenvolvido.

Engenheiros de Teste do SisUsar os requisitos para desenvolver testes de validao para o sistema. tema Engenheiros de Manuteno Usar os requisitos para ajudar a entender o sistema e as relaes entre do Sistema suas partes
Fonte: adaptado de Sommerville (2011)

Para ser eficiente, o documento de requisitos deve atender a algumas exigncias, entre elas: especificar o comportamento de sistemas externos, especificar as restries de implementao, ser fcil de ser alterado, servir como instrumento de referncia para manuteno, prever mudanas no sistema, e caracterizar as respostas a eventos inesperados. 72
Universidade Metodista de So Paulo

De modo geral, um documento de especificao de requisitos possui uma estrutura bsica composta de alguns captulos, por exemplo: Introduo, Glossrio, Definio de requisitos de usurio, Arquitetura do sistema, Especificao de requisitos de sistema, Modelos de sistema, Evoluo do sistema, Apndices e ndice.

Processo de Engenharia de Requisitos


So chamados de processo de engenharia de requisitos os processos utilizados para descobrir, analisar e validar os requisitos de sistema e variam bastante em funo do domnio da aplicao, das pessoas envolvidas e, principalmente, da organizao que desenvolve os requisitos. Porm, existem atividades gerais comuns a todos os processos (Figura 2), so elas: extrao de requisitos, anlise de requisitos, validao de requisitos e gerenciamento de requisitos.

Figura 2 - Processo de engenharia de requisitos Fonte: adaptado de Sommerville (2011)

Em alguns casos interessante realizar estudos de viabilidade, que servem para definir se o sistema proposto vivel ou no. Ele um breve estudo que verifica se o sistema contribui para os objetivos organizacionais, se o sistema pode ser desenvolvido atravs da tecnologia atual e dentro do oramento, e se o sistema pode ser integrado a outros sistemas utilizados na organizao. A extrao e anlise de requisitos envolve o pessoal tcnico (desenvolvedores ou engenheiros de software) trabalhando com os clientes para saber mais sobre o domnio da aplicao, os servios que o sistema deve fornecer e as restries operacionais do sistema. Pode, tambm, envolver os usurios finais, gerentes, engenheiros de manuteno do sistema, especialistas no domnio, etc. Todas essas pessoas so chamadas de interessados ou, em ingls, stakeholders. Alguns problemas comuns da anlise de requisitos referentes aos interessados so: eles no saberem o eles realmente querem, eles expressarem os requisitos nos seus prprios termos, interessados diferentes podem ter requisitos conflitantes. Outros problemas podem ser referentes a fatores polticos e organizacionais que podem influenciar os requisitos de sistema. Por fim, os requisitos mudam durante o processo de anlise, por isso, novos interessados podem surgir e o ambiente do negcio pode mudar. O processo de anlise de requisitos, mostrado na Figura 3, envolve algumas atividades tcnicas. So elas: entendimento do domnio, coleta de requisitos, classificao dos requisitos, resoluo de conflitos, atribuio de prioridades, e verificao dos requisitos. 73
www.metodista.br/ead

Figura 3 - Processo de anlise de requisitos Fonte: adaptado de Sommerville (2011)

Durante a atividade de anlise de requisitos alguns modelos diferentes podem ser produzidos. Entende-se, neste caso, modelo como uma representao do sistema, que pode ser dada em formas diferentes. A anlise de requisitos pode envolver trs atividades estruturais que resultam nestes modelos, o particionamento, a abstrao, e a projeo. O particionamento tem a funo de identificar as relaes estruturais entre as entidades, ou seja, identificar qual entidade parte de qual outra entidade. A abstrao possui a funo de identificar as generalidades entre as entidades, ou seja, identificar itens comuns entre elas. A projeo, por sua vez, deve identificar formas diferentes de olhar o problema.

Validao de Requisitos
A validao de requisitos a atividade que se preocupa em demonstrar que os requisitos definem o sistema que o cliente realmente quer. Isso devido aos custos dos erros de requisitos, que so altos. Segundo Sommerville (2011), corrigir um erro de requisitos aps a entrega do sistema pode chegar a custar at cem vezes o custo de consertar um erro de implementao. Algumas atividades bsicas podem fazer parte do processo de validao de requisitos, entre elas, a verificao de requisitos, que a leitura e anlise crtica dos requisitos com o objetivo de definir a validade, a consistncia, a integralidade, o realismo e a verificabilidade dos requisitos identificados. Entende-se validade dos requisitos a capacidade destes requisitos do sistema fornecerem as funes mais adequadas s necessidades do cliente. Em relao consistncia, a anlise procura conflitos entre os requisitos. A integralidade referente ao atendimento de todas as funes exigidas pelo cliente. No caso do realismo, verifica-se se os requisitos podem ser implementados com o oramento e a tecnologia disponvel. 74
Universidade Metodista de So Paulo

Por fim, a verificabilidade descreve a qualidade dos requisitos serem verificveis, ou seja, se podem ver verificados, qualificados ou quantificados, se podem ser dadas medidas. Para validar os requisitos podem ser adotadas algumas tcnicas distintas, entre elas: revises tcnicas, prototipagem, gerao de casos de teste e a anlise de consistncia automatizada. As revises de requisitos so feitas pela anlise manual sistemtica dos requisitos, que podem ser revises regulares e devem ser feitas enquanto a definio de requisitos est sendo formulada. Neste caso, tanto o cliente quanto os desenvolvedores devem ser envolvidos nas revises. Os comentrios gerados pelas revises podem ser formais, com documentos completos, ou informais. Uma boa comunicao entre desenvolvedores, clientes e usurios pode resolver vrios problemas numa fase inicial. A tcnica de prototipagem prev a utilizao de um modelo executvel do sistema para verificar os requisitos. Esse modelo no deve ser o sistema completo, mas uma parte relevante do sistema, que reflete os requisitos mais importantes ou crticos. A gerao de casos de teste parte do desenvolvimento de testes dos requisitos com o objetivo de verificar a sua testabilidade, isto , a sua qualidade de ser testado. Na anlise de consistncia automatizada so feitas verificaes da consistncia de uma descrio de requisitos estruturada.

Gerenciamento de Requisitos
O gerenciamento de requisitos o processo de gesto de mudanas de requisitos durante o processo de engenharia de requisitos e desenvolvimento de sistemas. As mudanas nos requisitos ocorrem porque os requisitos so incompletos e inconsistentes por sua prpria natureza. Assim, novos requisitos surgem durante o processo, bem como a necessidade do negcio muda e, como consequncia, uma melhor compreenso do sistema deve ser desenvolvida. Existem tambm vrios pontos de vista diferentes, vindos de envolvidos diferentes, que possuem necessidades diferentes e, por isso, estes pontos de vista so muitas vezes contraditrios. Alm disso, a prioridade dos requisitos vindos de diferentes pontos de vista muda durante o processo de desenvolvimento. Por exemplo, os clientes do sistema podem especificar os requisitos de uma perspectiva de negcio que entram em conflito com os requisitos do usurio final e os ambientes de negcio e tcnico mudam durante o desenvolvimento do sistema, devido aos ajustes naturais do negcio e evoluo tecnolgica, que no so possveis de serem controladas pelos envolvidos.

Evoluo dos Requisitos


Os requisitos tambm podem ser classificados em relao sua evoluo dentro do processo de gerenciamento de requisitos. Podem ser requisitos permanentes ou volteis. Os requisitos permanentes so aqueles que so estveis, derivados da atividade principal da organizao do cliente e podem, tambm, ser derivados dos modelos de domnio. Os requisitos volteis, por outro lado, so requisitos que mudam durante o desenvolvimento ou mudam quando o sistema est em uso. Esses requisitos podem, ainda, sofrer outra classificao, de acordo com a sua origem. Podem ser requisitos mutveis, aqueles que mudam em funo do ambiente do sistema; requisitos emergentes, que surgem com o desenvolvimento da compreenso do sistema; requisitos consequentes, aqueles que resultam da introduo do sistema; e, por fim, os requisitos de compatibilidade, que so os requisitos que dependem de outros sistemas ou processos organizacionais.

75
www.metodista.br/ead

Planejamento da Gesto de Requisitos


Durante o processo de engenharia de requisitos, deve-se planejar como os requisitos sero identificados (identificao dos requisitos), como ser o processo de gesto da mudana, quais sero as polticas de rastreabilidade adotadas e quais ferramentas CASE sero adotadas. A identificao dos requisitos tem como objetivo tornar cada requisito nico e define como os requisitos so identificados individualmente. O processo de gesto da mudana o processo seguido quando h necessidade de uma mudana em um ou mais requisitos e sua anlise As polticas de rastreabilidade devem definir a quantidade de informaes sobre os relacionamentos dos requisitos, que sero mantidas e como sero mantidas. A rastreabilidade deve cuidar dos relacionamentos entre requisitos, suas fontes e o projeto do sistema. A rastreabilidade da fonte liga os requisitos aos stakeholders que propuseram tais requisitos. A rastreabilidade de requisitos estabelece as ligaes entre requisitos dependentes (dependncias). A rastreabilidade de projeto fornece as relaes dos requisitos para o projeto. O apoio de ferramentasCASE importante porque pode fornecer um local adequado para o armazenamento de requisitos, pois eles devemser gerenciadosemum ambiente segurode armazenamento de dados,gerenciado, com controles adequados de acesso e integridade.

Gesto da Mudana
O processo de gesto da mudana um processo de workflow cujos estgios podem ser definidos e o fluxo de informaes entre esses estgios pode ser parcialmente automatizado. Pode incluir o gerenciamento de rastreabilidade e a recuperao automatizada dasligaes entre os requisitos. Este processo deve ser aplicadoa todas as alteraespropostas aosrequisitos e as suas principais etapas, mostradas na Figura 4, so: anlise do problema, discusso dos problemase mudanas de requisitos, anlise da alteraoecusteio, avaliao dos efeitosdas mudanasem outros requisitos e implementao da alterao.

Figura 4 - Processo de gesto de mudanas Fonte: adaptado de Sommerville (2011)

Referncias DAVIS, A. M. Software requirements: objects, functions & states. Englewood Cliffs, New Jersey: Prentice Hall, 1993. BOOCH, Grady. UML: guia do usurio 2. ed. Rio de Janeiro: Campus, 2006. LARMAN, Craig. Utilizando UML e padres. 2. ed. Porto Alegre: Bookman, 2004. PRESSMAN, Roger S. Engenharia de software. So Paulo: Makron Books, 2006. SOMMERVILLE, Ian. Engenharia de software. 9. ed. So Paulo: Pearson Prentice Hall, 2011. 76
Universidade Metodista de So Paulo

Organizao de Dados

Introduo ao Banco de Dados Parte 1

Mdulo

Prof. Esp. Leonardo Mairene Muniz


Apresentar os fundamentos de arquitetura de banco de dados, oferecendo uma anlise sobre as linguagens de definio e manipulao de dados e sobre a modelagem dos dados. Apresenta o projeto de banco de dados relacional, estudando as suas caractersticas e, tambm, apresenta os SGBDs (Sistemas Gerenciadores de Banco de Dados). Aplica a prtica da programao por meio da linguagem SQL (Structured Query Language) para manipulao de Banco de Dados relacional.

Objetivos:

www.metodista.br/ead

Nos dias atuais, para onde quer que olhemos, h pessoas e organizaes utilizando bancos de dados, mesmo sem saber. Eles esto presentes em: comrcio eletrnico, celulares, hotis, supermercados, bibliotecas, receita federal, ou seja, onde h um programa de computador, h grande chance de acesso a algum banco de dados. Quando iniciamos o estudo sobre alguma coisa, sempre interessante conhecer sua origem. Voltando para a dcada de 1960, o armazenamento e acesso aos dados eram realizados de uma forma muito simples, em sua maioria sendo realizados em arquivos texto. Estes arquivos eram, normalmente, formados de campos com um tamanho limitado de caracteres e sua tarefa principal era ler e escrever neles. Mesmo considerada como uma forma simples de se trabalhar, com o tempo reconheceu-se que no era a mais adequada para a execuo de um trabalho. O conceito de banco de dados, como a internet, por exemplo, tambm foi concebido pelo Departamento de Defesa dos Estados Unidos da Amrica. Em 1957 foi criada uma conferncia chamada de CODASYL (Conference on Data System Languages ou, em sua traduo literal, Conferncia sobre as Linguagens de Sistemas de Dados). Esta conferncia tambm foi a precursora da linguagem de programao chamada COBOL, que at hoje muito utilizada principalmente por grandes instituies do meio financeiro. Em 1963, duas divises do Departamento de Defesa dos EUA formaram uma conferncia intitulada de Development and Management of a Computer-Centered Data Base (Desenvolvimento e Gerenciamento de um Banco de Dados para Computadores) e, nesta conferncia, definiram que a palavra DATABASE seria: Um conjunto de arquivos (tabelas), onde um arquivo uma coleo ordenada de registros (linhas), e um registro consiste em uma ou mais chaves e dados. Em 1965, esta mesma diviso resolveu criar um padro e iniciar os conceitos que os bancos de dados deveriam seguir, ento, criaram o primeiro Modelo de Dados em Rede, mas j estudavam a ideia de criar um Modelo de Dados Hierrquico. Logo em seguida, no ano de 1966, iniciou-se a famosa corrida espacial. No mesmo ano alguns membros da IBM, North American Rockwell e Caterpillar Tractor uniram-se para projetar e desenvolver o ICS (Information Control System ou Sistema de Controle de Informaes), e a linguagem chamada DL/I (Data Language/I ou Linguagem de Dados/I). Tudo isto foi feito para auxiliar a NASA no projeto de levar o homem lua. No projeto, o ICS seria o sistema responsvel pelo armazenamento e recuperao dos dados, e a DL/I seria a linguagem de consulta para acessar tais dados. Neste mesmo perodo, a IBM, em paralelo, desenvolveu o seu prprio projeto e concebeu o sistema IMS (Information Management System ou Sistema de Gerenciamento de Informaes). Este sistema foi evoluindo e encontrado em muitas empresas at os dias de hoje. Entrando na dcada de 1970, Edgar Frank Codd, um cientista da computao britnico que trabalhava na IBM, publicou um importante artigo chamado A Relational Model of Data for Large Shared Data Banks (Um Modelo Relacional de Dados para Grandes Bancos de Dados Compartilhados), em que apresentou a sua ideia de Modelo Relacional e a criao de uma linguagem simples de consulta alto nvel, ou seja, de fcil entendimento e assimilao por parte dos usurios, que futuramente iria se chamar SQL (Strucutured Query Language ou Linguagem Estruturada para Consultas). Em 1976, Edgar, junto com outro cientista da computao chamado Peter Chen, desenvolveu e divulgou a toda comunidade cientfica o ento Modelo Entidade-Relacionamento, que uma forma de representao abstrata de dados, em que gerado um Diagrama de Entidade-Relacionamento, que hoje a base para qualquer modelo de banco de dados.

78
Universidade Metodista de So Paulo

Figura 1 Exemplo de um Diagrama Entidade-Relacionamento

Segundo o pesquisador Elmasri (2011), um banco de dados uma coleo de dados relacionados. Com dados, queremos dizer fatos conhecidos que podem ser registrados e possuem significado implcito. Entendendo a frase acima, um dado de maneira isolada no representa algo que seja entendido, mas um conjunto de dados pode representar algo que consigamos entender. Para ser considerado um banco de dados, devem atender as seguintes propriedades: Deve representar algum aspecto do mundo real, tambm chamado por Elmasri (2011) como mini-mundo ou universo de discurso. Ou seja, alteraes que venham a ocorrer neste mini-mundo devem ser refletidas em um banco de dados; Deve ter uma coleo logicamente coerente e este deve satisfazer a algum significado; dados que no sejam estruturados, dificilmente podem ser armazenados em bancos de dados; Um banco de dados deve ser projetado, construdo e populado com dados para atender principalmente um significado especfico. Ou seja, para existir um banco de dados, previamente deve existir um grupo de usurios com alguma demanda e aplicaes previamente concebidas para atender a uma demanda de uma rea ou empresa. Vimos, nos tpicos acima, que um banco de dados precisa de uma fonte pela qual os dados so originados e gerados (um sistema de controle financeiro, por exemplo) em que haver usurios interagindo com programas desenvolvidos, gerando informaes que precisam ser armazenadas em algum repositrio para que possam ser utilizadas futuramente, tudo isto atendendo a um interesse especfico. Um banco de dados pode: Ter qualquer tamanho e complexidade; Ser gerado e mantido manualmente ou atravs de programas de computador. 79
www.metodista.br/ead

Um Sistema Gerenciador de Banco de Dados (SGBD) uma coleo de programas que auxiliam a definio, construo, manipulao e compartilhamento de diversos bancos de dados, facilitando a comunicao entre diversos usurios e aplicaes. Quando falamos em definio, estamos falando em especificar os tipos, estruturas e as restries que os dados tero ao serem armazenados. Em um SGBD estas definies so armazenadas na forma de um catlogo ou dicionrio de dados, tambm conhecido como metadados. A construo a etapa em que os dados so armazenados em algum meio controlado por um SGBD. A manipulao de um banco de dados o processo de consultar, alterar e gerar relatrios com base nos dados dispostos para satisfazer fatos do mini-mundo. O compartilhamento permite que os bancos de dados sejam acessveis simultaneamente por diversos usurios ou programas. Para representar o que foi exposto at este momento, abaixo est um diagrama que contextualiza um ambiente de um sistema de banco de dados.

Figura 2 Diagrama simplificado de um ambiente de sistema de banco de dados Fonte: Elmasri (2011)

ExEmpLo dE um BaNco dE dados


Neste captulo, apresentaremos um exemplo simples e que muitos j devem estar bem acostumados, um banco de dados de uma UNIVERSIDADE para manter informaes de alunos, suas disciplinas cursadas e notas tiradas. Podemos reparar, logo abaixo, um conjunto de 5 (cinco) arquivos, que so chamados de entidades ou, tambm, de tabelas, e podem ver que em cada uma delas so armazenados tuplas ou registros que fazem referncia ao mesmo tipo de informao. Por exemplo, na tabela ALUNO, 80
Universidade Metodista de So Paulo

armazenam-se dados especficos de cada aluno, a tabela DISCIPLINA armazena dados sobre cada disciplina, a tabela TURMA armazena dados sobre cada turma de uma disciplina, a tabela HISTORICO_ESCOLAR armazena dados das notas que os alunos receberam nas diversas turmas que cursaram, e por fim a tabela PRE_REQUISITO armazena dados dos pr-requisitos de cada disciplina.

Figura 3 Exemplo de banco de dados que armazena informaes de uma Universidade Fonte: Elmasri (2011)

Com a implantao de um conjunto de tabelas, possibilita-se obter diversas vises derivadas de um banco de dados relacional. Abaixo, ser apresentada uma destas vises possveis, que est representando os alunos e suas disciplinas cursadas. Para se chegar nesta viso, ser necessrio relacionar 3 (trs) tabelas, iniciando pela tabela ALUNO por meio da coluna Curso_Hab; para ento relacionarcom a tabela DISCIPLINA pela coluna Departamento, em seguida com a tabela DISCIPLINA por meio da coluna NumerodaDisciplina ; com a tabela TURMA por meio da coluna NumerodoCurso, chegando ao seguinte resultado.

81
www.metodista.br/ead

Figura 4 Resultado da viso de ALUNO e DISCIPLINA Fonte: Elmasri (2011)

Os Tipos dE UsuRios dE um BaNco dE Dados


Em um ambiente de Banco de Dados, devemos ter pessoas que faam que ele exista e esteja disponvel para as aplicaes e seus usurios. Podemos dizer que em um projeto de banco de dados, h alguns atores que devem entrar em cena, so eles: Administradores de Banco de Dados (DBA Database Administrator): Em organizaes em que vrias pessoas trabalham, haver a necessidade de selecionar um administrador principal para supervisionar e gerenciar todos os seus recursos. Em nosso caso, o principal recurso o Banco de Dados. O Administrador de Banco de Dados responsvel por autorizar acessos, monitorar seu uso, gerir os recursos de hardware e software conforme haja necessidade, corrigir falhas e aumentar/ melhorar o tempo de resposta de transaes realizadas no banco de dados. Projetista de Banco de Dados: Os projetistas so responsveis por identificar os dados e estrutur-los de uma forma mais adequada para que sejam armazenados. So responsveis por se comunicarem com os usurios finais a fim de entender suas necessidades e projetar um banco de dados que atendam suas expectativas. Usurios Finais: So pessoas comuns que, de alguma forma, devam interagir e terem acesso a bancos de dados. Um banco de dados, de uma forma geral, sempre concebido para atend-los. So classificados em 4 tipos: Usurios Finais Casuais: So usurios ocasionais, que podem precisar esporadicamente de diferentes tipos de informaes; normalmente sabem utilizar linguagens de consultas a bancos de dados para responderem a seus questionamentos. Usurios Finais Iniciantes: So usurios sem experincia em banco de dados, so considerados a maioria nas organizaes; sua funo apenas consultar e atualizar o banco de dados de uma forma automtica, com rotinas j construdas e no sabem utilizar linguagem de consultas a bancos de dados. Usurios Finais Sofisticados: So usurios com nveis mais tcnicos que tm muita familiaridade com sistemas de bancos de dados a ponto de conseguirem implementar suas prprias aplicaes atravs de necessidades mais complexas. Usurios Isolados: So usurios que mantm bancos de dados usando pacotes de programas j prontos, atravs de interfaces de fcil navegao, atravs de menus e grficos. 82
Universidade Metodista de So Paulo

Analistas de Sistemas/Programadores de Aplicaes: So os usurios que identificam todas as reais necessidades dos usurios finais iniciantes e definem quais sero as transaes que atendero a sua demanda. Estes usurios devem ter familiaridade com desenvolvimento de sistemas e, tambm, com manipulao de bancos de dados.

VaNTaGENs da UTiLizao dE um SGBD


Quando utilizamos um banco de dados atravs de SGBD (Sistema Gerenciador de Banco de Dados) devemos saber de suas capacidades e avaliar suas vantagens de utilizao em relao a outras formas de armazenamento, com isto devemos considerar: Controle de Redundncia: Deve ser possvel identificar dados que estejam sendo armazenados da mesma forma diversas vezes, gerando dados repetidos/duplicados devendo permitir a eliminao deste problema. Restringir acessos no autorizados: Em um ambiente em que h vrios usurios conectados, utilizando e compartilhando informaes, um SGBD deve possuir um subsistema de segurana que gerencia estes dados e deve ser capaz de restringir acessos a dados restritos a usurios no autorizados. Oferecer armazenamento persistente para objetos do programa: Um SGBD Orientado a Objetos deve ser capaz de converter estruturas de dados de diversos programas criados em qualquer linguagem de programao, permitindo assim sua reutilizao. Oferecer estruturas de armazenamento e tcnicas de pesquisa para um processamento eficiente de consultas: Como um banco de dados tem seus dados fisicamente armazenados em disco rgido, o SGBD deve possuir tcnicas de pesquisa que sejam especializadas em buscar registros de uma forma mais rpida possvel por meio de arquivos auxiliares, chamados de ndices. Oferecer back-up e recuperao: Um SGBD deve prover recursos de recuperar-se de falhas de qualquer tipo. Deve possuir um subsistema de cpia de segurana de dados e de suas estruturas e tornar possvel a recuperao delas a qualquer momento. Oferecer mltiplas interfaces ao usurio: Como vimos acima, temos diversos tipos e nveis de usurios que devem acessar um banco de dados. O SGBD deve prover diversas aplicaes conhecidas como Interfaces Grficas de Usurios (GUI Graphical User Interfaces) que nada mais so do que telas e formulrios que interagem de forma visual com os dados. Representar relacionamentos complexos entre dados: Um SGBD deve ser capaz de representar uma srie de relacionamentos complexos com seus dados, definindo novos relacionamentos medida que eles surgem e deve ser capaz de recuper-los e atualiz-los de uma maneira fcil e eficaz. Impor restries de integridade: Um SGBD deve oferecer uma forma de definir e impor restries, definindo quais sero os tipos dos dados que devem ser armazenados. Por exemplo, um dado de Nome deve ser um tipo alfanumrico de at no mximo 30 caracteres. Permitir deduo e aes usando regras: Um SGBD deve possuir uma forma de armazenar rotinas que so Programas de Procedimento Explcito, que apliquem regras sobre os dados armazenados. Por exemplo, em certo perodo do ano, uma Universidade deve determinar quais alunos devem fazer recuperao ou aqueles que j estejam reprovados. Estes programas devem ser capazes de observar os dados existentes (notas) e atravs de regras definidas, atualizarem a situao de cada aluno em cada matria que estejam estudando. 83
www.metodista.br/ead

Implicaes adicionais do uso da abordagem de banco de dados: Os SGBDs devem, tambm, seguir alguns itens adicionais para beneficiar seus utilizadores, como por exemplo: o Garantir Padres: Definir padres para nomes e formatos dos dados, formas de exibio, estrutura de relatrios, terminologias, etc. o Reduzir o Tempo de Desenvolvimento de Aplicaes: Com um banco de dados existente e bem estruturado, deve reduzir drasticamente o tempo de desenvolvimento de uma nova aplicao, o que no verdade quando um sistema novo precisar de um banco de dados novo. o Ser Flexvel: Deve permitir mudar uma estrutura de um banco de dados para atender as mudanas de necessidades do mundo real. o Prover Disponibilidade: Um banco de dados deve estar sempre disponvel a qualquer usurio, a qualquer alterao de um registro, deve refletir aos demais imediatamente. o Ecomonias de escalas: Deve permitir a consolidao de diversas aplicaes e seus dados em um nico repositrio, evitando assim que cada projeto tenha seu sistema e seu banco de dados, evitando desperdcios de mquinas, software e tempo de comunicao entre eles.

Viso HisTRica dos Tipos dE BaNcos dE Dados


Olhando o passado, tivemos diversas formas de armazenamento de dados, que motivaram a evoluo dos sistemas de bancos de dados. Muitas aplicaes antigas mantinham suas grandes quantidades de registros com uma estrutura de dados relativamente parecida e um dos principais problemas encontrados era a mistura de relacionamentos conceituais com o que eram fisicamente guardados no banco de dados. Desta forma, quando uma aplicao era desenvolvida, todos os dados ficavam em uma mesma estrutura de dados at o momento que aquela necessidade era atendida. O tempo de retorno dos dados era satisfatrio, porm quando havia a necessidade de analisar os dados de uma nova perspectiva, isto se tornava difcil de implementar e com alto tempo de demora na recuperao dos dados. Outro problema era que os antigos sistemas proviam apenas uma nica interface de linguagem de programao, ou seja, para cada nova implementao de novas consultas, novos programas deviam ser escritos, testados e depurados, pois tudo isto era realizado em computadores mainframes nas dcadas de 1960 a 1980. Todos eram baseados em trs paradigmas: Sistemas Hierrquicos, Sistemas Baseados em Modelo de Redes e Sistemas de Arquivos Invertidos. Os bancos de dados relacionais surgiram em seguida e foram propostos originalmente para separar o conceito de armazenamento fsico com sua representao conceitual. Isto propiciou, por meio do modelo relacional, a criao de linguagens de consultas de alto nvel, uma nova alternativa para programao tornando a escrita de novas consultas muito mais rpidas. Os primeiros bancos de dados relacionais desenvolvidos no final da dcada de 1970 e introduzidos no incio da dcada de 1980 eram muito mais prticos, porm muito lentos de se trabalhar, pois no utilizavam ponteiros no armazenamento fsico dos dados. Com o desenvolvimento de novas tcnicas de armazenamento nos anos seguintes, houve uma melhora significativa no tempo de processamento e otimizao de consultas, fazendo com que at hoje os sistemas de banco de dados relacionais sejam um sistema dominante, sendo utilizados em quase todos os tipos de computadores, desde os de uso pessoal at em grandes servidores.

84
Universidade Metodista de So Paulo

Com o surgimento de aplicaes orientadas a objetos no final da dcada de 1980, a necessidade de armazenar e compartilhar objetos complexos levou, tambm, a criao de bancos de dados orientados a objetos. Chegou a se divulgar, inicialmente, como um concorrente dos bancos de dados relacionais, porm com a complexidade do modelo e a falta de um padro inicial definido, contribuiu para um uso limitado deles. Hoje em dia h nos bancos de dados relacionais mais recentes vrios conceitos de orientao a objetos inseridos. No incio da dcada de 1990, a Internet (World Wide Web) foi grandemente difundida, surgindo o comrcio eletrnico, fazendo com que a necessidade de dados armazenados em banco de dados fosse disponibilizada na internet. Uma forma de fazer isto possvel foi a criao de uma Linguagem de Marcao Estendidas (XML eXtended Markup Language) e definida como padro de intercmbio entre diversos tipos de bancos de dados e pginas Web. Com o passar dos anos, diversos sistemas foram desenvolvidos com caractersticas especficas, e cada uma delas com seu prprio banco de dados, e muitas acabavam no se comunicando com outros sistemas. Para resolver este impasse, na mesma dcada, surgiram os sistemas de gesto chamados ERP (Enterprise Resource Planning ou Sistemas de Planejamento de Recursos Empresariais) que integravam seus diversos mdulos em um nico banco de dados, eliminando a falta de comunicao entre eles.

PRopRiEdadEs dE um SGBD
O formato de um SGBD, quanto arquitetura, evoluiu por meio de diversas verses de bancos de dados durante estes anos, desde sistemas monolticos at os mais integrados de forma modular, em que est presente a arquitetura cliente/servidor. Ou seja, a tendncia anterior de termos um nico e potente servidor centralizado (Mainframe) vem a cada ano sendo substitudo por centenas e milhares de estaes de trabalho distribudas conectadas por meio de redes de computadores a vrios computadores servidores. A principal abordagem quanto a melhor arquitetura a ser utilizada que ela deve oferecer algum tipo de Abstrao dos dados, ou seja, segundo Elmasri (2011), a abstrao de dados a forma de ... ocultar os detalhes quanto ao formato de armazenamento dos dados, destacando principalmente os recursos essenciais para um melhor conhecimento dos dados . H 3 nveis de abstrao de dados:

Viso: Descrevem parte do banco de dados, apresentando as diversas vises que sero proporcionadas pelo mesmo banco. Lgico: Descrevem quais so os dados que sero armazenados e seus inter-relacionamentos. Fsico: Descrevem a forma pela qual os dados sero efetivamente armazenados nos discos rgidos do computador.

85
www.metodista.br/ead

Um modelo de dados considerado um conjunto de conceitos que so usados para descrever a estrutura de um banco de dados utilizando-se de meios necessrios para alcanar uma abstrao. A principal meta da arquitetura trs esquemas separar as aplicaes do usurio do banco de dados fsico. Os esquemas podem ser definidos como: Nvel interno: ou esquema interno, o qual descreve a estrutura de armazenamento fsico do banco dedados; utiliza um modelo de dados e descreve detalhadamente os dados armazenados e os caminhos de acesso ao banco de dados; Nvel conceitual: ou esquema conceitual, o qual descreve a estrutura do banco de dados para a comunidade de usurios. O esquema conceitual oculta os detalhes das estruturas de armazenamento fsico e se concentra na descrio de entidades, tipos de dados, conexes, operaes de usurios e restries. Geralmente, um modelo de dados representacional usado para descrever o esquema conceitual quando o sistema de banco de dados for implementado; Nvel externo: ou esquema de viso, o qual descreve as vises do banco de dados para um grupo de usurios; cada viso descreve quais pores do bancode dados um grupo de usurios teracesso. Observe que os trs esquemas so apenas descriesdos dados; na verdade, o dado que existe defato est no nvel fsico. A maioria dos SGBDs no separa os trs nveis completamente, mas suporta a arquitetura de trs esquemas de alguma forma. Alguns SGBDs incluem detalhes do nvel fsico no esquema conceitual.

Figura 5 A arquitetura de trs esquemas Fonte: ELMASRI (2011)

86
Universidade Metodista de So Paulo

Esta arquitetura de trs esquemas explica o conceito de independncia dos dados, que representa a capacidade de alterar o esquema em nvel de sistema de banco de dados em ter que alterar o esquema no nvel mais alto (conceitual). H dois tipos de independncia de dados:

Independncia lgica: a capacidade de mudar o esquema conceitual sem alterar os esquemas externos ou programas de aplicao. Por exemplo, mudando uma viso de uma necessidade, apenas ser necessrio acessar tabelas diferentes sempre precisar mudar o conceito de negcio ou alterar o banco de dados que foi concebido. Independncia fsica: a capacidade de se alterar o esquema interno sem ter que alterar o esquema conceitual. Por exemplo, alterar uma tabela para incluir uma nova coluna, alterar um tipo de dados, tamanho de um campo.

Quando um projeto de Banco de Dados finalizado e um SGBD escolhido para implement-lo, h alguns grupos de linguagens de banco de dados que so responsveis por certas funcionalidades, so elas: DDL (Data Definition Language ou Linguagem de Definio de Dados): neste grupo esto inseridas as linguagens utilizadas por DBAs e Projetistas de bancos de dados para construir esquemas de bancos de dados e para definir tanto o esquema conceitual quanto o externo. Exemplo de linguagem DDL: drop table produtos; DML (Data Manipulation Language ou Linguagem de Manipulao de Dados): neste grupo esto inseridas as linguagens utilizadas para manipular os dados de um banco de dados que j foi criado. Exemplo de linguagem DML: select * from produtos; DCL (Data Control Language ou Linguagem de Controle de Dados): neste grupo esto inseridas as linguagens utilizadas para controlar autorizaes de acessos aos dados. Exemplo de linguagem DCL: grant select on produtos to public; Mais para frente neste guia, teremos um tpico dedicado exclusivamente a ensinar-lhe como programar em SQL (Structured Query Language).

ARQuiTETuRas dE BaNcos dE Dados


Atualmente, deve-se considerar alguns aspectos relevantes para atingir a eficincia e a eficcia dos sistemas informatizados desenvolvidos, a fim de atender seus usurios nos mais variados domnios de aplicao: automao de escritrios, sistemas de apoio a decises, controle de reserva de recursos, controle e planejamento de produo, alocao e estoque de recursos, entre outros. Os projetos Lgicos e Funcionais do Banco de Dados devem ser capazes de prever o volume de informaes armazenadas a curto, mdio e longo prazo. Os projetos devem ter uma grande capacidade de adaptao para os trs casos mencionados. Deve-se ter generalidade e alto grau de abstrao de dados, possibilitando confiabilidade e eficincia no armazenamento dos dados e permitindo a utilizao de diferentes tipos de gerenciadores de dados atravs de linguagens de consultas padronizadas. 87
www.metodista.br/ead

Projeto de uma interface gil para propiciar aprendizado suave ao usurio, no intuito de minimizar o esforo cognitivo. A implementao de um projeto de interface compatvel com mltiplas plataformas (UNIX, Windows NT, Windows Workgroup, etc). Independncia de implementao da Interface em relao aos SGBDs que daro condies s operaes de armazenamento de informaes (ORACLE, SYSBASE, INFORMIX, PADRO XBASE, etc). Converso e mapeamento da diferena semntica entre os paradigmas utilizados no desenvolvimento de interfaces (Imperativo ou procedural, Orientado a Objeto, Orientado a evento), servidores de dados (Relacional) e programao dos aplicativos (Imperativo, Orientado a Objetos). As primeiras arquiteturas usavam mainframes para executar o processamento principal e de todas as funes do sistema, incluindo os programas aplicativos, programas de interface com o usurio, bem como a funcionalidade dos SGBDs. Esta a razo pela qual a maioria dos usurios fazia acesso aos sistemas via terminais que no possuam poder de processamento, apenas a capacidade de visualizao. Todos os processamentos eram feitos remotamente, apenas as informaes a serem visualizadas e os controles eram enviados do mainframe para os terminais de visualizao, conectados a ele por redes de comunicao. Como os preos do hardware foram decrescendo, muitos usurios trocaram seus terminais por computadores pessoais (PC) e estaes de trabalho. No comeo, os SGBDs usavam esses computadores da mesma maneira que usavam os terminais, ou seja, o SGBD era centralizado e toda sua funcionalidade, execuo de programas aplicativos e processamento da interface do usurio eram executados em apenas uma mquina. Gradualmente, os SGBDs comearam a explorar a disponibilidade do poder de processamento no lado do usurio, o que levou arquitetura cliente-servidor. A arquitetura cliente-servidor foi desenvolvida para dividir ambientes de computao em que um grande nmero de PCs, estaes de trabalho, servidores de arquivos, impressoras, servidores de banco de dados e outros equipamentos so conectados juntos por uma rede. A ideia definir servidores especializados, tais como servidor de arquivos, que mantm os arquivos de mquinas clientes, ou servidores de impresso, que podem estar conectados a vrias impressoras; assim, quando se desejar imprimir algo, todas as requisies de impresso so enviadas a este servidor. As mquinas clientes disponibilizam para o usurio as interfaces apropriadas para utilizar esses servidores, bem como poder de processamento para executar aplicaes locais. Esta arquitetura se tornou muito popular por algumas razes. Primeiro, a facilidade de implementao dada clara separao das funcionalidades e dos servidores. Segundo, um servidor inteligentemente utilizado porque as tarefas mais simples so delegadas s mquinas clientes mais baratas. Terceiro, o usurio pode executar uma interface grfica que lhe familiar, ao invs de usar a interface do servidor. Desta maneira, a arquitetura cliente-servidor foi incorporada aos SGBDs comerciais. Diferentes tcnicas foram propostas para se implementar essa arquitetura, sendo que a mais adotada pelos Sistemas Gerenciadores de Banco de Dados Relacionais (SGBDRs) comerciais a incluso da funcionalidade de um SGBD centralizado no lado do servidor. As consultas e a funcionalidade transacional permanecem no servidor, sendo que este chamado de servidor de consulta ou servidor de transao. assim que um servidor SQL fornecido aos clientes. Cada cliente tem que formular suas consultas SQL, prover a interface do usurio e as funes de interface usando uma linguagem de programao. O cliente pode tambm se referir a um dicionrio de dados o qual inclui informaes sobre a distribuio dos dados em vrios servidores SQL, bem como os mdulos para a decomposio de uma consulta global em um nmero de consultas locais que podem ser executadas em vrios stios. Comumente o servidor SQL tambm chamado de back-end machine e o cliente de front-end machine. Como o SQL prov uma linguagem padro para o SGBDRs, esta criou o ponto de diviso lgica entre o cliente e o servidor.

88
Universidade Metodista de So Paulo

Atualmente, existem vrias tendncias para arquitetura de Banco de Dados, nas mais diversas direes, so elas: Plataformas centralizadas: Na arquitetura centralizada, existe um computador com grande capacidade de processamento, o qual o hospedeiro do SGBD e emuladores para os vrios aplicativos. Esta arquitetura tem como principal vantagem a de permitir que muitos usurios manipulem grande volume de dados. Sua principal desvantagem est no seu alto custo, pois exige ambiente especial para mainframes e solues centralizadas. Sistemas de Computador Pessoal PC: Os computadores pessoais trabalham em sistema stand-alone, ou seja, fazem seus processamentos sozinhos. No comeo, esse processamento era bastante limitado, porm, com a evoluo do hardware, tem-se hoje PCs com grande capacidade de processamento. Eles utilizam o padro Xbase e quando se trata de SGBDs, funcionam como hospedeiros e terminais. Desta maneira, possuem um nico aplicativo a ser executado na mquina. A principal vantagem desta arquitetura a simplicidade. Banco de Dados Cliente-Servidor: Na arquitetura Cliente-Servidor, o cliente (front_ end) executa as tarefas do aplicativo, ou seja, fornece a interface do usurio (tela e processamento de entrada e sada). O servidor (back_end) executa as consultas no DBMS e retorna os resultados ao cliente. Apesar de ser uma arquitetura bastante popular, so necessrias solues sofisticadas de software que possibilitem: o tratamento de transaes, as confirmaes de transaes (commits), desfazer transaes (rollbacks), linguagens de consultas (stored procedures) e gatilhos (triggers). A principal vantagem desta arquitetura a diviso do processamento entre dois sistemas, o que reduz o trfego de dados na rede. Banco de Dados Distribudos (N camadas): Nesta arquitetura, a informao est distribuda em diversos servidores. Como exemplo, observe abaixo. Cada servidor atua como no sistema cliente-servidor, porm as consultas oriundas dos aplicativos so feitas para qualquer servidor indistintamente. Caso a informao solicitada seja mantida por outro servidor ou servidores, o sistema encarrega-se de obter a informao necessria, de maneira transparente para o aplicativo, que passa a atuar consultando a rede, independente de conhecer seus servidores. Exemplos tpicos so as bases de dados corporativas, em que o volume de informao muito grande e, por isso, deve ser distribudo em diversos servidores. Porm, no dependente de aspectos lgicos de carga de acesso aos dados ou base de dados fracamente acopladas, em que uma informao solicitada vai sendo coletada numa propagao da consulta numa cadeia de servidores. A caracterstica bsica a existncia de diversos programas aplicativos consultando a rede para acessar os dados necessrios, porm, sem o conhecimento explcito de quais servidores dispem desses dados.

PRocEsso dE ModELaGEm dE Dados


O processo de modelagem de dados abordar os bancos de dados relacionais. O modelo de dados relacional foi introduzido por Ted Codd em 1970, quando ainda integrava a IBM Research. Rapidamente atraiu a ateno de todos devido a praticidade e simplicidade de seus modelos. Quando falamos em Modelagem Relacional, devemos ter em mente um banco de dados como uma coleo de relaes. Em outras palavras, uma relao uma associao a uma tabela de valores ou, tambm, considerada como um arquivo plano (por estar em uma estrutura linear) de registros.

89
www.metodista.br/ead

Como uma tabela de valores, cada linha dela representa uma coleo de valores de dados relacionados. Uma linha representa um fato que corresponde a uma entidade ou relacionamento com o mundo real. Temos ento, na terminologia formal do modelo relacional, o seguinte: Relao = Tabela Atributo = Coluna/Campos Tupla = Linha/Registros Domnio = Tipo do Dado/Formato (Texto, Data, Nmero, etc.)

Figura 6 Atributos e Tuplas de uma Relao

Um esquema relacional a relao R, representado por R(A1, A2, ... , An ), em que h uma lista de atributos (A1, A2, An) em parnteses, cada atributo representado por algum domnio, ou seja, representado como o domnio de um atributo A1, ou simplesmente dom(A1). Conforme o exemplo acima, suponhamos que a relao seja ALUNO, ento, conforme a terminologia descrita, ficaria da seguinte forma: ALUNO(MATRICULA: string, NOME: string, IDADE: integer) Quando definimos uma relao como um conjunto estruturado de dados, esta se diferencia de como arquivos comuns so gerados. Uma relao foi definida como um conjunto de tuplas. Matematicamente podemos dizer que elas no possuem uma ordem em particular. A ordenao de uma relao no faz parte da definio dela, pois esta deve representar a ordem em que os fatos ocorrem no mundo real. Por exemplo, imaginemos a relao ALUNO acima, ao definirmos todos os atributos existentes, ao passo que comear a ser utilizada para serem armazenados dados do mundo real, ter informaes de alunos sendo inseridos em diversos perodos de tempos diferentes, sem nenhum tipo de ordem. Porm, conforme a necessidade de se analisar os dados inseridos em um determinado perodo do tempo, voc queira ter vises diferentes dos mesmos dados. Pode ser necessrio ordenar os dados desta relao por ordem de NOMES, ou na ordem de IDADES, e assim por diante. A estrutura das relaes no muda, mas a forma que os dados devam ser apresentados.

90
Universidade Metodista de So Paulo

NvEis dE ModELaGEm dE Dados


Vimos anteriormente que o processo de Modelagem de Dados deve satisfazer as necessidades do mundo real, por meio do trabalho do analista de sistemas, que deve abstrair todos os detalhes da necessidade do usurio final e traduzir em modelos de dados que sejam interpretados pelas diversas etapas de um projeto de banco de dados. A imagem abaixo representa as etapas e os modelos utilizados no processo de modelagem.

Figura 7 Nveis de Modelagem de Dados

ModELo CoNcEiTuaL
Inicialmente, um projeto de concepo de um banco de dados deve iniciar por meio do modelo conceitual, que uma das fases mais importantes para que um banco de dados seja bem-sucedido. Geralmente, um banco de dados refere-se e associado a programas que implementam consultas a atualizaes de um determinado assunto. Por exemplo, se considerarmos um banco de dados de um BANCO, que deve ter programas que controlem depsitos e saques de clientes de suas contas bancrias por meio de caixas eletrnicos. Estes sistemas sero implementados com interfaces grficas de fcil utilizao, com formulrios e menus que guiaro os usurios na melhor utilizao de suas necessidades. Sabemos que h diversas metodologias de modelagem de sistemas, porm a UML (Unified Modeling Languagem) est se tornando cada vez mais popular no projeto de bancos de dados. Na UML, o diagrama de classes muito semelhante aos modelos de Entidade-Relacionamento (ER). A principal etapa do modelo conceitual o Levantamento e Anlise de Requisitos, em que so realizadas por Projetistas de Bancos de Dados diversas entrevistas com usurios finais para entenderem e documentarem os requisitos de dados que devem ter um detalhe maior de informaes. Com posse destas informaes, a hora de se criar um esquema conceitual, que uma descrio concisa dos requisitos de dados levantados e inclui detalhes dos tipos de entidades, seus relacionamentos e suas restries (se houver). Este esquema conceitual utilizado por Modelos Entidade-Relacionamento (MER).

91
www.metodista.br/ead

Figura 8 Exemplo de um Modelo Entidade-Relacionamento

ModELo ENTidadE-RELacioNamENTo
O Modelo Entidade-Relacionamento (MER) descreve os dados como ENTIDADES, ATRIBUTOS e RELACIONAMENTOS, estes so representados por smbolos geomtricos. Segue abaixo todos os tipos possveis de smbolos existentes em um modelo conceitual.

92

Figura 9 Resumo da notao para diagramas MER Fonte: ELMASRI (2011)

Universidade Metodista de So Paulo

Abaixo, apresentamos um exemplo de como representado o modelo, com os elementos bsicos.

Figura 10 Exemplo de um Modelo Entidade-Relacionamento

Uma ENTIDADE um objeto bsico que representa algo do mundo real. Uma entidade pode ser: um objeto com uma existncia fsica: uma pessoa, um carro, uma casa e um funcionrio especfico. um objeto com uma existncia conceitual: uma empresa, um cargo, ou um curso universitrio.

Figura 11 Exemplo da Estrutura de Entidades

93
www.metodista.br/ead

Em um Modelo Entidade-Relacionamento, uma entidade representada com uma caixa retangular, delimitando por um nome, como podem reparar logo abaixo.

Figura 12 Exemplos da representao das Entidades

Em uma entidade, podem existir diversos ATRIBUTOS, que nada mais so do que propriedades especficas que descrevem caracterstica das entidades. Por exemplo, na imagem acima, entidade CLIENTE possui uma srie de atributos que a descrevem: IDENTIDADE, NOME, ENDEREO, TELEFONE, ESTATURA, PESO e assim por diante. H vrios tipos de atributos que podem ocorrer em um Modelo E-R: Atributos Simples/Atmico: So aqueles atributos que no so divisveis, por exemplo: Idade. Atributos Compostos: So aqueles atributos que podem ser divididos em subpartes menores, que representam atributos mais bsicos, com significados independentes, por exemplo: Logradouro, pode ser subdividido em Tipo de Logradouro, Nome do Logradouro, Nmero, Cidade, Estado, CEP. Atributos de Valor nico: A maioria dos atributos possui um valor nico para uma entidade particular, por exemplo, um CPF para uma pessoa fsica. Atributos Multivalorados: Um atributo pode ter um conjunto de valores para a mesma entidade, por exemplo, quando falamos de CORES para um CARRO. H carros que tem apenas uma cor, mas pode ter carros com mais de uma cor. Atributo Armazenado: um atributo que referencia uma caracterstica de um registro de uma entidade e no pode ser derivado, por exemplo: Data de Nascimento. Atributo Derivado: um atributo que derivado de outro atributo, por exemplo: Idade (derivado do atributo Data de Nascimento, porm considerando a data atual (hoje)). Valores NULL: Em alguns casos, um atributo pode no ter um valor aplicado para uma determinada entidade, para tais situaes criado um valor especial, chamado NULL, por exemplo: Um atributo NUM_CASA, teria um valor NULL, caso o endereo referenciado fosse o de um apartamento. Atributos Complexos: So atributos compostos e multivalorados que podem ser aninhados arbitrariamente, sendo na maioria das vezes representado por parnteses () ou por chaves [], por exemplo, uma pessoa pode ter uma residncia e para cada residncia pode haver mais do que um telefone. Nos Modelos Entidade-Relacionamento, os atributos so referenciados por smbolos ovais, delimitados por um nome, que so relacionados s suas devidas entidades por linhas retas.

94
Universidade Metodista de So Paulo

Figura 13 Exemplo da representao dos Atributos

Em um modelo com diversas entidades, para fazer algum sentido, deve haver fatos ou acontecimentos que ligam estes objetos. Um RELACIONAMENTO considerado relaes ou associaes que ocorrem entre entidades e, principalmente, verbos que devem representar estes fatos, por exemplo: PESSOA possui AUTOMOVEL, DOCUMENTO pertence a PROCESSO, PROFESSOR ensina ALUNO. Em um Modelo Entidade-Relacionamento, os relacionamentos so representados pelo smbolo de um losango, com o fato (verbo), que faz a associao, descrito na parte interna.

Figura 14 Exemplo da representao de um Relacionamento

Em um Relacionamento, deve ser possvel descrever qual a CARDINALIDADE, que descrito como o nmero mnimo e mximo de instncias que podem ocorrer em uma relao entre entidades. Atualmente, existem apenas 3 tipos de cardinalidades, que detalharemos abaixo: Relacionamento Um para Um (1:1): Neste tipo de relacionamento a cardinalidade mnima pode ser de 1 instncia (podendo variar dependendo do tipo do relacionamento) e a mxima pode ser at o limite de 1 instncia possvel para um relacionamento. Exemplo: Sabemos que uma PESSOA qualquer ao morrer recebe apenas uma CERTIDO DE BITO que para a sociedade declarada morta, porm outra pessoa ainda viva, consequentemente, no deve possuir tal certido. No modelo, a representao desta cardinalidade seria da seguinte forma.

Figura 15 Exemplo da Cardinalidade Um para Um (1:1)

95
www.metodista.br/ead

Relacionamento Um para Muitos (1:N): Neste tipo de relacionamento a cardinalidade mnima tambm pode ser de 1 instncia (podendo variar dependendo do tipo do relacionamento) e a mxima no h um limite definido. Exemplo: Uma EMPRESA qualquer pode possuir ou no FILIAL em um pas, porm caso haja, esta quantidade no pode ser definida, pois filiais podem existir em quantidades e localidades indefinidas. No modelo, a representao desta cardinalidade seria da seguinte forma.

Figura 16 Exemplo da Cardinalidade Um para Muitos (1:N)

Relacionamento Muitos para Muitos (M:N): Neste tipo de relacionamento a cardinalidade mnima tambm pode ser de 1 at vrias instncias (podendo variar dependendo do tipo do relacionamento) e a mxima no h como definir sua quantidade. Exemplo: Um ATLETA pode praticar sozinho diversos tipos de esportes (TRIATLON, PENTATLO, etc.) e um conjunto de atletas pode praticar o mesmo tipo de esporte (FUTEBOL, BASQUETE). No modelo, a representao desta cardinalidade seria da seguinte forma.

Figura 17 Exemplo da Cardinalidade Muito para Muitos (M:N)

ModELo LGico
Aps a criao do Modelo Entidade-Relacionamento, segue-se para a etapa de Modelagem Lgica dos dados, em que so definidas e especificadas as propriedades dos dados. Neste tipo de modelo que os desenvolvedores estimam uma prvia de como os dados sero armazenados, estimando os tipos de dados e seus tamanhos mximos permitidos para cada domnio de uma tupla em uma relao.

Figura 18 Exemplo da Estrutura de uma Entidade no Modelo Lgico

96
Universidade Metodista de So Paulo

Para transformar o seu Modelo Conceitual, tambm conhecido como Modelo Entidade-Relacionamento, em um Modelo Lgico h alguns passos que devem ser considerados: Passo 1: Para toda entidade definida no MER, deve-se criar uma tabela no modelo lgico. Seus atributos definidos sero identificados como colunas na tabela. O atributo identificador da entidade ser automaticamente a chave primria da tabela. Passo 2: Para toda entidade fraca (que no possuem atributos chaves prprios) no MER, deve-se criar uma tabela nova no modelo lgico. Seus atributos devero ser identificados como colunas dentro da tabela, adicionando uma chave estrangeira que referenciar a uma chave primria da tabela proprietria. Passo 3: Para todo relacionamento de cardinalidade mxima (1:1) na chave primria de uma das tabelas envolvidas no relacionamento (preferencialmente a de cardinalidade mnima zero ) inclui-se como chave estrangeira a chave da outra tabela envolvida no relacionamento. Os atributos do relacionamento acompanham a chave estrangeira. Passo 4: Para todo relacionamento de cardinalidade mxima (1:N) pega-se a chave primria da tabela do lado 1 e inclui-se como chave estrangeira na tabela do lado N. Os atributos do relacionamento acompanham a chave estrangeira. Passo 5: Para todo relacionamento (N:M) cria-se uma nova tabela. Os atributos desta tabela sero as chaves primrias das tabelas envolvidas, includas como chave estrangeira, mais os atributos do prprio relacionamento. A chave primria desta tabela ser as chaves primrias das tabelas envolvidas. Passo 6: Para todo atributo multivalorado cria-se uma nova tabela. Os atributos desta tabela sero a chave primria da tabela de origem mais o prprio atributo multivalorado. A chave primria dessa tabela deve ser composta destes dois atributos. Passo 7: Preferencialmente, eliminar a especializao utilizando atributos adicionais na entidade generalizada. Estes atributos devem conter, como domnio, as especializaes. Caso no seja possvel o procedimento acima optar por incluir-se nas entidades especficas a chave primria da entidade geral como chave estrangeira. Abaixo, apresentaremos alguns exemplos de como seria a converso dos Modelos Conceituais para Modelos Lgicos: Relacionamento Um para Um (1:1):

Figura 19 Converso de um Relacionamento Um para Um do MER para Lgico

97
www.metodista.br/ead

Relacionamento Um para Muitos (1:N):

Figura 20 Converso de um Relacionamento Um para Muitos do MER para Lgico

Relacionamento Muitos para Muitos (M:N):

Figura 21 Converso de um Relacionamento Muitos para Muitos do MER para Lgico

ModELo Fsico
A ltima etapa do projeto de um banco de dados considerada a modelagem fsica, tambm chamada de projeto fsico, que pode ser definida como o processo de se criar estruturas fsicas em um Sistema Gerenciador de Bancos de Dados, por meio de procedimentos em que so realizados quaisquer armazenamentos internos e que tambm so criadas todas as organizaes dos arquivos, alm da criao e manuteno de ndices que facilitam e aumentam o tempo de resposta em consultas complexas, que acessam grande quantidade de registros e, principalmente, a definio de caminhos de acesso para que outras aplicaes acessem estes dados. Concluindo, podemos dizer que so todos os parmetros necessrios para que um banco de dados possa existir efetivamente ou fisicamente. 98
Universidade Metodista de So Paulo

Referncias DATE, C. J. Introduo a Sistemas de Bancos de Dados. 1 ed. Traduo da 8 Edio Americana. So Paulo:CAMPUS, , 2004. ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de Banco de Dados. 6 ed. So Paulo: Pearson, 2011. NORTON, Peter. Introduo Informtica. So Paulo:Makron Books, 1996. HEUSER, Carlos A. Projeto de Banco de Dados. 2 ed. So Paulo: Sagra Luzzatto, 1999.

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________
99
www.metodista.br/ead

_________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________
100
Universidade Metodista de So Paulo

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________

Organizao de Dados

Introduo ao Banco de Dados Parte 2


Prof. Esp. Leonardo Mairene Muniz

Mdulo

Apresentar os fundamentos de arquitetura de banco de dados, oferecendo uma anlise sobre as linguagens de definio e manipulao de dados e sobre a modelagem dos dados. Apresenta o projeto de banco de dados relacional, estudando as suas caractersticas e, tambm, apresenta os SGBDs (Sistemas Gerenciadores de Banco de Dados). Aplica a prtica da programao por meio da linguagem SQL (Structured Query Language) para manipulao de Banco de Dados relacional.

Objetivos:

www.metodista.br/ead

LGEBRa Relacional
Quando os bancos de dados foram criados, houve a necessidade de se definir linguagens formais para os modelos relacionais, e duas foram definidas: lgebra Relacional e Clculo Relacional. Historicamente, as linguagens formais surgiram antes da Linguagem SQL ser criada. Porm, podemos dizer que o padro SQL segue fielmente os conceitos tanto de lgebra quanto do Clculo Relacional. Um conjunto bsico de operaes para um modelo relacional determinado de lgebra Relacional. Estes conjuntos de operaes permitem a qualquer usurio especificar solicitaes de recuperao bsica ou simplesmente conhecidas como expresses da lgebra relacional. Os resultados destas expresses sempre sero gerados por novas relaes que podem ser manipuladas ainda mais, e estas podem ser originadas atravs de uma ou mais relaes. A lgebra relacional muito importante por inmeras razes; primeiro, oferece uma forma estruturada para operaes em um modelo relacional e, segundo, por que todos os sistemas gerenciadores de banco de dados utilizam este conceito para otimizar e implementar consultas, processando-as internamente em um banco de dados. A terceira que a maioria dos conceitos apresentados pela lgebra relacional est incorporada no padro SQL utilizado em qualquer banco de dados. J uma expresso de Clculo Relacional uma linguagem declarativa de um nvel mais alto em um modelo relacional. Na lgebra Relacional, h dois conjuntos de operaes: Conjunto de Operaes da Teoria de Conjunto da Matemtica: so definidas pelas operaes de UNIO, INTERSECO, DIFERENA e PRODUTO CARTESIANO. Conjunto de Operaes Especficas para Bancos de Dados Relacionais: so definidas por 2 subdivises. o Operaes relacionais unrias: SELEO, PROJEO, RENOMEAR. o Operaes relacionais binrias: JUNO. Para entrarmos no detalhe de cada operao da lgebra relacional, utilizaremos como base de dados relacional os dados de uma EMPRESA com o esquema de entidades e atributos abaixo: FUNCIONARIO PNOME M I N I - UNOME CPF DATANASC E N D E R E - SEXO SALARIO CPF_SUPERVI- DNR CIAL CO SOR DEPARTAMENTO DNOME DNUMERO CPF_GERENTE DATA_INICIO_GERENTE

LOCALIZACAO_DEP DNUMERO DLOCAL PROJETO PROJNOME PROJNUMERO PROJLOCAL DNUM

TRABALHA_EM FCPF PNR DEPENDENTE FCPF 102


Universidade Metodista de So Paulo

HORAS

NOME_DEPENDENTE SEXO

DATANASC

PARENTESCO

SELEO
Nas operaes unrias, temos a SELEO, que usada para resgatar um subconjunto de tuplas de uma relao que, principalmente, satisfaa uma condio de seleo. Podemos considerar, tambm, que esta operao utilizada como um filtro que retorne apenas as tuplas que satisfaam uma condio especificada. Outra forma de compreenso desta operao dividir-se uma tupla em duas parties horizontais, ou seja, a primeira parte aquela que ser restringida pela condio e ser apresentada no seu resultado, e a outra parte aquela que no satisfaz as restries impostas e ser descartada do resultado. Para representarmos como uma expresso utilizamos uma notao especfica, que para o caso da SELEO utilizada o smbolo s (sigma), com uma condio de seleo sobre uma relao R. Esta condio de seleo deve sempre ser composta do nome do atributo, um operador e um valor, da seguinte forma: s <condio seleo> (R) Onde <condio seleo> deve ser composta de: <nome atributo> -> nome do atributo que deve constar na relao R. <operador> -> deve ser em geral um destes smbolos (=, <>, <, <=, >, >=) <valor constante> -> deve ser um valor de domnio vlido para o atributo.

Um exemplo prtico seria, caso tenhamos uma entidade R chamada FUNCIONARIOS, e queremos apenas recuperar as tuplas (linhas) cujos salrios sejam superiores a R$30.000,00 ou aquelas tuplas que sejam apenas do departamento nmero 4, teramos a expresso abaixo: s SALARIO > 30.000 (FUNCIONARIO) s DNR = 4 (FUNCIONARIO) Quando h duas ou mais condies que devem ser necessrias para satisfazer uma expresso relacional, possvel uni-las atravs de operadores booleanos AND, OR e NOT. As condies booleanas devem seguir o seguinte pressuposto lgico: <condio1> AND <condio2> ser TRUE (Verdadeira), somente se <condio1> e <condio2> sejam TRUE, caso contrrio, sero FALSE (Falso). <condio1> OR <condio2> ser TRUE (Verdadeira), somente se <condio1> ou <condio2> ou ambas sejam TRUE, caso contrrio, sero FALSE (Falso). NOT <condio1> ser TRUE (Verdadeira) se caso a <condio1> for FALSE (falso), caso contrrio, sero FALSE (Falso). Considerando o mesmo exemplo acima, porm agora incluindo as condies com o operador OR, ficaria assim: s (SALARIO > 30.000 OR DNR = 4) (FUNCIONARIO) Ressaltamos que um operador SELEO unrio, ou seja, sempre aplicado em uma nica relao, e seu resultado sempre gerar uma relao nova com quantidade de tuplas menores ou igual a quantidade de tuplas da relao de origem. Uma expresso de SELEO tambm cumulativa: 103
www.metodista.br/ead

s <condio1> ( <condio2> (R) ) = s <condio2> ( <condio1> (R) ) e tambm pode ser combinada em cascata, da seguinte forma: s <condio1> ( s<condio2> (... (s<condioN> (R) ) ) )

PROJEO
Outra operao unria existente a PROJEO. Se at agora vimos que a operao SELEO seleciona apenas tuplas correspondentes a um critrio informado descartando as tuplas restantes, o operador PROJEO trabalha de uma forma diferente, selecionando os atributos desejados de uma relao desejada e descartando os demais existentes. Se no caso da SELEO feita uma partio horizontal, a PROJEO realiza uma partio vertical de uma relao. Na notao da lgebra relacional, em uma operao de PROJEO o smbolo utilizado o (pi), da seguinte forma: <lista de atributos> (R) Onde <lista de atributos> deve ser composta de: Uma sublista de atributos existentes na relao R. O resultado da operao projeo ser uma nova relao, com apenas os atributos especificado na <lista de atributos> e na mesma ordem que forem destacados na lista, caso a projeo liste apenas atributos no chaves, este pode acarretar duplicidade de tuplas. No operador PROJEO realizado a remoo de quaisquer registros duplicados que possa ocorrer, de modo que ser apresentado uma lista de tuplas distintas. Considerando um exemplo prtico, a projeo dos atributos sexo e salrio da relao FUNCIONARIO, seriam apresentados na forma algbrica abaixo: SEXO, SALARIO (FUNCIONARIO) Uma operao de projeo, tambm, sempre ter uma quantidade de tuplas igual ou menor do que a quantidade de tuplas da relao original. Da mesma forma que na SELEO, a operao de PROJEO pode ser realizada em cascata, porm sempre deve ser considerada a lista de atributos da operao mais interna, e esta deve existir para que a operao externa seja correta, conforme abaixo: <lista de atributos2> ( <lista de atributos1> (R) ) Considerando o exemplo demonstrado acima, caso seja necessrio extrair apenas o sexo, de uma primeira projeo que contenha sexo e salrio da relao FUNCIONARIO, a expresso algbrica seria conforme abaixo: SEXO ( SEXO, SALARIO (FUNCIONARIO) )

AGRUPANDO OPERAES
Em geral, na maioria das consultas, necessrio aplicar diversas operaes da lgebra relacional para chegar a um resultado esperado. possvel escrevermos toda a expresso em uma mesma operao toda aninhada, ou aplicar cada operao isoladamente e salvando o resultado em uma relao intermediria. Neste caso, temos que dar nomes a estas relaes que mantm estes resultados intermedirios. Se dermos o exemplo de listarmos apenas o nome, sobrenome e salrio dos funcionrios que trabalhem no departamento nmero 5, tudo sendo extrado da relao FUNCIONARIO. 104
Universidade Metodista de So Paulo

PNOME, UNOME, SALARIO ( s DNR = 5 (FUNCIONARIO) ) A expresso acima poderia ser considerada para o resultado esperado, porm caso seja preciso mostrar o resultado de cada sequncia das operaes realizadas, seria necessrio dar um nome para cada passo realizado conforme abaixo: FUNCS_DEP5 s DNR = 5 (FUNCIONARIO) RESULTADO PNOME, UNOME, SALARIO ( FUNCS_DEP5 )

RENOMEAR
Alm de ser possvel dar um nome para cada passo de uma expresso da lgebra relacional, possvel, tambm, renomear os atributos nas relaes intermedirias e, ainda, de um resultado de uma operao que for realizada. Isto acaba sendo muito til para definir um nome mais condizente com a realidade do resultado que for listado numa operao especfica. Se nenhuma operao de RENOMEAR for especificada para uma operao, os nomes dos atributos que sero apresentados seguiro com o mesmo nome original da relao que for utilizada. O smbolo utilizado na notao da lgebra relacional para renomear um conjunto de atributos r (rho). r <lista de atributos renomeados> (R) Como exemplo, se precisarmos projetar o primeiro nome, sobrenome e salrio apenas dos funcionrios do departamento 5, porm renomeando as colunas para um nome mais fcil de ser interpretado, podemos representar da seguinte forma:

UNIO
O operador da lgebra relacional UNIO trabalha com operaes matemticas padro sobre os conjuntos de relaes. O smbolo da notao utilizada pela UNIO o . Considerando o resultado de duas relaes R e S, a operao de unio delas seria notada da seguinte forma na lgebra relacional: R S, formando outra relao com o contedo da relao R mais o contedo da relao S. Por conveno, todas as relaes para ser realizada a operao de UNIO devem ter a mesma quantidade de atributos e devem possuir o mesmo nome, portando sempre til utilizar o operador de renomeao. O operador UNIO tambm comutativo ( R S = S R ) e tambm so considerados associativos (R(ST)=(RT)S). Um exemplo prtico da utilizao do operador UNIO seria o caso de selecionarmos apenas os CPF dos funcionrios do departamento nmero 5 e armazenar em uma relao temporria, e depois selecionarmos apenas o CPF do Supervisor tambm do departamento nmero 5 e armazenar em outra relao temporria, fazendo a unio dos dois conjuntos de dados.

105
www.metodista.br/ead

Um detalhe do operador UNIO, e que caso seja encontrado tuplas iguais em ambas as relaes que estiverem sendo unidas, as duplicidades automaticamente sero descartadas, ficando apenas registro nicos entre elas.

INTERSECO
Temos, tambm, o operador INTERSECO na lgebra relacional. realizada a seleo das tuplas que existam em uma relao R e tambm existam em S, utilizado na notao o smbolo , da seguinte forma R S. O operador INTERSECO tambm considerado comutativo ( R S = S R ) e tambm so considerados associativos ( R ( S T ) = ( R T ) S ). Por conveno, todas as relaes para ser realizada a operao de INTERSECO devem ter a mesma quantidade de atributos e devem possuir o mesmo nome, portando sempre til utilizar o operador de renomeao. Um exemplo prtico da utilizao do operador INTERSECO seria o caso de selecionarmos apenas os CPF dos funcionrios do departamento nmero 5 e armazenar em uma relao temporria, e depois selecionarmos apenas o CPF do Supervisor tambm do departamento nmero 5 e armazenar em outra relao temporria, fazendo a interseco dos dois conjuntos de dados, neste caso sero apresentados apenas os cdigos de CPF que existirem em ambas as relaes.

DIFERENA
Outro operador existente a DIFERENA, tambm conhecido como SUBTRAO, em que o resultado da operao ser todas as tuplas que estiverem contidas na relao R e que no estejam contidas na relao S, sendo utilizado como notao na lgebra relacional o smbolo -, da seguinte forma: R - S. Diferentemente dos outros operadores descritos at este momento, o operador DIFERENA no comutativo ( R - S S - R ). Um exemplo prtico da utilizao do operador DIFERENA seria considerar o esboo de duas relaes, abaixo a diferena entre elas. STUDENT FIRST_NAME SUSAN RAMESH JOHNNY BARBARA AMY JIMMY EMEST 106
Universidade Metodista de So Paulo

INSTRUCTOR LAST_NAME YAO SHAH KOHLER JONES FORD WANG GILBERT FIRST_NAME JOHN RICARDO SUSAN FRANCIS RAMESH LAST_NAME SMITH BROWNE YAO JOHNSON SHAH

RESULTADO STUDENT - INSTRUCTOR


Considerando a operao acima, o resultado seria a relao abaixo: RESULTADO FIRST_NAME JOHNNY BARBARA AMY JIMMY EMEST LAST_NAME KOHLER JONES FORD WANG GILBERT

RESULTADO INSTRUCTOR - STUDENT


Por ser no cumulativa, caso invertamos a ordem das relaes conforme a operao acima, o resultado da operao seria a seguinte relao abaixo: RESULTADO FIRST_NAME JOHN RICARDO FRANCIS LAST_NAME SMITH BROWNE JOHNSON

PRODUTO CARTESIANO
Outro operador existente o PRODUTO CARTESIANO, tambm conhecido como PRODUTO CRUZADO, em que o resultado da operao ser a combinao de cada tupla da relao R com cada tupla da relao S. A notao utilizada na lgebra relacional para o PRODUTO CARTESIANO o X, da seguinte forma R X S. Um detalhe do produto cartesiano que o resultado exponencial quantidade de tuplas que contiver em cada uma das relaes em que ocorrer a operao, por exemplo, a relao INSTRUCTOR possuindo 5 tuplas e a relao STUDENT possuindo 7 tuplas, gerar uma relao nova com 5 x 7 = 35 tuplas, que ser o tamanho da relao RESULTADO.

107
www.metodista.br/ead

RESULTADO INSTRUCTOR X STUDENT


O resultado do produto cartesiano acima seria: RESULTADO FIRST_NAME JOHN JOHN JOHN JOHN JOHN JOHN JOHN RICARDO RICARDO RICARDO RICARDO RICARDO RICARDO RICARDO SUSAN SUSAN SUSAN SUSAN SUSAN SUSAN SUSAN FRANCIS FRANCIS FRANCIS FRANCIS FRANCIS FRANCIS FRANCIS RAMESH RAMESH RAMESH RAMESH RAMESH RAMESH RAMESH LAST_NAME SMITH SMITH SMITH SMITH SMITH SMITH SMITH BROWNE BROWNE BROWNE BROWNE BROWNE BROWNE BROWNE YAO YAO YAO YAO YAO YAO YAO JOHNSON JOHNSON JOHNSON JOHNSON JOHNSON JOHNSON JOHNSON SHAH SHAH SHAH SHAH SHAH SHAH SHAH FIRST_NAME SUSAN RAMESH JOHNNY BARBARA AMY JIMMY EMEST SUSAN RAMESH JOHNNY BARBARA AMY JIMMY EMEST SUSAN RAMESH JOHNNY BARBARA AMY JIMMY EMEST SUSAN RAMESH JOHNNY BARBARA AMY JIMMY EMEST SUSAN RAMESH JOHNNY BARBARA AMY JIMMY EMEST LAST_NAME YAO SHAH KOHLER JONES FORD WANG GILBERT YAO SHAH KOHLER JONES FORD WANG GILBERT YAO SHAH KOHLER JONES FORD WANG GILBERT YAO SHAH KOHLER JONES FORD WANG GILBERT YAO SHAH KOHLER JONES FORD WANG GILBERT

108
Universidade Metodista de So Paulo

JUNO INTERNA (INNER JOIN)


Outro operador utilizado para combinar as tuplas entre duas relaes a JUNO, tambm conhecida como JUNO INTERNA, que possui seu smbolo de notao na lgebra relacional representado por , da seguinte forma: R <condio juno> S Onde <condio juno> pode ser: <atributo1> = <atributo2> <atributo1> > <atributo2> <atributo1> >= <atributo2> <atributo1> < <atributo2> <atributo1> <= <atributo2> <atributo1> <> <atributo2> <condio 1> AND <condio2> AND <condioN>... <condio 1> OR <condio2> OR <condioN>... A juno que utiliza operadores de comparao ( = , < , <= , >, >=, <> ) so considerados de JUNO THETA. A operao JUNO INTERNA muito importante para qualquer banco de dados relacional com mais de uma relao, porque permite processar relacionamentos entre qualquer relao. Um exemplo seria caso desejarmos combinar tuplas da relao FUNCIONARIO e a relao DEPARTAMENTO, recuperando o nome do gerente de cada departamento. Combinando as duas relaes pelo atributo em comum, que no caso da relao FUNCIONARIO o atributo CPF e na relao DEPARTAMENTO o atributo CPF_GERENTE, a operao deveria ser a seguinte: DEP_GER FUNCIONARIO ( CPF = CPF_GERENTE ) DEPARTAMENTO

DNOME, UNOME, PNOME ( DEP_GER ) A operao JUNO tambm pode ser expressa por uma operao de PRODUTO CARTESIANO, seguida de um operador de SELEO, gerando o mesmo resultado final, da seguinte forma: FUNC_DEP FUNCIONARIO X DEPARTAMENTO RESULTADO s CPF=CPF_GERENTE (FUNC_DEP) Atualmente, existem duas variaes de JUNES, que so EQUIJUNO e JUNO NATURAL. Na EQUIJUNO, que considerada a mais comum (tanto que os exemplos descritos acima foram utilizados a EQUIJUNO), utilizada como operador de juno a igualdade (sinal de = ), neste caso sempre teremos um resultado menor ou igual as relaes de origem, em que tuplas nas quais os atributos comparados devem ser obrigatoriamente idnticos em ambas relaes. A JUNO NATURAL, que indicada pelo smbolo * na lgebra relacional, usada, essencialmente, para eliminar a necessidade de informar quais atributos sero os utilizados na combinao, ou seja, espera-se que em ambas as relaes utilizadas na JUNO NATURAL tenham o mesmo nome nos atributos que sero relacionados. Como exemplo de JUNO NATURAL, podemos efetuar uma combinao das relaes PROJETO e DEPARTAMENTO, porm para que haja a juno natural das duas relaes, ser necessrio renomear o atributo DNUMERO para DNUM da relao DEPARTAMENTO, para ento a juno natural ocorrer. DEP r DNOME, DNUM, CPF_GERENTE, DATA_INICIO_GERENTE (DEPARTAMENTO) PROJETO_DEP PROJETO * DEP 109
www.metodista.br/ead

DIVISO
A operao DIVISO um operador til em algumas necessidades especficas em um relacionamento entre duas relaes em um banco de dados. Na lgebra relacional indicado seu smbolo de notao , da seguinte forma: RS Um exemplo desta operao seria analisarmos duas relaes ESTOQUE e PREOS abaixo: ESTOQUE PRODUTO 1000 1000 1000 2000 PREO R$ 10,00 R$ 5,00 R$ 2,50 R$ 5,00 PREO PREO R$ 10,00 R$ 5,00 R$ 2,50

RESULTADO ESTOQUE PREO Efetuando a operao de diviso acima, o resultado apresentado ser o atributo PRODUTO da relao ESTOQUE que contenha todos seus os preos existentes da tabela PREOS. RESULTADO PRODUTO 1000

FUNO DE AGREGAO
Em um banco de dados existem algumas funes de agregao matemtica que so muito teis para alguns tipos de anlises. So operadores que devem ser aplicados sobre um grupo de tuplas em uma relao. Por exemplo, caso seja necessrio recuperar uma mdia salarial de um departamento especfico ou at mesmo saber a quantidade de funcionrios na empresa, so caractersticas em que se torna necessria a utilizao deste tipo de funo. Por padro, atualmente existem cinco tipos de funes de agregaes: Soma Contar Mdia Mximo Mnimo Estas funes so representadas na lgebra relacional pelo smbolo grego (gama). Da seguinte forma: <atributos de agrupamento> <lista de funes> (R) Onde: <atributos de agrupamento> - so os atributos da relao R que deseja-se agrupar. <lista de funes> - so as funes que devem ser aplicadas nos atributos da relao R, no formato <funo>( <atributo>). 110
Universidade Metodista de So Paulo

Um exemplo da aplicao destas funes de agregao seria apresentar a quantidade de funcionrios e a mdia salarial para cada departamento. RESULTADO DNR CONTA(CPF), MDIA(SALARIO) (FUNCIONARIO) RESULTADO DNR 5 4 1 CONTA_CPF 4 3 1 MDIA_SALARIO 33.250,00 31.000,00 55.000,00

Caso no seja informado nenhum atributo de agrupamento, a operao ir considerar todos os registros existentes na relao, e o resultado ser de apenas uma nica linha, conforme abaixo: RESULTADO CONTA(CPF), MDIA(SALARIO) (FUNCIONARIO) RESULTADO CONTA_CPF 8 MDIA_SALARIO 35.125,00

JUNO EXTERNA (OUTER JOIN)


Outro operador utilizado a JUNO EXTERNA, que uma extenso da JUNO que foi descrita anteriormente. Em uma operao de JUNO INTERNA compreendem a combinao de duas relaes satisfazendo uma condio de juno, ou seja, todas as tuplas que no possurem uma tupla correspondente sero descartadas, o mesmo ocorre com tuplas que possuam valores nulos. No caso da JUNO EXTERNA, alm das condies que satisfazem a condio de juno, devem tambm levar em considerao aquelas tuplas que podem no corresponder condio de juno. Neste caso, devem ser utilizados operadores especficos para determinar qual relao deve ser considerada como principal (que trar todas as ocorrncias existentes) e qual ser a secundria (que pode trazer tuplas sem correspondncia).

JUNO EXTERNA A ESQUERDA (LEFT OUTER JOIN)


Nas junes externas, uma das possibilidades a JUNO EXTERNA A ESQUERDA. So representa, em que voc define que a relao principal ser a da ESdas pela lgebra relacional pelo smbolo QUERDA, ou seja, ser recuperada cada tupla desta relao e ento ser combinada com a outra relao, apresentando os valores correspondentes e para os casos que no houver correspondncia com a tabela da esquerda, sero apresentados valores nulos (NULL). Por exemplo, caso seja necessrio apresentar os nomes dos funcionrios e o nome do departamento que eles gerenciam (se por acaso gerenciarem algum), seria da seguinte forma: TEMP FUNCIONARIO ( CPF = CPF_GERENTE ) DEPARTAMENTO PNOME, UNOME, DNOME ( TEMP )

JUNO EXTERNA A DIREITA (RIGHT OUTER JOIN)


Nas junes externas, outra possibilidade a JUNO EXTERNA A DIREITA. So representadas pela , em que voc define que a relao principal ser a da DIREITA, ou lgebra relacional pelo smbolo seja, ser recuperada cada tupla desta relao e ento ser combinada com a outra relao, apresentan111
www.metodista.br/ead

do os valores correspondentes e para os casos que no houver correspondncia com a tabela da direita, sero apresentados valores nulos (NULL).

JUNO EXTERNA COMPLETA (FULL OUTER JOIN)


Nas junes externas, uma terceira possibilidade a JUNO EXTERNA COMPLETA. So represen. Sero mantidas todas as ocorrncias das tabelas da tadas pela lgebra relacional pelo smbolo ESQUERDA e tambm sero mantidas todas as ocorrncias da tabela da DIREITA, e para os casos que as correspondncias entre elas no existirem ser apresentado valores nulos (NULL). AVISO: Abaixo entraremos em uma parte do material que possui uma linguagem tcnica para banco de dados. Como sabemos que existem no mercado diversos fabricantes de sistemas de banco de dados, nosso curso focar nos produtos da empresa Oracle Inc. que, de acordo com pesquisas realizadas pelo corpo docente da Universidade, acreditam que os aplicativos desenvolvidos por esta empresa so muito bem aceitos pela maioria das empresas e seria de grande valia o ensinamento desta ferramenta na nossa grade curricular. DICA: Para prosseguir com este estudo, sugerimos a instalao de um sistema gerenciador de banco de dados gratuito, oferecido pela Oracle Inc. para pequenas empresas ou para pessoas com intuito educativo, chamado Oracle Database Express Edition, que pode ser baixado no seguinte endereo: http://www.oracle.com/technetwork/products/express-edition/downloads/index.html Na pgina que abrir, escolha a opo de Aceitar o Acordo de Licena, clique sobre o hiperlink para baixar a verso do Oracle Database Express Edition exclusivo para o sistema operacional que voc ir realizar a instalao: Windows ou Linux.

Figura 1 Pgina da Oracle Inc. exclusiva aos produtos Oracle Database Express Edition

112
Universidade Metodista de So Paulo

Mais abaixo na mesma pgina, voc encontrar outros produtos relacionados, que podem ser muito teis para seu aprendizado, que so: Oracle SQL Developer: Esta ferramenta a que permite o fcil acesso ao banco de dados Oracle e prov toda a facilidade para um ambiente de desenvolvimento voltado para Banco de Dados. Oracle SQL Developer Data Modeler: Esta ferramenta muito til para quem precisa fazer a Modelagem Conceitual (Modelagem Entidade-Relacionamento), Modelagem Lgica e at mesmo gerar seus scripts de Modelo Fsico com grande facilidade. Na mesma pgina, encontrada toda a documentao sobre instalao e utilizao de todos os produtos disponibilizados, alm de fruns de discusso e compartilhamento de informaes sobre os produtos Oracle, associe-se e faa parte de uma comunidade que cresce a cada dia.

IntrodUo ao SQL (STRucTuREd QuERY LaNGuaGE)


O SQL (Structured Query Language) ou Linguagem de Consulta Estruturada uma linguagem de pesquisa declarativa para bancos de dados relacionais. Sua origem , principalmente, da lgebra relacional, que vimos acima. A origem da linguagem foi por volta da dcada de 1970, em que a IBM de San Jos, nos Estados Unidos, tinha como objetivo demonstrar a viabilidade do modelo relacional proposto por Edgar Frank Codd. Inicialmente, a linguagem era conhecida como SEQUEL (Structured English Query Language). Hoje em dia, o SQL considerado um padro para todos os bancos de dados comerciais. Por ser uma linguagem declarativa, de simples entendimento para pessoas que resolvem aprender como consultar informaes em bancos de dados. Como a IBM foi a criadora da linguagem, rapidamente comearam a surgir variaes da linguagem no mercado, o que ocasionou a necessidade de se adaptar e criar uma padronizao para a linguagem. Neste sentido, houve a necessidade de padronizar os conceitos da linguagem, ento a American National Standards Institute (ANSI), no ano de 1986, e a ISO (International Organization for Standardization), em 1987, criaram a primeira reviso chamada SQL-86 ou SQL1. Logo em seguida, no ano de 1992, houve uma reviso dos padres e foi definido a ANSI-92 (tambm chamado de SQL-92 ou SQL2). Houveram novas revises em 1999 (SQL:1999 ou SQL3), depois em 2003 (SQL:2003) e em 2006 (SQL:2006), que inclui recursos de XML. Embora padronizadas pela ANSI e ISO, ainda possvel encontrar em alguns bancos de dados de mercado algumas similaridades e peculiaridades entre elas. A linguagem SQL foi, inicialmente, dividida em alguns grupos: LINGUAGEM DE RECUPERAO DE DADOS: SELECT; LINGUAGEM DE MANIPULAO DE DADOS: INSERT, UPDATE, DELETE; LINGUAGEM DE CONTROLE DE TRANSAES: COMMIT, ROLLBACK, SAVEPOINT; LINGUAGEM DE DEFINIO DE DADOS: CREATE, ALTER, RENAME, DROP, TRUNCATE; LINGUAGEM DE CONTROLE DE DADOS: GRANT, REVOKE. A seguir, entraremos no detalhe de cada um dos grupos descritos.

LINGUAGEM DE RECUPERAO DE DADOS


Neste grupo de instrues, o SELECT o principal comando que seguido de diversas clusulas e operadores, possibilitando ao usurio elaborar das consultas mais simples at mesmo as mais complexas.

113
www.metodista.br/ead

Clusulas: So condies de modificao utilizadas na definio dos dados ao qual se deseja selecionar ou modificar em uma consulta. Podem ser utilizadas as seguintes clusulas abaixo: SELECT o ponto de partida de uma consulta (query) para retornar registros de uma tabela, nela voc pode especificar o nome das colunas desejadas ou simplesmente escolher o * (asterisco) para retornar todas as colunas existentes da tabela ou tabelas que estiver sendo consultada. Ex. SELECT * FROM TAB_EMPREGADOS; Ou tambm, escolhendo as colunas desejadas... SELECT DEPARTAMENTO, NOME, SALARIO

FROM TAB_EMPREGADOS; possvel fazer clculos e renomear colunas... SELECT DEPARTAMENTO, NOME, SALARIO AS SALARIO_DO_MES, (SALARIO * 12) AS SALARIO TOTAL NO ANO

FROM TAB_EMPREGADOS; possvel agrupar mais do que uma coluna em uma s coluna, concatenando-as pelo caractere || (duplo pipe). SELECT DEPARTAMENTO, NOME || || SOBRENOME AS NOME_INTEIRO, SALARIO

FROM TAB_EMPREGADOS; FROM utilizada para especificar qual a tabela que ser utilizada para selecionar os registros; Ex.: SELECT NOME, SOBRENOME FROM TAB_EMPREGADOS;

WHERE utilizada para especificar quais sero as condies que devem ser atendidas para retornar registros de uma ou mais tabelas; Ex.: 114
Universidade Metodista de So Paulo

SELECT NOME, SOBRENOME FROM TAB_EMPREGADOS WHERE NOME = JOO;

GROUP BY utilizada para separar os registros selecionados em grupos especficos, normalmente utilizado em conjunto de funes de agregao: o AVG() retorna a mdia dos valores de um campo selecionado. o COUNT() retorna o nmero de registros de um campo selecionado. o MAX() retorna o maior valor dos registros de um campo selecionado. o MIN() retorna o menor valor dos registros de um campo selecionado. o SUM() retorna a soma de todos os valores de um campo selecionado. Ex.: SELECT DEPARTAMENTO, SUM(SALARIO)

FROM TAB_EMPREGADOS GROUP BY DEPARTAMENTO; HAVING utilizada para expressar uma condio que deve ser satisfeita em cada grupo, deve ser sempre utilizado na condio HAVING campos agregadores. Ex.: SELECT DEPARTAMENTO, SUM(SALARIO)

FROM TAB_EMPREGADOS GROUP BY DEPARTAMENTO HAVING SUM(SALARIO) > 1000; ORDER BY utilizada para ordenar os registros selecionados com uma ordem alfabtica (ASC ascendente) ou em ordem contrria a alfabtica (DESC descendente). Por padro, caso no seja informada qual a ordem desejada, implicitamente selecionado o formato ascendente. possvel incluir mais do que uma coluna na ordenao da consulta separada devidamente por vrgula. Ex.: SELECT NOME FROM TAB_EMPREGADOS ORDER BY NOME DESC; DISTINCT utilizado para selecionar dados, porm sem repeti-los. Ex.: SELECT DISTINCT DEPARTAMENTO FROM TAB_EMPREGADOS; Operadores Lgicos: So operadores que utilizam de lgica matemtica para considerar duas ou mais condies atravs de valores lgicos implcitos: VERDADE ou FALSO. So eles: AND E lgico, avalia duas condies e retorna um valor desejado caso ambas as condies sejam consideradas VERDADEIRA; Ex.: SELECT NOME FROM TAB_EMPREGADOS WHERE NOME = MARIA AND SALARIO > 1000; 115
www.metodista.br/ead

OR OU lgico, avalia duas condies e retorna um valor desejado caso apenas alguma das duas condies seja considerada VERDADEIRA; Ex.: SELECT NOME FROM TAB_EMPREGADOS WHERE NOME = MARIA OR NOME = JOO;

NOT Negao lgica, avalia qualquer condio, e retorna o valor contrrio da expresso. Ex.: SELECT NOME FROM TAB_EMPREGADOS WHERE NOT (NOME = MARIA OR NOME = JOO); Operadores Relacionais: So operadores utilizados principalmente para comparar valores entre colunas e atravs de estruturas de controle. Os operadores existentes so: Operador < > <= >= = <> Ex.: Descrio Menor Maior Menor ou igual Maior ou igual Igual Diferente SELECT DEPARTAMENTO, NOME, SALARIO

FROM TAB_EMPREGADOS WHERE SALARIO >= 1000 AND DEPARTAMENTO = FINANCEIRO;

BETWEEN [...] AND [...] um operador relacional utilizado especialmente para especificar um intervalo de valores. Ex.: SELECT DEPARTAMENTO, NOME, SALARIO

FROM TAB_EMPREGADOS WHERE SALARIO BETWEEN 1000 AND 2500; LIKE um operador relacional que utilizado na comparao de um modelo e para especificar registros de um banco de dados. utilizado, especificamente, em colunas do tipo TEXTO, em que possvel utilizar caracteres curingas que so: 116
Universidade Metodista de So Paulo

o % (percentual): utilizado para substituir um conjunto de caracteres e o banco de dados retornar qualquer observao que satisfaa a condio Ex.: SELECT NOME, SALARIO FROM TAB_EMPREGADOS WHERE NOME LIKE %CARLOS%; (obs.: neste exemplo, qualquer nome que exista na coluna referenciada que possua CARLOS em qualquer posio ser retornado na consulta, por exemplo: JOO CARLOS, JOS CARLOS, CARLOS AUGUSTO, CARLOS EDUARDO, JOS CARLOS DA SILVA, etc.). o _ (underline): utilizado para substituir um caractere desejado, sendo retornado qualquer valor que esteja posicionado sobre esta posio. Ex.: SELECT NOME,

SALARIO FROM TAB_EMPREGADOS WHERE NOME LIKE JOS_; (obs.: neste exemplo, ser retornado qualquer registro que contenha 4 caracteres, em que os trs primeiros sejam JOS e o ltimo seja qualquer caractere: JOS, JOSE, etc.). IN um operador relacional utilizado para recuperar registros que estejam em uma lista. Ex.: SELECT NOME, SALARIO

FROM TAB_EMPREGADOS WHERE NOME IN (JOSE,CARLOS,MARIA); IS NULL um operador lgico que avalia o contedo da coluna e retorna os registros que estiverem com valores no informados, ou seja, nulos. Este operador tambm pode ser utilizado em forma de negao (IS NOT NULL). Ex.: SELECT NOME

FROM TAB_EMPREGADOS WHERE NOME IS NULL; JOIN: Outra possibilidade na linguagem SELECT relacionar informaes de diversas tabelas no mesmo comando de recuperao de registros. Este tipo de operao chamado de JOIN e, para que haja uma relao correta, deve possuir colunas que sejam similares para que um join acontea. Quando isto no for possvel e uma condio de join for omitida um Produto Cartesiano pode ocorrer. 117
www.metodista.br/ead

Considere as trs tabelas abaixo para consolidar os conceitos de JOIN. TAB_EMPREGADOS


NOME SUSANA RAUL JOO BARBARA ALAN JIMENES EMANUEL DEPART_ID 10 10 20 30 30 40 50

TAB_DEPARTAMENTO
DEPART_ID 10 20 30 40 50 DEPART_NOME COMPRAS VENDAS COMERCIAL FINANCEIRO RH LOCAL_ID 100 150 200 250 300

TAB_LOCAL
LOCAL_ID LOCAL_NOME 100 150 200 250 300 SO PAULO ABCD RIO DE JANEIRO NITERI CURITIBA

Para unirmos atravs de um comando SELECT os contedos das trs tabelas acima, o comando SQL seria abaixo: SELECT A.NOME, A.DEPART_ID, B.DEPART_ID, B.DEPART_NOME, B.LOCAL_ID, C.LOCAL_ID, C.LOCAL_NOME TAB_DEPARTAMENTO B, TAB_LOCAL C AND B.LOCAL_ID = C.LOCAL_ID;

FROM TAB_EMPREGADOS A,

WHERE A.DEPART_ID = B.DEPART_ID Repare acima que os caracteres que foram destacados na cor amarela foram atribudos para cada tabela um qualificador para ajudar a diferenciar os nomes de colunas que so iguais, porm que estejam em tabelas diferentes por meio de um prefixo para melhorar o desempenho, pois facilita ao gerenciador de banco de dados a encontrar mais rpido as caractersticas de cada campo em cada tabela que for utilizada em uma consulta. Existem vrias variantes para construo da clusula JOIN: INNER JOIN somente os registros que fazem match. Tem o mesmo efeito que igualar os campos de ambas as tabelas na clusula WHERE. LEFT OUTER JOIN alm dos registros que fazem match, os registros da tabela esquerda que no existam na direita tambm aparecem. RIGHT OUTER JOIN alm dos registros que fazem match, aparecem todos os registros restantes da tabela direita que no existam na esquerda. FULL OUTER JOIN aparecem todos os registros independentemente de fazerem ou no match.

118
Universidade Metodista de So Paulo

Outra forma de relacionar tabelas, porm referenciando o tipo e a condio do join diretamente na clusula FROM, deixando a clusula WHERE apenas para uma condio de filtro, o exemplo ficaria da seguinte forma abaixo: SELECT A.NOME, A.DEPART_ID, B.DEPART_ID, B.DEPART_NOME, B.LOCAL_ID, C.LOCAL_ID, C.LOCAL_NOME INNER JOIN TAB_DEPARTAMENTO B ON (A.DEPART_ID = B.DEPART_ID) INNER JOIN TAB_LOCAL C ON (B.LOCAL_ID = C.LOCAL_ID)

FROM TAB_EMPREGADOS A

Por que encontramos o INNER ou OUTER na sintaxe de um JOIN? Tem foco apenas sistemtico para permitir melhor compreenso da construo da juno. Na sintaxe SQL:1999 (ANSI), a juno de duas tabelas que retorna apenas linhas correspondentes uma juno interna (INNER). Uma juno entre duas tabelas que retorna os resultados da juno interna assim como linhas no correspondentes em tabelas esquerdas (ou direitas) uma juno externa esquerda (ou direita). Uma juno entre duas tabelas que retorna os resultados de uma juno interna assim como os resultados de uma juno esquerda ou direita uma juno externa (OUTER) completa. Opcionalmente pode ser omitida a palavra INNER ou OUTER na construo das clusulas. Ex.1: Ex.2: SELECT A.NOME, A.DEPART_ID, B.DEPART_ID, B.DEPART_NOME, 119
www.metodista.br/ead

SELECT A.NOME, A.DEPART_ID, B.DEPART_ID, B.DEPART_NOME, B.LOCAL_ID LEFT OUTER JOIN TAB_DEPARTAMENTO B

FROM TAB_EMPREGADOS A ON (A.DEPART_ID = B.DEPART_ID);

B.LOCAL_ID RIGHT OUTER JOIN TAB_DEPARTAMENTO B

FROM TAB_EMPREGADOS A ON (A.DEPART_ID = B.DEPART_ID); Ex.3: SELECT A.NOME, A.DEPART_ID, B.DEPART_ID, B.DEPART_NOME, B.LOCAL_ID FULL OUTER JOIN TAB_DEPARTAMENTO B

FROM TAB_EMPREGADOS A ON (A.DEPART_ID = B.DEPART_ID);

LINGUAGEM DE MANIPULAO DE DADOS


Neste grupo de instrues, so realizadas manipulaes lgicas no nvel de registros, por meio de inseres, alteraes ou remoes de linhas de uma tabela. INSERT o comando responsvel pela incluso de novas linhas em uma tabela especfica, ela pode ser escrita de duas formas: o Passando valores desejados: Neste caso, deve ser escrito um comando para cada linha que desejar incluir na tabela. Pode, opcionalmente, no informar os nomes das colunas da tabela. Ex.: INSERT INTO TAB_EMPREGADOS (ID, NOME, SOBRENOME, DEPARTAMENTO, SALARIO) VALUES ( 1, LUIZ, DA SILVA, COMERCIAL, 2500 ); o Copiando registros de outra tabela: atravs de uma consulta a outra tabela, esta deve possuir os mesmos tipos de dados da tabela ao qual estiver querendo inserir os registros, no necessrio utilizar a palavra VALUES. Ex.: INSERT INTO TAB_NOMES (NOME, SOBRENOME) SELECT NOME, SOBRENOME FROM TAB_EMPREGADOS WHERE NOME IS NOT NULL AND SOBRENOME IS NOT NULL; UPDATE o comando utilizado para modificar caractersticas de uma ou vrias colunas dos registros que j estejam armazenados em alguma tabela. Deve sempre vir acompanhada de alguma condio para delimitar a quantidade de registros que ser alterada com a condio WHERE. 120
Universidade Metodista de So Paulo

Ex.:

UPDATE TAB_EMPREGADOS

SET NOME = JORGE; (obs.: Neste exemplo, por ter sido omitido a clusula WHERE, o comando alterar todos os registros existentes para o mesmo valor JORGE, podendo ocasionar um grande erro, perdendo informaes importantes, CUIDADO!). Ex.: UPDATE TAB_EMPREGADOS SET NOME = JORGE WHERE NOME = JOAO;

(obs.: Neste exemplo, por estar com a clusula WHERE, o comando alterar apenas os registros existentes na tabela na coluna NOME que estiver preenchido com a palavra JOAO, passar a ser JORGE). DELETE o comando responsvel por excluir registros de uma tabela, tambm deve sempre vir acompanhado com uma condio para delimitar a quantidade de registros a ser removido, com a clusula WHERE. Ex.: DELETE FROM TAB_EMPREGADOS;

(obs.: Neste exemplo, por ter sido omitido a clusula WHERE, o comando excluir todos os registros existentes na tabela TAB_EMPREGADOS, podendo ocasionar um grande erro, perdendo informaes importantes, CUIDADO!). Ex.: DELETE FROM TAB_EMPREGADOS WHERE NOME = JOAO;

(obs.: Neste exemplo, por estar com a clusula WHERE, o comando excluir apenas os registros existentes na tabela em que a coluna NOME estiver preenchida com a palavra JOAO).

LINGUAGEM DE CONTROLE DE TRANSAES


Neste grupo de instrues, so utilizados alguns comandos que garantem o controle das transaes. Implicitamente, quando h uma conexo com algum banco de dados e uma sesso iniciada, um incio de uma transao declarado (BEGIN TRANSACTION ou START TRANSACTION dependendo do banco de dados utilizado) e esta transao somente concluda quando o comando COMMIT ou um ROLLBACK so declarados. O comando COMMIT registra permanentemente no banco de dados toda e qualquer alterao realizada at aquele momento, sem poder recuperar em caso de algum erro. Instrues de Definio de Dados (DDL) e de Controle de Dados (DCL) o COMMIT automtico, ou seja, a alterao efetivada automaticamente. Enquanto a transao estiver ocorrendo em uma sesso de um usurio especfica, toda e qualquer alterao visvel apenas ao usurio, at o momento que ele efetive a alterao com um comando COMMIT, assim todos os outros usurios podero ver as alteraes que foram realizadas.

121
www.metodista.br/ead

Um exemplo mostrado abaixo representa um intervalo de tempo de uma transao, e um conjunto de instrues sendo executadas, representando a utilizao dos comandos COMMIT, ROLLBACK e SAVEPOINT.

Figura 2 Exemplo de uma transao em um banco de dados

Quando declarado um SAVEPOINT [apelido], voc cria pontos de restaurao lgicos, que a qualquer necessidade pode ser invocado um ROLLBACK TO SAVEPOINT [apelido] para ser recuperada qualquer operao que tenha sido realizada at ela, recuperando falhas que possam ter ocorrido, porm caso seja declarado o comando COMMIT, automaticamente todos os SAVEPOINT criados so liberados da memria do servidor.

Figura 3 Exemplo de um comando COMMIT sendo executado

Caso seja executado o comando ROLLBACK e no for informado um SAVEPOINT, automaticamente retornado at o ltimo COMMIT realizado, ou simplesmente at o incio da transao.

Figura 4 Exemplo de um comando ROLLBACK sendo executado

122
Universidade Metodista de So Paulo

Porm, quando realizada uma operao que modifique algum objeto ou registro e desejar armazenar um ponto de restaurao, deve ser utilizado o comando: SAVEPOINT [apelido]; e a qualquer necessidade ser restaurados os dados at este ponto, pode se chamar o comando: ROLLBACK TO SAVEPOINT [apelido];

Figura 5 Exemplo de um comando ROLLBACK TO SAVEPOINT sendo executado

LINGUAGEM DE DEFINIO DE DADOS


Neste grupo de instrues so utilizados comandos que manipulam objetos dentro de um banco de dados. Estes objetos so principalmente TABELAS, mas podem ser outros tipos de objetos como: vises, triggers, sinnimos, sequncia, etc. Para realizar a definio de dados em objetos, h 3 comandos bsicos: CREATE utilizado para criar novos objetos, principalmente tabelas no banco de dados. Em um banco de dados, os domnios ou, melhor dizendo, os tipos de dados existentes para serem declarados para uma coluna na definio de uma tabela pode variar. Abaixo est o exemplo dos tipos de dados utilizados pelo banco de dados Oracle.

Figura 6. Exemplo de Datatypes em Banco de Dados Oracle, consultar documentao do fabricante para maiores detalhes de como utiliz-los.

123
www.metodista.br/ead

Para especificar a criao de uma tabela, o princpio do comando CREATE est abaixo: CREATE TABLE [nome da tabela] ( [nome coluna1] [tipo de dados coluna1] [restrio coluna1], [nome coluna2] [tipo de dados coluna2] [restrio coluna2], [nome coluna3] [tipo de dados coluna3] [restrio coluna3], ... [nome colunaN] [tipo de dados colunaN] [restrio colunaN], [restrio1 da tabela], [restrio2 da tabela], ... [restrioN da tabela] ); Abaixo, ser apresentado o exemplo real do comando de criao de uma tabela: CREATE TABLE TAB_EMPREGADOS ( ID NUMBER(5), NOME SOBRENOME DEPARTAMENTO SALARIO VARCHAR2(50) NOT NULL, VARCHAR2(50) NOT NULL, VARCHAR2(25), NUMBER(6,2),

CONSTRAINT pk_id_empregado PRIMARY KEY (ID), CONSTRAINT ck_salario_maior_zero CHECK (SALARIO > 0), CONSTRAINT ck_salario_anual CHECK ( (SALARIO * 12) < 100000 ) CONSTRAINT nn_departamento CHECK ( DEPARTAMENTO IS NOT NULL) CONSTRAINT fk_departamento FOREIGN KEY (DEPARTAMENTO) REFERENCES TAB_DEPARTAMENTO(DEPTO_NOME) ) Obs.: Vimos acima que aps a declarao das colunas, em alguns casos, foram definidas restries j aps a definio da coluna, porm h tambm uma srie de restries que foram definidas no mbito da tabela como um todo. Tambm possvel criar uma tabela com o resultado de um comando SELECT, porm neste caso a definio dos tipos de dados das colunas ser o mesmo tipo dos dados das colunas recuperadas pelo comando de seleo. 124
Universidade Metodista de So Paulo

Ex.: AS

CREATE TABLE TAB_NOMES

SELECT DISTINCT NOME FROM TAB_EMPREGADOS WHERE NOME IS NOT NULL; ALTER comando utilizado para alterar alguma caracterstica de alguma coluna como o tipo de dados, adicionarem novas colunas, remover colunas, alm de adicionar, alterar ou remover restries (CONSTRAINTS) de uma tabela. Ex.: ALTER TABLE TAB_EMPREGADOS

ADD SEXO CHAR(1) NOT NULL; (obs.: adiciona a coluna SEXO a tabela, com tipo de dados CHAR(1) e no sendo possvel armazenar registros nulos nesta coluna). ALTER TABLE TAB_EMPREGADOS MODIFY SOBRENOME VARCHAR2(100); (obs.: altera a coluna SOBRENOME da tabela, modificando o tipo de dados de VARCHAR2(50) para VARCHAR2(100) e permitindo registros nulos nesta coluna). ALTER TABLE TAB_EMPREGADOS DROP COLUMN SALARIO; (obs.: exclui a coluna SALARIO da tabela). ALTER TABLE TAB_EMPREGADOS DROP CONSTRAINT nn_departamento; (obs.: exclui a restrio nn_departamento da tabela, agora permitindo que coluna departamento sejam armazenados registros nulos). RENAME o comando utilizado para renomear um objeto, ou tabela, conforme uma necessidade no banco de dados. Ex.: RENAME TAB_EMPREGADOS TO TAB_FUNCIONARIOS;

DROP o comando utilizado para remover do banco de dados toda a informao sobre a tabela (e no apenas os dados). Ex.: DROP TABLE TAB_EMPREGADO;

(obs.: exclui a tabela TAB_EMPREGADOS do banco de dados, a tabela deixa de existir e tambm todo o seu contedo). 125
www.metodista.br/ead

DROP TABLE TAB_EMPREGADOS CASCADE CONSTRAINTS; (obs.: ao excluir a tabela TAB_EMPREGADOS, caso exista restries que referenciam outra tabela no banco de dados, o comando CASCADE CONSTRAINTS deve ser referenciado, o que ir remover todas as referncias das tabelas com a tabela TAB_EMPREGADOS que ainda existirem em outras tabelas). TRUNCATE o comando utilizado para apagar o contedo, ou seja, apagar todos os registros da tabela; a tabela ainda continua existindo no banco de dados, porm todos os registros que nela haviam sero excludos permanentemente. Ex.: TRUNCATE TAB_EMPREGADOS;

(obs.: Este comando tem a mesma funcionalidade do DELETE FROM TAB_EMPREGADOS, sem utilizar o comando WHERE, ou seja, os dois eliminam todo o contedo da tabela, porm o comando TRUNCATE muito mais rpido do que o DELETE, pois se trata de um comando DDL que ataca diretamente a estrutura da tabela, e no os dados como feito em um comando DML como o DELETE).

LINGUAGEM DE CONTROLE DE DADOS


Neste grupo de instrues so utilizados comandos que controlam o acesso aos dados a determinados grupos ou usurios especficos. Este tipo de comando utilizado por Administradores de Bancos de Dados (ou tambm conhecidos como DBA-DataBase Administrators), que so os responsveis por garantir a segurana da informao. Em um banco de dados, h dois nveis de segurana: Segurana do Sistema Segurana dos Dados Entre os privilgios que so concedidos pelo administrador esto: Privilgio de Sistema: permite conceder ou revogar acesso a usurios dentro do sistema de banco de dados Privilgio de Objetos: permite conceder ou revogar acesso a usurios manipularem contedos dos objetos em um banco de dados que podem ser: adicionar colunas em uma tabela, criar uma nova viso (View), criar procedimentos (Procedures), gatilhos (Triggers), etc. Privilgio de Esquemas: permite conceder ou revogar acesso a visualizar e consultar colees de objetos como tabelas, views e sequncias no banco de dados. Em um banco de dados pode haver mais de 100 tipos de privilgios existentes que possam ser utilizados pelos seus administradores. Os principais comandos de controle de acesso no banco de dados so: GRANT o comando que concede qualquer direito a usurios sobre algum objeto no banco de dados; REVOKE o comando que remove qualquer direito a usurios sobre algum objeto no banco de dados. Um Administrador de Banco de Dados, primeiramente, deve criar usurios que interagiro com o sistema de banco de dados, por meio do comando abaixo: CREATE USER [nome do usurio] IDENTIFIED BY [senha do usurio]; 126
Universidade Metodista de So Paulo

Ex.

CREATE USER LEONARDO

IDENTIFIED BY SENHAincial123; Para iniciar uma concesso de direitos, aps ter um usurio definido, o administrador pode permitir direitos que este usurio ter ao acessar o sistema de banco de dados utilizando o comando GRANT, da seguinte forma: GRANT [direitos] ON [objeto] TO [usurio] WITH GRANT OPTION; Os Tipos de Diretos do GRANT acima podem ser: SELECT permite a leitura dos dados; INSERT permite inserir novos dados; UPDATE permite atualizar dados; DELETE permite remover dados; ALL permite todos os direitos referidos acima; EXECUTE permite executar stored procedures; WITH GRANT OPTION permite que usurios concedam direitos que recebeu a outros usurios. Ex. GRANT INSERT, DELETE ON TAB_EMPREGADOS

TO LEONARDO; GRANT ALL ON TAB_EMPREGADOS TO DURVAL, NISFLEI;

GRANT EXECUTE ON PROCEDURE SP_INSERE_EMP_1 TO DURVAL, NISFLEI, LEONARDO;

Ao contrrio do que foi apresentado acima, para que sejam removidos os direitos que j foram concedidos, o comando a ser utilizado o REVOKE, conforme abaixo: REVOKE [direitos] ON [objeto] FROM [usurio]; Os Tipos de Diretos do REVOKE acima podem ser: 127
www.metodista.br/ead

SELECT permite a leitura dos dados; INSERT permite inserir novos dados; UPDATE permite atualizar dados; DELETE permite remover dados; ALL permite todos os direitos referidos acima; EXECUTE permite executar stored procedures; Obs.: Somente o usurio que concedeu o direito que pode revog-lo, caso contrrio, apenas o usurio com perfil de administrador ter este direito. Ex. REVOKE INSERT, DELETE ON TAB_EMPREGADOS

FROM LEONARDO; REVOKE ALL ON TAB_EMPREGADOS FROM DURVAL, NISFLEI;

REVOKE EXECUTE ON PROCEDURE SP_INSERE_EMP_1 FROM DURVAL, NISFLEI, LEONARDO;

O banco de dados Oracle possui, conforme a imagem abaixo, os seguintes direitos que podem ser concedidos ou revogados.

Figura 7 Tipos de Direitos existentes no banco de dados Oracle

Em um banco de dados possvel facilitar a manuteno de direitos a um grupo de usurios com funes similares, desta forma, utilizado o conceito de trabalhar com ROLES, que so como grupos de usurios, que tambm podem receber direitos especficos, e ento usurios serem atribudos a estes ROLES, herdando automaticamente todas as permisses do grupo.

128
Universidade Metodista de So Paulo

Criando uma ROLE: Ex. CREATE ROLE GERENTES;

Atribuindo privilgios a uma ROLE criada: Ex. GRANT CREATE TABLE, CREATE VIEW TO GERENTES; Conceder uma ROLE a um ou vrios usurios: Ex. GRANT GERENTES TO DURVAL, LEONARDO;

Para gerenciar os privilgios concedidos no sistema de banco de dados, o Oracle armazena todos e quaisquer direitos em algumas tabelas de estruturas, chamadas de DICIONARIO DE DADOS, que podem ser consultados da mesma forma que se consulta uma tabela comum; as tabelas que armazenam tais informaes so as listadas na figura abaixo.

Figura 8. Lista de tabelas do Dicionrio de Dados do Oracle em que todos os direitos que foram concedidos so armazenados

129
www.metodista.br/ead

_________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________
130
Universidade Metodista de So Paulo

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________

Organizao de Dados

Organizao de Dados I
Professora Dra. Silvia Brunini

Mdulo

Apresentar algumas das estruturas de dados mais comuns; Capacitar o aluno a usar as estruturas estticas para resoluo de problemas.

Objetivos:

Estrutura de Dados; Listas; Vetores; Arrays.

Palavras-chave:

www.metodista.br/ead

Tudo o que um homem pode imaginar, outros homens podero realizar. Jlio Verne At o presente momento, voc aprendeu a trabalhar com dados primitivos (inteiros, reais, booleanos e, talvez, caracteres) ou com estrutura de dado simples (classe, como exemplos: String, Pessoa, Aluno, Carro, Figuras, etc.). Com o auxlio deste tipo de dados possvel resolver problemas como: Faa um programa que leia trs valores e imprima o maior deles, ou, Joo, Pedro e Adauto foram se pesar numa farmcia, qual deles o mais magro? Nessa mesma linha poderamos perguntar quem o mais baixo da figura abaixo (Figura 1):

Figura 1 - Escolher quem o mais baixo num pequeno grupo de pessoas

A soluo computacional deste problema envolveria detalhar uma classe cujos atributos seriam os nomes e as alturas dos personagens. Para ajudar um mtodo compararAlturas(), que retorna -1 se o objeto que chama o mtodo mais baixo que o outro personagem, 0 se ambos tem a mesma altura e 1 se o primeiro mais alto que o outro. Da seria necessrio criar o programa principal que mostraria o nome do personagem mais baixo. Fcil no mesmo? Mas, para assegurar que voc entendeu, abaixo est a listagem do programa.

132
Universidade Metodista de So Paulo

Listagem 1 - Projeto VerificandoMaisBaixo


package br.meto.maisbaixo; public class Pessoa { private double altura; private String nome; //construtor sobrecarregado public Pessoa( String nome, double altura) { this.nome = nome; this.altura = altura; } //mtodos setters foram omitidos, pois, o construtor d conta do recado. public double getAltura() { return altura; } public String getNome() { return nome; } //mtodo compararAltura() public int compararAltura(Pessoa outro){ if(altura<outro.getAltura()) return -1; else if(altura > outro.getAltura()) return 1; else return 0; } public String toString(){ return nome +" tem " + altura + " metros."; } } public class VerificandoOMaisBaixo { public static void main(String[] args) { Pessoa pessoa0 = new Pessoa("Ivo", 1.68); Pessoa pessoa1 = new Pessoa("Alice", 1.54); Pessoa pessoa2 = new Pessoa("Ariel", 1.62); Pessoa pessoa3 = new Pessoa("Juca", 1.78); //referncia para definir quem o mais baixo Pessoa baixo; } } Como o computador no tem a habilidade de bater o olho e comparar tivemos que comparar as alturas das quatro pessoas. Mas, como proceder para encontrar o mais baixo em uma multido? Digamos que esta multido composta de 50 pessoas, conforme ilustrado na Figura 2. Ser que deveremos comparar as 50 alturas dois a dois, ou seja, escrevermos 49 condicionais? E se a multido fosse composta de 1000 pessoas? 133
www.metodista.br/ead

if(pessoa0.compararAltura(pessoa1)<0) baixo = pessoa0; else baixo = pessoa1; if(baixo.compararAltura(pessoa2)>0) baixo = pessoa2; if(baixo.compararAltura(pessoa3)>0) baixo = pessoa3; System.out.println(baixo);

Figura 2 - Escolher quem o mais baixo num grupo grande de pessoas

Para nossa sorte existe a possibilidade de usarmos uma estrutura de dados chamada vetor ou Array na linguagem de programao. Vejamos, primeiro, a teoria e depois voltaremos para resolver o nosso problema.

VEToR (ARRaY)
A primeira das muitas estruturas de dados que aprenderemos a lista. Esta consiste em agrupar vrios itens de mesmas caractersticas. O importante aqui a forma de agrupamento. Alm disso, algumas regras de negcios se fazem necessrias. A mnima funcionalidade de uma lista : Regra 1. Regra 2. Regra 3. Regra 4. Regra 5. remover item da lista; encontrar item na lista; descobrir quantos itens pertencem a lista; descobrir que item est em dada posio; acrescentar item na lista.

Qual a estrutura ideal de armazenar todos os dados? Uma boa possibilidade manter todos os dados do mesmo tipo de item juntos no mesmo espao de memria. Outra boa ideia, que facilitaria manipular a lista, a alocao de um espao de memria contnuo capaz de armazenar todos os itens. Esta estrutura existe e chamada de Array (Arranjo, em portugus) ou Vetor. Em programao definido que: Vetor a alocao prvia de um espao finito contnuo, subdividido em mltiplos de "chunks" (pedaos) de tamanho pr-definido armazenados de forma sequencial, onde cada chunk de memria do tamanho exato que o item ocupa na memria.

134
Universidade Metodista de So Paulo

Figura 3 - Chunks de memria armazenando sequencialmente N+1 itens

Praticamente, todas as linguagens de programao tm um recurso similar ao que descrevemos acima. Em Java, este recurso chamado de Array. Um Array uma poro de memria fixa e sequencial dividida em pedaos idnticos indexados a partir do 0. Em cada posio do Array, podemos guardar um item da lista. Na verdade, cada posio guarda uma referncia para um objeto do tipo item da lista. A capacidade de um Array fixa e deve ser informada no momento da criao do Array. No possvel redimensionar um Array em Java, teremos de contornar isso mais adiante.

MaNipuLao dE VEToREs

Figura 4 - Mapa de memria com alguns itens armazenados aleatoriamente

O armazenamento na memria pode ser feito de forma arbitrria, como na figura acima, ou compactado esquerda, como na figura abaixo. Seria possvel tambm compactar direita, mas, somente o fazemos esquerda (conveno).

Figura 5 - Mapa de memria com alguns itens armazenados compactados esquerda

Apesar das duas formas serem permitidas, olhando as regras de negcios, notamos que a melhor relao de custo-benefcio usar o armazenamento compactado esquerda. Ento, temos que uma lista pode ser armazenada em um vetor compactado esquerda que ocupa um tamanho fixo na memria (mais na frente neste mdulo veremos como vencer esta limitao). Assim sendo, vamos dizer que nossa lista de itens de mesmo tipo poder armazenar at 100 itens. OK?

135
www.metodista.br/ead

Figura 6 - Representao de um vetor capaz de armazenar 100 itens

Vamos comear a cumprir nossas regras de negcios para vetor. Regra 1. Suponhamos que queremos remover o Item 3 de nosso vetor. Para que possamos manter esta estrutura compactada necessrio que movamos o Item 4 para a posio 02, depois, o Item 5 para a posio 03, e iremos repetindo este movimento at que todos os integrantes da lista tenham se reposicionado.

Figura 7 - Remoo de um item do vetor

Regra 2. Encontrar determinado item na lista. Ser que existe o Item 2 na lista? E o Item 153? Nossa prxima tarefa definir como o programa responder a esta pergunta. Uma soluo possvel (e, veremos mais tarde: til) responder com a posio que o item procurado ocupa, ou, com um valor que no pertena aos ndices da lista (-1, por exemplo), ou seja, percorremos o Array, quando o programa encontrar a primeira ocorrncia do item procurado samos do lao e retornamos o valor do ndice. Caso no exista o item, o mtodo retornar -1. Regra 3. Nmero de itens armazenados na lista - Esta regra tem uma soluo bem simples na linguagem Java, visto que nossa lista compactada esquerda e todas as referncias no ocupadas armazenam null (nulo) quando trabalhamos com objetos. Por outro lado, se for um Array do tipo primitivo, ento teremos que introduzir um contador atualizado para a quantidade de itens efetivamente armazenados no Array. Regra 4. Descobrir o item que est armazenado numa determinada posio. Como nosso arranjo indexado, a resposta simples, basta visitar a posio desejada para resgatar o que l estiver armazenado. Regra 5. Acrescentar item na lista. Havendo espao, ou seja, h espao ainda por preencher, podemos inserir um novo item no primeiro local (indicado pelo ndice) que est vazio ou podemos inserir um item numa posio pr-estabelecida. Neste ltimo caso, e se esta posio j estiver preenchida, teremos que deslocar todos os membros que esto direita para a prxima posio vazia. Quer um exemplo de vida real: Voc est numa fila e algum est guardando lugar para outro e antes de chegar sua vez o outro ocupa a vaga guardada.

136
Universidade Metodista de So Paulo

Figura 8 - Insero de um item numa posio j preenchida

A listagem abaixo mostra como fica o cdigo em Java para um vetor de primitivos inteiros, mas, serve de base para a criao de outros tipos primitivos como double, float e char. Ateno especial deve ser dada para as formas de se criar o vetor e no custa ressaltar que o ndice de um vetor sempre um valor inteiro, pois, ele indica onde comea o espao de memria para o item. Leia com ateno redobrada todos os comentrios. Execute o cdigo quantas vezes forem necessrias at entender o que o programa est fazendo.

Listagem 2 - Cdigo de um programa que trabalha com vetor de primitivos inteiros com todas as regras de negcio acima especificadas
package br.meto.vetor; import java.util.Scanner; public class VetorDePrimitivosNaClassePrincipal { public static void main(String[] args) { /* Criando um vetor de tamanho fixo de inteiros com valores Inicializados. Note que este vetor ter tamanho fixo igual ao nmero de elementos inicializados este mtodo somente poder ser usado na criao da referncia para o vetor */ int[] vetorDeValoresInicializados = { 1, 2, 56, -7, 4 }; // Criando um vetor de inteiros sem definir valores, mas, definindo // tamanho int[] vetorDeTamanhoPreDefinido = new int[100]; // Armazenando valores no vetor... De forma compactada vetorDeTamanhoPreDefinido[0] = 31; vetorDeTamanhoPreDefinido[1] = -8; // possvel entrar valores via teclado ou qualquer outra forma de // input. Por exemplo: Scanner entrada = new Scanner(System.in); System.out.print("vetorDeTamanhoPreDefinido[2] = "); vetorDeTamanhoPreDefinido[2] = entrada.nextInt();

137
www.metodista.br/ead

// Lgico que a entrada de vrios valores facilitada com o uso de um exemplo: for (int i = 3; i < 10; i++) { System.out.print("vetorDeTamanhoPreDefinido[" + i + "] = "); vetorDeTamanhoPreDefinido[i] = entrada.nextInt(); } // Nada nos impede de armazenar valores advindos de expresses // calculadas int x = 5; vetorDeTamanhoPreDefinido[10] = x * x + 8;

/ / l a o . Po r

/* Apesar de no existir uma classe para definir um Array, existe um atributo pblico constante (definido no momento da criao) pr-construdo em Java que armazena a capacidade de armazenamento de qualquer vetor. Este atributo recebe o nome de length */ System.out.println("Capacidade do vetor vetorDeValoresInicializados = " + vetorDeValoresInicializados.length + " elementos."); System.out.println("Capacidade do vetor vetorDeTamanhoPreDefinido = " + vetorDeTamanhoPreDefinido.length + " elementos."); //Para mostrar os valores armazenados basta visitar todos os elementos // do vetor (veja o cdigo de mostrar() aps o programa principal mostrar(vetorDeTamanhoPreDefinido); mostrar(vetorDeValoresInicializados); /* A impresso do vetorDeTamanhoPreDefinido mostrou vrios valores zero que no foram as entradas realizadas. Aqui no tem jeito temos que criar uma varivel que indica a quantidade de elementos realmente armazenados pelo usurio */ int quantidadeDeElementosArmazenados = 11; /* O valor 11 foi aqui colocado, pois, j armazenamos 11 valores. Em geral, esta varivel deveria ter sido criada junto com o vetor e a inicializaramos com 0. A impresso agora fica bem melhor, pois, s mostra os valores realmente ocupados: */ mostrar(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados); // Agora vamos visitar quem est no indce 3 do // vetorDeTamanhoPreDefinido System.out.println(vetorDeTamanhoPreDefinido[3]); // Agora vamos procurar o valor -7 no vetorDeValoresIncializados System.out.println(" - 7 est na posio " + procurar(vetorDeValoresInicializados, -7)); // Vamos repetir a procura no vetorDeTamanhoPreDefinido System.out.println(" - 7 est na posio " + procurar(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados, -7));

138
Universidade Metodista de So Paulo

// Vamos remover o elemento que est na posio 4 de // vetorDeTamnhoPreDefinido quantidadeDeElementosArmazenados = remover(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados, 4); mostrar(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados); /* E o que aconteceria se tentssemos retirar algum de uma posio que ainda no foi preenchida? Por exemplo, na posio 30 /* quantidadeDeElementosArmazenados = remover(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados, 30); mostrar(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados); //O que acontece se tentarmos inserir algo na posio 25? quantidadeDeElementosArmazenados=inserir(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados, 100, 25); mostrar(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados);

//E a insero de um valor na posio 7? quantidadeDeElementosArmazenados=inserir(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados, 200, 7); mostrar(vetorDeTamanhoPreDefinido, quantidadeDeElementosArmazenados); } public static void mostrar(int[] vetor) { for (int i = 0; i < vetor.length; i++) { System.out.print(vetor[i] + " "); } System.out.println(); } public static void mostrar(int[] vetor, int armazenados) { for (int i = 0; i < armazenados; i++) { System.out.print(vetor[i] + " "); } System.out.println(); } public static int procurar(int[] vetor, int procurado) { for (int i = 0; i < vetor.length; i++) { // retornando a primeira posio onde est procurado if (vetor[i] == procurado) return i; } // retornando -1 se no encontrou o valor procurado return -1; } public static int procurar(int[] vetor, int armazenados, int procurado) { for (int i = 0; i < armazenados; i++) { // retornando a primeira posio onde est procurado if (vetor[i] == procurado) return i; 139
www.metodista.br/ead

} // retornando -1 se no encontrou o valor procurado return -1; } // os mtodos de insero e de remoo descritos abaixo corrigem a // quantidade de elementos armazenados no vetor public static int remover(int[] vetor, int armazenados, int posicao) { if (posicao < armazenados) { for (int i = posicao; i < armazenados - 1; i++) { vetor[i] = vetor[i + 1]; } armazenados--; } return armazenados; } public static int inserir(int[] vetor, int armazenados, int valor) { if (armazenados < vetor.length) { vetor[armazenados] = valor; armazenados++; } return armazenados; } public static int inserir(int[] vetor, int armazenados, int valor, int posicao) { if (armazenados < vetor.length) { if (posicao< armazenados) { for(int i = armazenados;i>posicao;i--){ vetor[i]=vetor[i-1]; } } else if(posicao>armazenados){ posicao=armazenados; } vetor[posicao]=valor; armazenados++; } return armazenados; } } Nosso prximo passo trabalhar com um vetor de objetos e observar como alguns tratamentos se tornam mais simples. Usaremos a mesma classe Pessoa j introduzida anteriormente, mas, com a introduo do mtodo equals() . Este mtodo ser necessrio para a construo do mtodo procurar(). Outro ponto importante que no mais necessitaremos da varivel extra armazenados que era responsvel por guardar quantos itens eram armazenados num vetor de inteiros. Usando a propriedade que uma referncia (aqui posio do vetor) vazia aponta para null (nulo) podemos criar um mtodo que chamaremos (convenientemente, conforme veremos em outros tpicos de estrutura de dados) de size() que retorna a quantidade de elementos armazenados. Bem, vamos comear. Primeiro a classe Pessoa. 140
Universidade Metodista de So Paulo

Listagem 3 - Cdigo da classe Pessoa


package br.meto.vetor; public class Pessoa { private String nome; private double altura; public Pessoa() { this.nome = ""; this.altura = 0; } public Pessoa(String nome, double altura) { this.nome = nome; this.altura = altura; } public double getAltura() { return altura; } public String getNome() { return nome; } /* mtodo compararAltura() retorna -1, 0 ou 1 dependendo se quem baixo, igual ou mais alto do que o outro */ public int compararAltura(Pessoa outro) { if (altura < outro.getAltura()) return -1; else if (altura > outro.getAltura()) return 1; else return 0; } public String toString() { return nome + " tem " + altura + " metros."; } //Mtodo equals que compara se dois objetos armazenam os mesmos public boolean equals(Pessoa outro) { if (altura != outro.getAltura()) return false; if (nome.compareTo(outro.getNome()) != 0) return false; return true; } }

chamar mais

//valores

141
www.metodista.br/ead

Tendo a Classe Pessoa, podemos agora tratar o problema de criar as regras de negcio que um vetor de objetos deve obedecer. No se esquea de ler os comentrios e de entender o que o cdigo est fazendo, ok?

Listagem 4 - Cdigo de um programa que trabalha com vetor de Objetos Pessoa com todas as regras de negcio acima especificadas
package br.meto.vetor; import java.util.Scanner; public class VetorDeObjetosNaClassePrincipal { public static void main(String[] args) { Pessoa pessoa0 = new Pessoa("Ivo", 1.68); Pessoa pessoa1 = new Pessoa("Alice", 1.54); Pessoa pessoa2 = new Pessoa("Ariel", 1.62); Pessoa pessoa3 = new Pessoa("Juca", 1.78); /* Criando um vetor de tamanho fixo de Pessoas com valores inicializados. Note que este vetor ter tamanho fixo igual ao nmero de elementos inicializados esta forma somente poder ser usado na criao da referncia para o vetor */ Pessoa[] vetorDeValoresInicializados = { pessoa0, pessoa1, pessoa2, pessoa3 }; /* Criando um vetor de inteiros sem definir valores, mas, definindo tamanho */ Pessoa[] vetorDeTamanhoPreDefinido = new Pessoa[100]; // Armazenando valores no vetor... De forma compactada vetorDeTamanhoPreDefinido[0] = pessoa0; vetorDeTamanhoPreDefinido[1] = pessoa1; // Armazenando valores com entrada por teclado Scanner entrada = new Scanner(System.in); Scanner entry = new Scanner(System.in); String nome = ""; double altura = 0; System.out.println("Digite o nome e a altura da pessoa"); nome = entry.nextLine(); altura = entrada.nextDouble(); vetorDeTamanhoPreDefinido[2] = new Pessoa(nome, altura); // com o auxlio de um lao poderemos fazer quantas entradas // desejarmos int indice = 3; do { System.out.println("Digite o nome e a altura da pessoa"); nome = entry.nextLine(); 142
Universidade Metodista de So Paulo

altura = entrada.nextDouble(); vetorDeTamanhoPreDefinido[indice] = new Pessoa(nome, altura); indice++; System.out.println("Outra entrada (Sim para continuar)"); } while (entry.nextLine().compareToIgnoreCase("sim") == 0 && indice < vetorDeTamanhoPreDefinido.length); /* Note o uso de length para determinar a capacidade do vetor (como foi explicado no cdigo do vetor de primitivos) para descobrir se possvel armazenar novos itens no vetor. */ System.out.println("Capacidade do vetor vetorDeValoresInicializados = " + vetorDeValoresInicializados.length + " elementos."); System.out.println("Capacidade do vetor vetorDeTamanhoPreDefinido = " + vetorDeTamanhoPreDefinido.length + " elementos."); /* No problema de primitivos tivemos o problema de manter uma varivel inteira chamada armazenados para controlar a quantidade de elementos primitivos armazenados no vetor. Quando trabalhamos com objetos temos a vantagem de que uma posio sem ter um elemento armazenado armazena null (nulo). Logo podemos criar um mtodo chamado size() que retorna a quantidade de elementos no nulos armazenados */ System.out.println("A quantidade de elementos armazenados em " + "vetorDeValoresInicializados de " + size(vetorDeValoresInicializados)); System.out.println("A quantidade de elementos armazenados em " + "vetorDeTamanhoPreDefinido de " + size(vetorDeTamanhoPreDefinido)); // Desta forma no precisamos passar nada mais para o mtodo que //mostra os itens armazenados num vetor System.out.println("Mostrando os itens armazenados em " + "vetorDeValoresInicializados"); mostrar(vetorDeValoresInicializados); System.out.println("Mostrando os itens armazenados em " + "vetorDeTamanhoPreDefinido"); mostrar(vetorDeTamanhoPreDefinido); // Agora vamos visitar quem est no ndice 3 do // vetorDeTamanhoPreDefinido System.out.println("Na posio 3 de vetorDeTamanhoPreDefinido est "); System.out.println(vetorDeTamanhoPreDefinido[3]);

// Agora vejamos se existe um Ivo de 1,68m em // VetorDeValoresInicializados Pessoa pessoa4 = new Pessoa("Ivo", 1.68); System.out.println(pessoa4.getNome() + " est na posio " 143
www.metodista.br/ead

+ procurar(vetorDeValoresInicializados, pessoa4)); // Vamos agora fazer a mesma busca, mas, vamos alterar a altura pessoa4 = new Pessoa("Ivo", 1.87); System.out.println(pessoa4.getNome() + " est na posio " + procurar(vetorDeValoresInicializados, pessoa4)); System.out.println("Se o valor for -1 porque no foi " + item procurado"); // Vamos remover o elemento que est no posio 2 de // vetorDeValoresInicializados System.out.println("Removendo uma pessoa da posio 2\nAntes:"); mostrar(vetorDeValoresInicializados); remover(vetorDeValoresInicializados, 2); System.out.println("Depois:"); mostrar(vetorDeValoresInicializados); System.out.println("Inserindo Maria de 1.48 metros no " + "vetorDeTamanhoPreDefinido"); pessoa4 = new Pessoa("Maria", 1.48); inserir(vetorDeTamanhoPreDefinido, pessoa4); System.out.println("Aps a insero temos: "); mostrar(vetorDeTamanhoPreDefinido); System.out.println("Inserindo Jos de 1.65 metros no " + "vetorDeTamanhoPreDefinido na posio 1"); pessoa4 = new Pessoa("Jos", 1.65); inserir(vetorDeTamanhoPreDefinido, pessoa4, 1); System.out.println("Aps a insero temos: "); mostrar(vetorDeTamanhoPreDefinido); System.out.println("Inserindo Pedro de 1.93 metros no " + "vetorDeTamanhoPreDefinido na posio 40"); pessoa4 = new Pessoa("Pedro", 1.93); inserir(vetorDeTamanhoPreDefinido, pessoa4, 40); System.out.println("Aps a insero temos: "); mostrar(vetorDeTamanhoPreDefinido); } public static void mostrar(Pessoa[] vetor) { for (int i = 0; i < size(vetor); i++) { System.out.println(vetor[i]); } } public static int size(Pessoa[] vetor) { int cont = 0; while (cont < vetor.length && vetor[cont] != null) { cont++; } return cont; } public static int procurar(Pessoa[] vetor, Pessoa procurado) { for (int i = 0; i < size(vetor); i++) { 144
Universidade Metodista de So Paulo

"encontrado o

// retornando a primeira posio onde est procurado if (vetor[i].equals(procurado)) { return i; } } // retornando -1 se no encontrou o valor procurado return -1; } public static void remover(Pessoa[] vetor, int posicao) { if (posicao < size(vetor)) { for (int i = posicao; i < size(vetor) - 1; i++) { vetor[i] = vetor[i + 1]; } // Aqui estamos indicando que a ltima posio agora est vazia vetor[size(vetor) - 1] = null; } } public static void inserir(Pessoa[] vetor, Pessoa p) { if (size(vetor) < vetor.length) { vetor[size(vetor)] = p; } } public static void inserir(Pessoa[] vetor, Pessoa p, int posicao) { if (size(vetor) < vetor.length) { if (posicao < size(vetor)) { for (int i = size(vetor); i > posicao; i--) { vetor[i] = vetor[i - 1]; } } else if (posicao > size(vetor)) { posicao = size(vetor); } vetor[posicao] = p; } } } Tendo aprendido como montar as regras de negcio que os Arrays devem obedecer simples criar novas regras de negcio. Como a do problema que pede para apontar o mais baixo no meio de 50, ou 1000, ou mais pessoas. Para no ficar muito poludo, vamos reescrever a Listagem 4 de forma a mostrar apenas as partes relevantes. Outro ponto importante que vamos incialmente supor que a pessoa mais baixa estar armazenada na primeira posio do vetor e durante as comparaes vamos atualizando a referncia que armazena a referncia para a pessoa mais baixa. A classe Pessoa continuar sendo a apresentada na Listagem 3.

145
www.metodista.br/ead

Listagem 5 - Encontrando a pessoa mais baixa no meio de vrias pessoas


package br.meto.vetor; public class AchandoOMaisBaixo { public static void main(String[] args) { Pessoa[] crowd = new Pessoa[50]; Pessoa pessoa0 = new Pessoa("Ivo", 1.68); Pessoa pessoa1 = new Pessoa("Alice", 1.54); Pessoa pessoa2 = new Pessoa("Ariel", 1.62); Pessoa pessoa3 = new Pessoa("Juca", 1.78); crowd[0]=pessoa0; crowd[1]=pessoa1; crowd[2]=pessoa2; crowd[3]=pessoa3; Pessoa baixo = crowd[0]; for(int i=0; i<size(crowd); i++){ if(crowd[i].getAltura() < baixo.getAltura()){ baixo = crowd[i]; } } System.out.println(baixo.getNome() +" o mais baixo com " + baixo.getAltura()); // vamos colocar mais algumas pessoas crowd[4] = new Pessoa("Antnio", 1.87); crowd[5] = new Pessoa("Jurandir",1.93); crowd[6] = new Pessoa("Ermelinda",1.48); crowd[7] = new Pessoa("Tiago",1.74); // apontando baixo para o primeiro da lista de novo baixo = crowd[0]; for(int i=0; i<size(crowd); i++){ if(crowd[i].getAltura() < baixo.getAltura()){ baixo = crowd[i]; } } System.out.println(baixo.getNome() +" o mais baixo com " + baixo.getAltura()); // aqui termina o programa principal } public static int size(Pessoa[] vetor) { int cont = 0; while (cont < vetor.length && vetor[cont] != null) { cont++; } return cont; } } 146
Universidade Metodista de So Paulo

Voc quer saber o que mais podemos fazer com um vetor? Quase tudo que envolva uma quantidade grande e limitada de dados. Por exemplo, se desejssemos saber quantas pessoas esto acima da mdia de altura. Para tanto, teramos que primeiro calcular a mdia e depois contar quantas pessoas so maiores que a mdia. Insira na classe principal o trecho de cdigo abaixo para conferir.

Listagem 6 - Trecho para calcular a mdia das alturas e contar quantas pessoas esto acima da mdia
//trecho a ser inserido no final do programa principal double soma =0; for(int i=0;i<size(crowd);i++){ } double media = soma/size(crowd); int pessoasAcimaDaMedia =0; for(int i=0;i<size(crowd);i++){ } System.out.println("Existem " + pessoasAcimaDaMedia + " pessoas com altura acima da mdia"); if(crowd[i].getAltura()>media){ } pessoasAcimaDaMedia++; soma =soma+crowd[i].getAltura();

147
www.metodista.br/ead

_________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________
148
Universidade Metodista de So Paulo

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________

Organizao de Dados

Organizao de Dados II
Professora Dra. Silvia Brunini

Mdulo

Apresentar as estruturas de dados lineares estticas e dinmicas; Capacitar o aluno a reconhecer quando us-las e a resolver diversos tipos de problemas que envolvem grandes quantidades de dados.

Objetivos:

Estrutura de Dados; Pilha Esttica; Fila Esttica; Lista Ligada; Pilha Dinmica; Fila Dinmica.

Palavras-chave:

www.metodista.br/ead

A mente que se abre a uma nova idia jamais voltar ao seu tamanho original. Albert Einstein At o presente momento, voc aprendeu a trabalhar com vetores de tipos primitivos (inteiros, reais, booleanos e, talvez, caracteres) e com vetores de objetos para construir listas estticas. As estruturas Pilha e Fila Esttica tambm podem ser construdas usando vetores.

CoNsTRuiNdo ouTRas EsTRuTuRas dE dados EsTTicas


Outra coisa que voc pode construir usando vetores so pilhas e filas estticas. Vamos comear pelas pilhas.

Pilhas Estticas
Pilhas nada mais so que estruturas de dados do tipo LIFO (Last In First Out), isto , o ltimo que entra o primeiro que sai e em uma pilha ns sempre colocamos os objetos pelo topo. Como assim? Fcil, imagine uma pilha qualquer: pilha de livros, pratos, papis, etc.

Figura 1 - Vrios tipos de pilhas

As operaes de recuperao de dados so destrutivas, ou seja, para se alcanar dados intermedirios a tal estrutura necessrio destruir sequencialmente os dados anteriores. uma das estruturas de dados mais simples e a mais utilizada em programao, sendo inclusive implementada diretamente pelo hardware da maioria das mquinas modernas. A ideia fundamental da pilha que todo o acesso a seus elementos feito atravs do seu topo. Assim, quando um elemento novo introduzido na pilha, passa a ser o elemento do topo, e o nico elemento que pode ser removido da pilha o do topo.

Pilha e suas aplicaes


Verificao de parnteses. Retirada de vages de um trem. Retirada de mercadorias em um caminho de entregas. Converso de um nmero na base 10 para outra base numrica. As Regras de negcios so rgidas. Dentro dos parnteses esto os nomes dos mtodos usados na literatura. Vamos discutir, agora, as regras de negcio. Regra 1. empilhar ( push()) 150
Universidade Metodista de So Paulo

Figura 2 - Inserindo elementos na pilha

Regra 2. remover elemento do topo (pop())

Figura 3 - Removendo elementos do topo da pilha

Regra 3. Copiando o topo da pilha (peek())

Figura 4 - Espiando o topo da pilha

Regra 4. Verificando se a pilha est vazia (isEmpty()). De novo, vamos nos deparar com o mesmo processo que criamos para array. Se estivermos trabalhando com pilha de primitivos teremos que ter uma varivel extra que indica a quantidade de elementos armazenados na pilha. Por outro lado, se for uma pilha de objetos basta verificar se todos os elementos so null.

151
www.metodista.br/ead

A Listagem 1 mostra a implementao de uma pilha esttica usando array.

Listagem 1 - Cdigo de uma classe chamada PilhaEstatica que implementa pilha

package br.meto.pilhaestatica; public class PilhaEstatica { private int capacidade; private int quantidadeArmazenada; private int topo; private int[] container; public PilhaEstatica(int capacidade){ this.capacidade = capacidade; //evitarei desta forma verificar pilhavazia this.topo =-1; container = new int[capacidade]; this.quantidadeArmazenada=0; } public boolean pilhaVazia(){ if(quantidadeArmazenada== 0) return true; return false; } public boolean pilhaCheia(){ if(quantidadeArmazenada == capacidade) return true; return false; } public void insere(int x){ if(pilhaCheia()){ System.out.println(Capacidade excedida); return; } topo=topo+1; container[topo]=x; quantidadeArmazenada++; } public int remove(){ if(pilhaVazia()){ System.out.println(Pilha Vazia retornando -9999); return -9999; } int temp = topo; topo --; quantidadeArmazenada--; return container[temp]; } public int topo(){ 152
Universidade Metodista de So Paulo

return container[topo];

// Veja como fcil criar um mtodo para mostrar todos os elementos da //pilha public String toString(){ String s=; for(int i=0;i<=topo;i++){ s += String.valueOf(container[i]) + ; } return s; } } E na prxima listagem voc tem o cdigo que testa pilha esttica. Listagem 2 - Programa para testar a classe PilhaEstatica package br.meto.pilhaestatica; public class TestePilhaEstatica { public static void main(String[] args) { PilhaEstatica a = new PilhaEstatica(10); for(int i=0;i< 10;i++){ a.insere(i); //agora voc j sabe para que serve o toString() // bem prtico, no ? System.out.println(a); } for(int i=0;i< 10;i++){ a.remove(); System.out.println(a); } for(int i=0;i< 12;i++){ //note que queremos inserir 12 itens a.insere(i); System.out.println(a); } for(int i=0;i< 4;i++){ a.remove(); System.out.println(a); } for(int i=0;i< 4;i++){ a.insere(i); System.out.println(a); } } }

FiLa EsTTica
Fila uma estrutura para armazenar um conjunto de elementos, que funciona da seguinte forma: Novos elementos entram no conjunto, exclusivamente, no fim da fila; O nico elemento que pode ser retirado da fila, em um dado momento, o primeiro elemento da fila. 153
www.metodista.br/ead

Uma Fila (em Ingls: Queue) uma estrutura que obedece ao critrio F.I.F.O.: First In, First Out. Ou seja, o primeiro elemento que entrou no conjunto ser o primeiro a sair. Regras de Negcio de uma fila Regra 1. Iniciar Fila: Inicia uma fila vazia com tamanho mximo, isto cria-se um vetor do tipo desejado com tamanho pr-estabelecido. Regra 2. Verificar se uma fila est vazia: Criar um mtodo que retorna true se a fila estiver vazia; caso contrrio, retorna false. Regra 3. Verificar se uma fila est cheia: Criar um mtodo que retorna true se a fila estiver cheia; caso contrrio retorna false. Regra 4. Inserir elemento na fila: Este procedimento insere o dado no final da fila se ela no estiver cheia. Regra 5. Retirar elemento da fila: Este procedimento retorna o elemento retirado se a fila no estiver vazia. Note que o elemento ser removido da fila. Regra 6. Verificar o tamanho da fila: Este procedimento retorna o nmero de elementos que esto na fila. Cumprir as regras acima no muito diferente do que foi feito para o caso da Pilha Esttica, mas, aqui temos um inconveniente: a cada vez que retiramos um elemento da fila teremos que mover os outros elementos para a primeira posio vazia e isto consome muito recurso computacional. A melhor soluo custo-benefcio computacional usarmos uma fila circular. Ou seja, ao invs de empurrarmos todos os elementos para a posio inicial, empurramos a posio inicial para frente.

Figura 5 - Fila Circular usando vetor

154
Universidade Metodista de So Paulo

Vejamos como fica a codificao em Java da fila circular.

Listagem 2 Classe para Fila Esttica Circular


package br.meto.filaestaticacircular; public class FilaEstatica { private int capacidade; private int inicio; private int fim; private int quantidadeArmazenada; private int[] container; public FilaEstatica(int capacidade){ this.capacidade=capacidade; container = new int [capacidade]; this.quantidadeArmazenada=0; } public boolean FilaVazia(){ if(quantidadeArmazenada==0) return true; return false; } public boolean FilaCheia(){ if(quantidadeArmazenada==capacidade) return true; return false; } public int size(){ return quantidadeArmazenada; } public void insere(int x){ if(FilaCheia()){ System.out.println(Capacidade Excedida); } else{ if(FilaVazia()){ fim=0; inicio=0; } quantidadeArmazenada++; container[fim]=x; fim=(fim+1)%capacidade; } } public int retira(){ if(FilaVazia()){ System.out.println(A fila est vazia retornando -444); return -444; } quantidadeArmazenada--; int temp=inicio; inicio=(inicio+1)%capacidade; return container[temp]; } public String toString(){ String s=; int i =0; while(i<size()){ s=s+String.valueOf(container[(inicio+i)%capacidade])+ ; i++; } return s; } }
www.metodista.br/ead

155

Se voc leu com bastante cuidado o cdigo deve ter notado o uso de: fim=(fim+1)%capacidade; inicio=(inicio+1)%capacidade; Porque estamos usando o operador de resto aqui, deve ser sua pergunta, no mesmo? A resposta simples: para automatizar a tarefa de retornar para zero quando tivermos ultrapassado a ltima posio (posio = capacidade -1). Agora vamos ao programa que testa a Fila Esttica.

Listagem 3 Programa que testa a Fila Esttica Circular


package br.meto.filaestaticacircular; public class Testando { public static void main(String[] args) { FilaEstatica teste = new FilaEstatica(10); for (int i = 0; i < 12; i++) { teste.insere(i); System.out.println(teste); } for (int i = 0; i < 5; i++) { teste.retira(); System.out.println(teste); } for (int i = 0; i < 5; i++) { teste.insere(i); System.out.println(teste); } while (!teste.FilaVazia()) { teste.retira(); System.out.println(teste); } } }

Conforme vimos, at o momento, Arrays so teis, mas apresentam dois grandes problemas: a lista tem tamanho limitado; a velocidade na busca por elementos do tipo linear. Assim, se numa lista houver N elementos teremos no pior dos casos que percorrer as N posies da lista para encontrar ou no determinado elemento. Resolvendo o problema do tamanho de uma lista (Criando Clulas) Imagine-se numa pequena cidade tentando comprar um quilo de linguia da Dona Josefa. Na entrada da cidade, voc pergunta ao frentista (Zezinho) que te diz que o dono do aougue (Seu Damio) deve saber onde fica a casa da D. Josefa; 156
Universidade Metodista de So Paulo

No aougue (Zeca empregado do seu Damio), te diz para procurar o padre (Padre Alberto), que sabe onde mora a Dona Josefa; O padre Alberto no sabe, mas, ouviu dizer que o farmacutico (Seu Tavinho) sabe onde a casa da D. Josefa; Seu Tavinho no sabe, mas, conhece o primo (Z do Leite) da D. Josefa; Na padaria, o Z do Leite est indo para a casa da prima buscar mais linguia e voc aproveita para ir junto.

Figura 6 - Trajeto percorrido para a compra da linguia

Este Fulano que conhece compe uma clula

A clula armazena qualquer tipo de objeto e, ainda por cima, tem na memria quem a prxima clula. Em Java, os atributos de uma clula so: private Object elemento; private Celula proxima; Pela capacidade que a clula tem de saber quem a prxima clula possvel criar uma cadeia de clulas, cada uma delas apontando para a sua prxima na cadeia. Esta estrutura chamada de lista ligada. Em Java, os atributos de uma lista ligada basicamente so: private Celula primeira; private Celula ultima; private int totalDeElementos; 157
www.metodista.br/ead

O interessante saber o que podemos fazer com uma lista ligada, ou seja, quais so suas funcionalidades. Uma lista mnima dada por: adicionar elementos: seja no comeo, seja no final, seja em algum lugar desejado; remover elementos: seja no comeo, seja no final, seja em algum lugar desejado; saber qual o tamanho da lista a qualquer momento; descobrir onde certo elemento est; descobrir qual o elemento em uma certa posio; descobrir se certa posio existe na lista. Vejamos, pictoricamente, como ficam as duas primeiras regras de negcio: Adicionar elemento na Lista Ligada

Figura 7 - Inserindo um elemento no incio, no meio ou no final de uma lista ligada

Removendo Elemento de uma lista ligada

Figura 8 - Removendo um elemento do incio, ou do meio ou do final da lista ligada

158
Universidade Metodista de So Paulo

Quaisquer destas operaes tm um custo computacional baixssimo, pois, tudo o que temos que fazer modificar o valor do atributo prxima definido para Celula. Desta vez no criaremos nossos prprios mtodos, mas sim usaremos uma API (Application Programming Interface ou, em portugus, Interface de Programao de Aplicativos) de Java chamada LinkedList. Vejamos o que h dentro desta API: Constructor Summary LinkedList() Constri uma lista vazia. Mtodos void add(int ndice, E elemento): insere elemento na posio void addFirst(E elemento): insere elemento no incio void addLast(E elemento): insere elemento no final void clear(): remove todos elementos boolean contains(Object o): retorna true se contm objeto E get(int ndice): retorna o elemento da posio E getFirst(): retorna o primeiro elemento E getLast(): retorna o ltimo elemento int indexOf(Object o): retorna o ndice da primeira ocorrncia ou -1se no encontrar Object o int lastIndexOf(Object o): retorna o ndice da ltima ocorrncia ou -1 boolean offerFirst(E e): adiciona o elemento na frente boolean offerLast(E e): adiciona o elemento no final E peekFirst(): recupera o 1 elemento ou retorna null E peekLast(): recupera o ltimo elemento ou retorna null E set(int ndice, E e): substitui o elemento da posio int size(): retorna o nmero de elementos E pollFirst(): recupera e remove o primeiro elemento ou retorna null E pollLast(): recupera e remove o ltimo elemento ou retorna null E remove(int ndice): remove o elemento da posio boolean remove(Object o): remove a primeira ocorrncia do objeto E removeFirst(): remove e retorna o primeiro elemento boolean removeFirstOccurrence(Object o): remove a primeira ocorrncia do objeto E removeLast(): remove e retorna o ltimo elemento boolean removeLastOccurrence(Object o): remove a ltima ocorrncia do objeto Vejamos um exemplo do uso de alguns dos mtodos acima: Construir uma lista. Solicitar ao usurio digitar e ler 10 elementos que sero inseridos no final da lista. Mostrar e excluir o quinto elemento da lista. Ler e inserir um elemento na stima posio da lista. Mostrar toda a lista. Excluir o elemento da terceira posio da lista. Mostrar o 159
www.metodista.br/ead

primeiro e o ltimo elemento da lista. Ler e inserir um elemento no comeo da lista. Ler um nmero inteiro e excluir o elemento nessa posio. Substituir o sexto elemento por novo. Mostrar o nmero de elementos da lista.

Listagem 4 - Soluo codificada em Java do problema que exemplifica o uso de alguns mtodos da API LinkedList
package br.meto.listaligada; import java.util.LinkedList; import java.util.Scanner; public class Exemplo1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); LinkedList<Integer> example = new LinkedList<Integer>(); for (int i = 0; i < 10; i++) { num = input.nextInt();

int num; System.out.println(example); System.out.println(Removendo o quinto objeto da lista: + example.remove(5)); System.out.println(example); System.out.println(Removendo o quinto objeto da lista: + example.remove(new Integer(5))); System.out.println(example); example.add(6, new Integer(11)); System.out.println(example); example.addFirst(13); example.addLast(19); System.out.println(example); example.set(1, new Integer(65)); System.out.println(example); } example.add(num);

160
Universidade Metodista de So Paulo

Voc deve estar se perguntando neste momento: mas, realmente no tem limite? Limite sempre tem, pois, a memria da mquina finita, mas o interessante que a LinkedList tem apenas a capacidade que ela necessita. No h excesso de memria alocada e nem falta da mesma. Da mesma forma que pudemos construir pilhas e filas estticas usando arrays, possvel criar pilhas ou filas dinmicas usando listas ligadas. Pilha Dinmica Em Java existe uma API chamada de Stack (pilha, em ingls) que apresenta os mtodos para empilhar(push()), desempilhar(pop()), verificar se a pilha est vazia(isEmpty()) e espiar o elemento do topo(peek()).

Tabela 1 - API da classe Stack

Um exemplo para o uso de pilha a verificao se a quantidade de parnteses de certa expresso est balanceada ou no. Cada vez que o caractere abrir parntese (() for encontrado, este ser inserido numa pilha e a cada caractere fechar parntese ()), um elemento ser removido da pilha. A expresso estar balanceada se a pilha terminar vazia.

Listagem 5 - Codificao de um programa que verifica o balanceamento de parnteses numa expresso


package br.meto.listaligada; import java.util.Stack; public class BalanceamentoDeParenteses { public static void main(String[] args) { Stack<Character> pilha = new Stack<Character>(); String[] formulas = { 2*(3+5, 2*(3+5)), 2*(3+5) }; 161
www.metodista.br/ead

for (int i = 0; i < formulas.length; i++) { /* * criando uma varivel auxiliar tamanho para mostrar como saber o * tamanho de uma varivel String em java */ int tamanho = formulas[i].length(); for (int j = 0; j < tamanho; j++) { // note como pegar um nico caractere da String com o mtodo // charAt() } if (pilha.isEmpty() && balanceado) else /* * como estamos trabalhando com a mesma pilha vrias vezes em * diferentes expresses necessrio limp-la para o prximo teste. * Afinal nunca se sabe se rstou algo na pilha. */ pilha.pop(); System.out.println(A expresso + formulas[i] + no est balanceada); System.out.println(A expresso + formulas[i] + est balanceada); } char letra = formulas[i].charAt( j); if (letra == () pilha.push(letra); else if (letra == )) { if (!pilha.isEmpty()) else balanceado = false; boolean balanceado = true;

pilha.pop();

while (!pilha.isEmpty()) } } 162


Universidade Metodista de So Paulo

FiLa DiNmica
Em Java existe a interface Queue que nada mais que um contrato que (neste caso) a classe LinkedList deve obedecer, por isso voc ver que no existe um construtor prprio. As assinaturas dos mtodos que LinkedList deve obedecer esto descritos na tabela abaixo e obedecem as mesmas regras de negcios que usamos para fila esttica.

Tabela 2 - Mtodos da Interface Queue

Para exemplificar vamos criar um programa que combina duas filas a e b que armazenam valores ordenados crescentes em uma terceira fila c tambm ordenada crescente sem destruir as filas A e B (Um aviso importantssimo tanto o mtodo pop() de pilha quanto o mtodo poll() de fila so destrutivos). Como faz-lo? Simples, crie outras duas filas auxiliares.

Listagem 6 - Criando uma terceira fila sem destruir as filas originais


package br.meto.listaligada; import java.util.LinkedList; import java.util.Queue; public class TerceiraFila { public static void main(String[] args) { Queue<Integer> a = new LinkedList<Integer>(); Queue<Integer> b = new LinkedList<Integer>(); Queue<Integer> c = new LinkedList<Integer>(); Queue<Integer> auxA = new LinkedList<Integer>(); Queue<Integer> auxB = new LinkedList<Integer>(); a.offer(1); a.offer(4); a.offer(7); 163
www.metodista.br/ead

a.offer(9); a.offer(11); b.offer(2); b.offer(15); b.offer(20); while (!a.isEmpty() && !b.isEmpty()) { if (a.peek() < b.peek()) { Integer aux = a.poll(); c.offer(aux); auxA.offer(aux); } else { Integer aux = b.poll(); c.offer(aux); auxB.offer(aux); } } // como no sabemos que fila terminou primeiro // devemos acabar de preencher c com ela while (!a.isEmpty()) { Integer aux = a.poll(); c.offer(aux); auxA.offer(aux); } while (!b.isEmpty()) { Integer aux = b.poll(); c.offer(aux); auxB.offer(aux); } // Agora devemos reconstruir a e b while (!auxA.isEmpty()) {

a.offer(auxA.poll()); } while (!auxB.isEmpty()) { b.offer(auxB.poll()); } // Agora s mostrar as filas System.out.println(Fila a = +a); System.out.println(Fila b = + b); System.out.println(Fila c = + c); At agora vimos alguns tipos de estruturas de dados. A caracterstica comum entre elas que so do tipo linear e a busca ou insero de dados vai ser no pior dos casos proporcional ao nmero de dados (N). Costuma-se dizer em programao que a complexidade O(N). H outras estruturas de dados com estas caractersticas, mas deixaremos para um tpico mais avanado. Vejamos outra estrutura de dado cuja complexidade muito menor, digamos que, em mdia, O(log2N). Isto mesmo, proporcional ao logaritmo do nmero N na base 2. Vamos a um exemplo concreto: suponha que N = 1048576, ento se eu tenho uma lista ligada (LinkedList) com 1048576 dados armazenados, vou percorrer esta quantidade N de dados para inserir mais um valor. Por outro lado, se eu encontrar uma estrutura cuja complexidade O(log2N) ou simplesmente O(logN) ento terei que percorrer apenas 20 dados, pois, 1048576 = 220 e log2220 = 20. Essa estrutura a rvore. 164
Universidade Metodista de So Paulo

Organizao de Dados

Organizao de Dados III


Professora Dra. Silvia Brunini

Mdulo

Apresentar uma estrutura de dados no linear; Capacitar o aluno a reconhecer quando us-la e a resolver diversos tipos de problemas que envolvem grandes quantidades de dados.

Objetivos:

Estrutura de Dados No Linear; rvores; rvore Binria de Busca.

Palavras-chave:

www.metodista.br/ead

Assim como lavamos o corpo deveramos lavar o destino, mudar de vida como mudamos de roupa no para salvar a vida, como comemos e dormimos, mas por aquele respeito alheio por ns mesmos a que propriamente chamamos asseio. Fernando Pessoa Estudamos at o momento como usar estruturas de dados lineares (listas, pilhas e filas) para organizar dados. Essas estruturas no so adequadas para busca de itens. A Pilha e a Fila s permitem acesso ao topo e ao primeiro item, respectivamente. A lista tem um custo computacional grande quando precisamos buscar um determinado elemento, porque o tempo de busca linear quando no esto ordenadas. rvore surge como uma alternativa para esse tipo de aplicao.

RvoREs
rvore uma estrutura de armazenamento de dados no linear.

Aplicaes
As aplicaes de rvores referem-se manuteno de estruturas nas quais a ordem importante. Busca; Expresso; Deciso; Pesquisa e ordenao de dados em Bancos de dados, por exemplo.

Figura 1 - Exemplos de duas rvores. A primeira com at 6 filhos e a segunda com at 2 filhos por raiz

166
Universidade Metodista de So Paulo

rvore binria
Uma rvore binria (N=2) um conjunto finito de elementos vazio ou particionado em trs subconjuntos: O primeiro subconjunto contm um nico elemento chamado raiz; Os outros dois subconjuntos tambm so rvores binrias chamadas subrvores esquerda e direita da rvore original (Recursividade!!!). Assim, uma subrvore esquerda ou direita pode estar vazia. Cada elemento de uma rvore binria chamado n da rvore. Veja figura 2.

Figura 2 - Uma rvore binria em que o filho da esquerda (ou da direita) tanto pode ser null (vazio) quanto a raiz de uma rvore interna (tambm chamada de subrvore) quanto uma referncia para um item

Exemplo de uma rvore binria

Figura 3 - rvore binria com 9 ns com raiz principal no n A

Vamos ver o que podemos descobrir ao olhar para esta rvore da figura 3: em C. A subrvore esquerda de A est enraizada em B, e sua subrvore direita est enraizada A subrvore esquerda de C est vazia. A subrvore direita de E est vazia. 167
www.metodista.br/ead

Continuando na figura 3, dizemos que: Se A a raiz de uma rvore binria e B a raiz de sua subrvore esquerda, ento A dito pai de B e B dito filho esquerdo de A. Equivalentemente, A dito pai de C e C dito filho direito de A. Um n sem filhos (como D, G, H ou I) chamado FOLHA. A um ascendente de G. H um descendente de C. Dois ns so irmos se so filhos esquerdo e direito do mesmo pai. Por exemplo, B e C so irmos. Outros pontos que podemos ressaltar sobre rvores so: Embora as rvores naturais cresam com suas razes na terra e suas folhas no ar, em Computao as estruturas de dados do tipo rvore tm a raiz no topo e as folhas no cho. Quando percorrermos a rvore a partir das folhas na direo da raiz, se dir que estamos subindo a rvore, e se partirmos da raiz para as folhas, estaremos descendo a rvore. Se cada n no folha numa rvore binria tem subrvores esquerda e direita no vazias, ento a rvore estritamente binria.

Figura 4 - Exemplo de uma rvore estritamente binria

O nvel de um n de uma rvore binria definido como segue: a raiz da rvore tem nvel 0, e o nvel de qualquer outro n na rvore um nvel a mais que o nvel de seu pai.

Figura 5 - Nveis de uma rvore

168
Universidade Metodista de So Paulo

A profundidade de uma rvore binria o mximo nvel da rvore. Ou seja, a profundidade de uma rvore o mais longo caminho da raiz at uma folha.

Figura 6 - Profundidade de uma rvore dada pelo maior nvel da rvore

Uma rvore binria completa de profundidade d uma rvore estritamente binria da qual todas as folhas esto no nvel d.

Figura 7 - rvore binria completa

No h circuito fechado em uma rvore, se houver no rvore (mas pode ser a representao de outra estrutura de dado chamada grafo, que no ser visto neste mdulo).

Figura 8 - Exemplo de uma estrutura de dado que no rvore

169
www.metodista.br/ead

CoNTaBiLidadE Em uma RvoRE BiNRia


L+1. Se uma rvore binria contiver m ns no nvel L, ela conter no mximo 2m ns no nvel

Como uma rvore binria pode conter no mximo um n no nvel 0 (raiz), ela poder conter no mximo 2L ns no nvel L. Uma rvore binria completa de profundidade d a rvore binria de profundidade d que contm exatamente 2L ns em cada nvel L entre 0 e d. Isso equivale a dizer que ela a rvore binria de profundidade d que contm exatamente 2d ns no nvel d.

Figura 9 Exemplo de como contar os ns. Aqui mostrando o clculo para o nvel 3

O nmero total de ns numa rvore binria completa de profundidade d (tn) igual soma do nmero de ns em cada nvel entre 0 e d, inclusive.

tn = 2d+1 - 1
Como todas as folhas nesta rvore esto no nvel d, a rvore contm 2d folhas e, portanto, 2 1 ns no folhas.
d

RvoRE BiNRia dE Busca


rvores binrias de busca so rvores binrias construdas segundo um critrio nico de insero de elementos para todos os nveis, que permite a insero ou busca de um elemento na rvore de forma eficiente, por ser este critrio binrio. Por exemplo: numa rvore binria de busca numrica, pode-se inserir, a partir de cada sub-raiz, um valor que seja maior direita e um valor que seja menor esquerda. Para elementos iguais sub-raiz, pode-se inserir tanto esquerda quanto direita, mas este critrio tem que ser definido antes da primeira insero. Vamos inserir os seguintes elementos 14, 15, 4, 9, 7, 18, 3, 5, 16, 17, 15 em uma rvore binria de busca numrica cujo critrio de insero os menores esquerda de cada sub-raiz e os maiores ou iguais direita de cada sub-raiz.

170
Universidade Metodista de So Paulo

Figura 10 - Insero de elementos numa rvore com a regra que menor fica esquerda da raiz

Olhando a figura 10 percebe-se que a pergunta que deve ser feita : o valor menor do que aquele que est na raiz? Se sim, faz-se com que o novo n ocupe o lugar de filho da esquerda do n pesquisado seno ele deve ocupar o lugar de filho da direita. Seguindo o exemplo acima chegamos em:

Figura 11 - rvore final aps a insero de todos os valores

171
www.metodista.br/ead

Busca Numa RvoRE BiNRia


E como faramos uma busca? Por exemplo, como faramos para buscar o valor 1? A busca segue o mesmo modelo da insero, mas com uma pergunta a mais: valor procurado igual ao valor armazenado no n visitado? Se sim, retorna a referncia do n, seno, faz-se a prxima pergunta: valor procurado menor que o valor armazenado no n visitado? Se a resposta for sim, vai para a subrvore esquerda, seno vai para a subrvore da direita do n visitado. E o que acontece se a rvore no tiver mais ns para ser visitado? Ento, isto significa que o valor no foi encontrado e em geral se retorna null (nulo ou vazio).

CoNcLuso
Este curso te forneceu uma introduo s diversas estruturas de dados. H ainda uma infinidade de tpicos a serem aprendidos como matrizes (estrutura de dados com tamanho pr-definido), listas duplamente ligadas, fila de prioridades, hash table, maps, etc., etc.. Bem vindo ao mundo real!

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________
172
Universidade Metodista de So Paulo

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________

Implementao de Sistemas Cliente Servidor

Mdulo

Introduo ao desenvolvimento de interface grfica utilizando swing


Prof. Rafael Guimares Sakurai
Apresentar uma introduo ao desenvolvimento de interface grfica de usurio na linguagem de programao Java, com os componentes (JFrame, JLabel, JTextField e JButton) essenciais para o desenvolvimento de uma aplicao Desktop.

Objetivo:

Palavras-chave:

Java, Swing, GUI

www.metodista.br/ead

Os usurios das aplicaes esto acostumados com interfaces visuais, como aplicaes Desktop, na qual possvel interagir atravs de menus, botes, campos de textos, caixas de seleo, entre outros. A linguagem Java oferece trs pacotes bsicos para o desenvolvimento da interface grfica do usurio (Graphical User Interface - GUI), sendo eles o Abstract Window Toolkit (AWT), o Swing e o novo JavaFX. Segundo o site da ORACLE, o Swing uma caixa de ferramentas que disponibiliza ao desenvolvedor componentes GUI para desenvolvimento de uma interface Desktop rica, no qual esses componentes podem utilizar tambm a API de Java2D para desenho de imagem; suporte a aparncia e estilos dos componentes facilmente alterveis (Look and Feel); transferncia de dados por meio do copiar, colar, recortar e arrastar e soltar (drag and drop); Internacionalizao; API de acessibilidade para aplicativos que leem os componentes da tela; e suporte flexvel para implantao atravs do Java Plug-in e do Java Web Start. Entre os tipos de componentes do Swing, temos os contineres, que so componentes utilizados para armazenar outros componentes:

Os componentes de controle so utilizados para montar a estrutura bsica das telas, com botes, textos, lista, tabela, rvore, entre outros:

174
Universidade Metodista de So Paulo

Os componentes de menu que permitem montar menus fixos e de popup nas telas:

Os componentes de janelas so telas prontas utilizadas para apresentar uma caixa de dilogo, a seleo de um arquivo ou diretrio, seleo de cores, entre outros:

Como a linguagem Java uma linguagem multiplataforma, as aplicaes Desktop escritas nela tambm podem ser executadas em qualquer sistema operacional com um ambiente de execuo instalado (Java Runtime Environment - JRE).

UTiLizaNdo o NETBEaNs como IDE dE dEsENvoLvimENTo paRa iNTERFacEs GRFicas


O NetBeans uma IDE de desenvolvimento que oferece suporte aos mais variados segmentos de desenvolvimento Java, como por exemplo: aplicaes para console, dispositivos mveis, Desktop e web. No desenvolvimento de interfaces grficas, o NetBeans oferece um ambiente amigvel, simples e intuitivo. Para demonstrar como criar uma aplicao Desktop no NetBeans, ser criado uma aplicao de calculadora, que possui as operaes de soma, subtrao, diviso e multiplicao. O desenvolvimento da aplicao comear com uma aplicao Java simples chamada Calculadora. Para tal, selecione no NetBeans o menu Arquivo > Novo Projeto:

175
www.metodista.br/ead

Na aba Categorias, selecione a opo Java e na aba Projetos, selecione a opo Aplicao Java. Feito isso, clique em Prximo >, uma nova janela ser exibida, solicitando as informaes para criar o projeto:

Nesta janela, informe o Nome do Projeto (neste exemplo ser usado o nome Calculadora), informe tambm a Localizao do Projeto (local do computador onde ser salvo o projeto). Na opo Criar Classe Principal, possvel criar uma classe inicial no projeto. Neste exemplo no ser necessrio criar essa classe inicial, pois ser criada uma tela (JFrame) que ser a tela inicial do projeto. Em seguida, clique em Finalizar para terminar a criao do projeto. 176
Universidade Metodista de So Paulo

Inicialmente, o projeto ser dividido em 3 pastas (Pacotes de Cdigos-Fonte, Load Generator Scripts e Bibliotecas), sendo que na pasta Pacotes de Cdigo-Fonte sero criados os novos arquivos Java.

Clicando com o boto direito do mouse sobre a pasta Pacotes de Cdigo-Fonte, temos acesso a um menu de opes. Neste menu, especificamente na primeira opo Novo, possvel escolher qual o tipo de novo componente ser criado. Para a criao de uma janela ou tela, selecione a opo Form JFrame (Formulrio JFrame). Com isso, uma nova janela chamada New Form JFrame (Novo Formulrio JFrame) ser exibida. Defina o Nome da Classe como Calculadora e o Pacote como br.metodista.ead.ads3. tela, conforme a figura a seguir; em seguida, clique em Finalizar.

Quando uma classe de formulrio JFrame criado, o NetBeans automaticamente abre a visualizao de edio grfica:

177
www.metodista.br/ead

Ao lado direito temos a Paleta com a lista de componentes que podem ser colocados no JFrame e, logo abaixo, a janela de Propriedades. Ao lado esquerdo, temos a janela do Projeto logo abaixo, a janela de Navegador, que mostra os componentes que foram adicionados no JFrame. No boto Cdigo-Fonte (em baixo do nome da classe) altera o modo de visualizao para verificar o cdigo Java que foi criado automaticamente pelo NetBeans: package br.metodista.ead.ads3.tela; public class Calculadora extends javax.swing.JFrame { public Calculadora() { initComponents(); } @SuppressWarnings(unchecked) private void initComponents() { setDefaultCloseOperation(javax.swing.WindowConstants. EXIT_ON_CLOSE); org.jdesktop.layout.GroupLayout GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout. GroupLayout.LEADING) 178
Universidade Metodista de So Paulo

layout

new

org.jdesktop.layout.

.add(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout. GroupLayout.LEADING) .add(0, 300, Short.MAX_VALUE) ); pack(); } public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if (Nimbus.equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info. getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(Calculadora.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(Calculadora.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(Calculadora.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(Calculadora.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Calculadora().setVisible(true); } }); } } Um formulrio JFrame uma classe que estende a classe javax.swing.JFrame. O NetBeans, para facilitar o processo de criao das telas, cria um cdigo inicial para comear o desenvolvimento da tela, com um construtor para a classe, o mtodo initComponents(), que cria as instncias dos componentes de tela, e o mtodo main(), que cria um objeto dessa classe e o define como visvel. 179
www.metodista.br/ead

Observao: No modo de visualizao do cdigo fonte, algumas reas do cdigo esto com o fundo em cinza. Esses cdigos no podem ser alterados manualmente dentro do NetBeans, pois o prprio NetBeans ir gerenciar esses cdigos. Para adicionar um ttulo nesta tela JFrame, clique na rea cinza da Janela e na janela Propriedades, altere o valor da propriedade title para Calculadora. Aps isso, vamos comear a criar a calculadora adicionando trs Labels na tela. Para isso, selecione o item Label (correspondente a classe javax.swing.JLabel) na Paleta e o arraste trs vezes para dentro do JFrame. Faremos o mesmo com o item Campo de Texto (correspondente a classe javax.swing.JTextField), conforme a figura a seguir:

O Label representa um texto e o Campo de Texto uma rea em que o usurio pode digitar alguma informao. Clicando com o boto direito do mouse em cima dos componentes aberto um menu que permite editar o texto que eles apresentam e tambm alterar o nome das variveis. Altere os valores dos labels para Valor 1, Valor 2 e Resultado respectivamente, tambm apague o contedo das caixas de texto e altere os nomes das variveis para valor1, valor2 e resultado respectivamente. Observao: Algumas alteraes podem ser feitas atravs da janela Propriedades; quando clicar sobre um dos componentes da tela, a janela Propriedades apresentar as informaes referentes ao componente selecionado. Na janela de Propriedades, defina que o campo de texto resultado no possa ser editado. Para isso, desmarque a propriedade editable. Altere tambm as fontes dos Labels e das caixas de texto. Nesse exemplo, os labels ficaram com a fonte Verdana, tamanho 24 e negrito e as caixas de texto ficaram com a fonte Verdana e tamanho 18:

180
Universidade Metodista de So Paulo

Adicione neste JFrame quatro botes que representaram as aes somar, subtrair, multiplicar e dividir. Selecione na palheta o item Boto (correspondente a classe javax.swing.JButton) e adicione quatro botes na tela, altere seus textos para +, -, * e / e altere os nomes das variveis para somar, subtrair, multiplicar e dividir respectivamente. Altere, tambm, a fonte do texto para deixar os botes com um layout mais agradvel, por exemplo:

Observao: note que todos os componentes (JFrame, JButton, JTextField e JLabel) com os quais estamos trabalhando aqui so objetos. Quando adicionamos estes componentes na tela, estamos criando uma nova instncia dos objetos deles. Com a tela criada defina o comportamento que cada um dos botes ter. Em cada componente da tela possvel adicionar eventos que sero adicionados de acordo com as aes que os componentes sofrerem, por exemplo, para os botes possvel adicionar a ao actionPerformed, atravs do menu Eventos Action. Essa ao ser executada quando o boto for clicado pelo mouse.

181
www.metodista.br/ead

Ao clicar na ao actionPerformed, o NetBeans automaticamente altera a visualizao para o cdigo fonte no qual possvel definir qual ser o comportamento que o boto executar quando ele for clicado. No caso do boto + (somar), adicione o comportamento de somar os valores dos campos valor1 e valor2 e guardar o resultado no campo resultado: private void somarActionPerformed(java.awt.event.ActionEvent evt) { String textoValor1 = valor1.getText(); String textoValor2 = valor2.getText(); double a = Double.parseDouble(textoValor1); double b = Double.parseDouble(textoValor2); double total = a + b; String textoResultado = String.valueOf(total); resultado.setText(textoResultado); } O Campo de Texto possui o mtodo getText(), que devolve o texto que foi digitado dentro dele, e o mtodo setText(), que recebe uma String que ser apresentado dentro dele. Todo o contedo digitado no Campo de Texto tratado como String, portanto para fazermos o clculo com esses valores necessrio, previamente, convert-los para o tipo double. Para isso, utilize o mtodo parseDouble da classe Double, que recebe uma String e devolve um valor do tipo double. possvel simplificar esse cdigo fazendo a converso dos tipos na mesma linha em que eles so utilizados, por exemplo: private void somarActionPerformed(java.awt.event.ActionEvent evt) { double a = Double.parseDouble(valor1.getText()); double b = Double.parseDouble(valor2.getText()); resultado.setText(String.valueOf(a + b)); } Agora adicione comportamento para os botes - (subtrair), * (multiplicar) e / (dividir): private void subtrairActionPerformed(java.awt.event. ActionEvent evt) { double a = Double.parseDouble(valor1.getText()); double b = Double.parseDouble(valor2.getText()); resultado.setText(String.valueOf(a - b)); } private void multiplicarActionPerformed(java.awt.event. ActionEvent evt) { double a = Double.parseDouble(valor1.getText()); double b = Double.parseDouble(valor2.getText()); resultado.setText(String.valueOf(a * b)); } 182
Universidade Metodista de So Paulo

private void dividirActionPerformed(java.awt.event. ActionEvent evt) { double a = Double.parseDouble(valor1.getText()); double b = Double.parseDouble(valor2.getText()); resultado.setText(String.valueOf(a / b)); } Feito isso, salve o cdigo e execute-o atravs do menu Executar Executar Projeto (Calculadora) ou clicando com o boto direito sobre o cdigo e escolhendo o item Executar Arquivo ou pressionando as teclas Shift + F6.

O cdigo completo desse exemplo ficou assim: package br.metodista.ead.ads3.tela; public class Calculadora extends javax.swing.JFrame { public Calculadora() { initComponents(); } @SuppressWarnings(unchecked) private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); valor1 = new javax.swing.JTextField(); valor2 = new javax.swing.JTextField(); 183
www.metodista.br/ead

resultado = new javax.swing.JTextField(); somar = new javax.swing.JButton(); subtrair = new javax.swing.JButton(); multiplicar = new javax.swing.JButton(); dividir = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants. EXIT_ON_CLOSE); setTitle(Calculadora); jLabel1.setFont(new java.awt.Font(Verdana, 1, 24)); jLabel1.setText(Valor 1:); jLabel2.setFont(new java.awt.Font(Verdana, 1, 24)); jLabel2.setText(Valor 2:); jLabel3.setFont(new java.awt.Font(Verdana, 1, 24)); jLabel3.setText(Resultado:); valor1.setFont(new java.awt.Font(Verdana, 0, 18)); valor2.setFont(new java.awt.Font(Verdana, 0, 18)); resultado.setEditable(false); resultado.setFont(new java.awt.Font(Verdana, 0, 18)); somar.setFont(new java.awt.Font(Verdana, 0, 48)); somar.setText(+); somar.setMaximumSize(new java.awt.Dimension(85, 70)); somar.setMinimumSize(new java.awt.Dimension(85, 70)); somar.setPreferredSize(new java.awt.Dimension(85, 70)); somar.setSize(new java.awt.Dimension(85, 70)); somar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { somarActionPerformed(evt); } }); subtrair.setFont(new java.awt.Font(Verdana, 0, 48)); 184
Universidade Metodista de So Paulo

subtrair.setText(-); subtrair.setMaximumSize(new java.awt.Dimension(85, 70)); subtrair.setMinimumSize(new java.awt.Dimension(85, 70)); subtrair.setPreferredSize(new java.awt.Dimension(85, 70)); subtrair.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { subtrairActionPerformed(evt); } }); multiplicar.setFont(new java.awt.Font(Verdana, 0, 48)); multiplicar.setText(*); multiplicar.setMaximumSize(new java.awt.Dimension(85, 70)); multiplicar.setMinimumSize(new java.awt.Dimension(85, 70)); multiplicar.setPreferredSize(new java.awt.Dimension(85, 70)); multiplicar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { multiplicarActionPerformed(evt); } }); dividir.setFont(new java.awt.Font(Verdana, 0, 48)); dividir.setText(/); dividir.setMaximumSize(new java.awt.Dimension(85, 70)); dividir.setMinimumSize(new java.awt.Dimension(85, 70)); dividir.setPreferredSize(new java.awt.Dimension(85, 70)); dividir.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { dividirActionPerformed(evt); } }); org.jdesktop.layout.GroupLayout GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout. 185
www.metodista.br/ead

layout

new

org.jdesktop.layout.

GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout. GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop. layout.GroupLayout.LEADING) .add(jLabel2) .add(jLabel1)) .add(45, 45, 45) .add(layout.createParallelGroup(org.jdesktop. layout.GroupLayout.LEADING) .add(valor1) .add(valor2))) .add(layout.createSequentialGroup() .add(jLabel3) .addPreferredGap(org.jdesktop.layout. LayoutStyle.RELATED) .add(resultado))) .addContainerGap()) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .addContainerGap(24, Short.MAX_VALUE) .add(somar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 85, org.jdesktop. layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle. RELATED) .add(subtrair, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 85, org.jdesktop. layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle. RELATED) .add(multiplicar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 85, org. jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle. RELATED) .add(dividir, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 85, org.jdesktop. layout.GroupLayout.PREFERRED_SIZE) .add(18, 18, 18)) 186
Universidade Metodista de So Paulo

); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout. GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout. GroupLayout.BASELINE) .add(jLabel1) .add(valor1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop. layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle. RELATED) .add(layout.createParallelGroup(org.jdesktop.layout. GroupLayout.BASELINE) .add(jLabel2) .add(valor2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop. layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle. RELATED) .add(layout.createParallelGroup(org.jdesktop.layout. GroupLayout.BASELINE) .add(jLabel3) .add(resultado, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop. layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(49, 49, 49) .add(layout.createParallelGroup(org.jdesktop.layout. GroupLayout.BASELINE) .add(somar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 70, org.jdesktop. layout.GroupLayout.PREFERRED_SIZE) .add(subtrair, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 70, org. jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(multiplicar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 70, org. jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(dividir, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 70, org.jdesktop. layout.GroupLayout.PREFERRED_SIZE)) .addContainerGap(59, Short.MAX_VALUE)) );

187
www.metodista.br/ead

pack(); } private void somarActionPerformed(java.awt.event.ActionEvent evt) { double a = Double.parseDouble(valor1.getText()); double b = Double.parseDouble(valor2.getText()); resultado.setText(String.valueOf(a + b)); } private void subtrairActionPerformed(java.awt.event. ActionEvent evt) { double a = Double.parseDouble(valor1.getText()); double b = Double.parseDouble(valor2.getText()); resultado.setText(String.valueOf(a - b)); } private void multiplicarActionPerformed(java.awt.event. ActionEvent evt) { double a = Double.parseDouble(valor1.getText()); double b = Double.parseDouble(valor2.getText()); resultado.setText(String.valueOf(a * b)); } private void dividirActionPerformed(java.awt.event. ActionEvent evt) { double a = Double.parseDouble(valor1.getText()); double b = Double.parseDouble(valor2.getText()); resultado.setText(String.valueOf(a / b)); } public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if (Nimbus.equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info .getClassName()); 188
Universidade Metodista de So Paulo

break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(Calculadora.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(Calculadora.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(Calculadora.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(Calculadora.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Calculadora().setVisible(true); } }); } private javax.swing.JButton dividir; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JButton multiplicar; private javax.swing.JTextField resultado; private javax.swing.JButton somar; private javax.swing.JButton subtrair; private javax.swing.JTextField valor1; private javax.swing.JTextField valor2; } Nesse exemplo, foi criada uma aplicao Desktop usando a API de Swing, para desenhar a tela e os componentes que ela possui. Foram utilizados os componentes JFrame, JLabel, JTextField e JButton. A seguir, ser detalhado esses componentes: 189
www.metodista.br/ead

Utilizando o JFrame
O javax.swing.JFrame uma classe que representa uma janela ou quadro da aplicao Desktop. Nele possvel adicionar diversos componentes como botes, textos, campos de digitao, listas, imagens, menus, tabelas, entre outros. Alguns dos mtodos mais utilizados do JFrame so: JFrame.setDefaultCloseOperation(int operation), que define a forma como a janela do JFrame ser fechada, seus valores podem ser: - HIDE (a janela continua aberta, mas no mostrado na tela); - DO_NOTHING (no faz nada); - EXIT_ON_CLOSE (encerra todo o programa, usando o System.exit(0)); - DISPOSE (fecha a janela). Exemplo: setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); JFrame.setTitle(String title) usado para alterar o ttulo da janela, este mtodo recebe uma String como ttulo. Exemplo: setTitle(Primeiro Formulrio); JFrame.setResizable(Boolean resizable), dependendo do valor true (verdadeiro) ou false (falso), a janela JFrame permite ter seu tamanho alterado durante sua execuo. Exemplo: setResizable(false); JFrame.setName(String name) altera o nome da janela JFrame. Exemplo: setName(principal); A troca da cor do JFrame possvel ser feita da seguinte forma: this.getContentPane().setBackground(new java.awt.Color(204, 255, 204));

Utilizando o JTextField
O pacote Swing, conta com a classe chamada javax.swing.JTextField. Esta classe responsvel por permitir a digitao de um texto quando adicionada a um container (JFrame). Para adicion-lo a sua aplicao, localize-o no painel ao lado direito, na Paleta, clique sobre componente Caixa de Texto e clique sobre o JFrame. Aps a Caixa de Texto (JTextField) ter sido posicionado, possvel alterar sua disposio e tamanho no formulrio. Para facilitar a manuteno do programa, sempre altere o nome das variveis para um nome mais fcil de ser reconhecido. Este campo capaz de receber qualquer tipo de dado, seja ele numrico ou caractere, mas todos os caracteres digitados nele sero guardados dem de uma String. Alguns dos mtodos mais utilizados do JTextField so: JTextField.getText(), que retorna o valor digitado dentro do campo solicitado. Exemplo: String texto = entrada.getText(); JTextField.setText(String texto) altera o valor da Caixa de Texto, colocando uma nova String dentro do campo JTextField solicitado. Exemplo: entrada.getText(O texto deve estar entre aspas duplas); 190
Universidade Metodista de So Paulo

JTextField.setEditable(boolean valor), dependendo do valor passado true (verdadeiro) ou false (falso), permite ou no a edio do campo. Exemplo: entrada.setEditable(true); JTextField.setEnabled(boolean valor), dependendo do valor passado true (verdadeiro) ou false (falso), desativa o campo solicitado. Exemplo: entrada.setEnabled(false); JTextField.setFont(Font font) altera o tipo de formato da fonte do componente JTextField. Este mtodo recebe um objeto do tipo java.awt.Font, que define a fonte, estilo do texto e tamanho. Exemplo: entrada.setFont(new java.awt.Font(Arial, 1, 10)); JTextField.setBackground(Color c) altera a cor do fundo do JTextField. Este mtodo recebe um objeto do tipo java.awt.Color, que utiliza o padro RGB para definir a cor. Exemplo: entrada.setBackground(new java.awt.Color(204, 255, 204));

UTiLizaNdo JBuTToN
Assim como o JTextField, o componente javax.swing.JButton tambm faz parte do pacote Swing. Esta classe uma das mais importantes de todas as aplicaes, pois, na maioria dos casos, nela que adicionamos as aes que o programa executar. Para adicion-lo a sua aplicao, localize o Boto na Paleta e clique no JFrame na posio desejada. Depois de posicionado, possvel alterar sua disposio e tamanho. Tambm como foi feito com o JTextField, recomendvel alterar o texto e o nome da varivel que representar este componente no programa. Neste momento, aconselhvel uma ateno especial ao nome do boto para que o mesmo seja intuitivo no sentido de auxiliar ao usurio na utilizao do seu programa. Alguns dos mtodos mais utilizados do JButton so: JButton.getText(), que retorna o texto escrito no boto. O mesmo digitado na criao do programa pela opo Editar Texto, do boto direito do mouse. Exemplo: String texto = botao.getText(); JButton.setText(String texto) altera o texto do boto. Exemplo: botao.setText(O texto deve estar entre aspas duplas); JButton.setEnabled(boolean valor), dependendo do valor passado true (verdadeiro) ou false (falso), desativa o campo solicitado. Exemplo: botao.setEnabled(false); JButton.setFont(Font font) altera o tipo de formato da fonte do componente JButton. Este mtodo recebe um objeto do tipo java.awt.Font, que define a fonte, estilo do texto e tamanho. Exemplo: botao.setFont(new java.awt.Font(Arial, 1, 10)); JButton.setBackground(Color c) alterar a cor do fundo do JButton. Este mtodo recebe um objeto do tipo java.awt.Color, que utiliza o padro RGB para definir a cor. Exemplo: botao.setBackground(new java.awt.Color(204, 255, 204)); JButton.setIcon(ImageIcon imageIcon) adiciona um cone no boto. Este mtodo recebe um objeto do tipo javax.swing.ImageIcon, que representa uma imagem e esta imagem pode estar no seu projeto ou pode estar em algum diretrio do computador. Exemplo: 191
www.metodista.br/ead

botao.setIcon(new ok.jpg)));

javax.swing.ImageIcon(getClass()

.getResource(/imagens/

UTiLizaNdo o JLaBEL
O javax.swing.JLabel um componente utilizado para mostrar textos ou imagens na tela. Para adicion-lo a sua aplicao, localize o Label na Paleta e clique no JFrame na posio desejada. Depois de posicionado, possvel alterar sua disposio, tamanho, texto e nome. Alguns dos mtodos mais utilizados do JLabel so: JLabel.getText(), que retorna o texto escrito no boto. O mesmo digitado na criao do programa pela opo Editar Texto, do boto direito do mouse. Exemplo: String texto = saida.getText(); JLabel.setText(String texto) coloca uma String dentro do JLabel solicitado. A propriedade text do JLabel pode receber um texto no formato HTML. Exemplo: saida.setText(O texto deve estar entre aspas duplas); JLabel.setFont(Font font) altera o tipo de formato da fonte do componente JLabel. Este mtodo recebe um objeto do tipo java.awt.Font, que define a fonte, estilo do texto e tamanho. Exemplo: saida.setFont(new java.awt.Font(Arial, 1, 10)); JLabel.setBackground(Color c) alterar a cor do fundo do JLabel. Este mtodo recebe um objeto do tipo java.awt.Color, que utiliza o padro RGB para definir a cor. Exemplo: saida.setBackground(new java.awt.Color(204, 255, 204)); JLabel.setIcon(ImageIcon imageIcon) adiciona uma imagem no JLabel. Este mtodo recebe um objeto do tipo javax.swing.ImageIcon, que representa uma imagem e esta imagem pode estar no seu projeto ou pode estar em algum diretrio do computador. Exemplo: saida.setIcon(new javax.swing.ImageIcon(getClass(). getResource(/imagens/saida. jpg)));

UTiLizaNdo o JComBoBox
O JComboBox utilizado para mostrar uma lista de itens em que o usurio deve escolher um desses itens. Para adicion-lo a sua aplicao, localize a Caixa de Combinao na Paleta e clique no JFrame na posio desejada. Depois de posicionado, possvel alterar sua disposio, tamanho, texto e nome. Alguns dos mtodos mais utilizados do JComboBox so: JComboBox.setModel(ComboBoxModel aModel) adiciona os itens que sero listados no JComboBox. Exemplo: cmbNomes.setModel(new javax.swing.DefaultComboBoxModel(new String[] { Rafael, Cristiano, Leonardo })); JComboBox.getSelectedItem() retorna o item que foi selecionado no formato de Objeto. Exemplo: String nomeSelecionado = (String) cmbNomes.getSelectedItem(); JComboBox.setMaximumRowCount(int count) define qual a quantidade mxima de itens sero exibidos no JComboBox, se o tamanho mximo for menor que a quantidade de itens no JComboBox, ento ser mostrado uma barra de rolagem nele. Exemplo: 192
Universidade Metodista de So Paulo

cmbNomes.setMaximumRowCount(2); JComboBox.setFont(Font font) altera o tipo de formato da fonte do componente JComboBox. Este mtodo recebe um objeto do tipo java.awt.Font, que define a fonte, estilo do texto e tamanho. Exemplo: cmbNomes.setFont(new java.awt.Font(Verdana, 1, 12));

CoNcLuso
A linguagem de programao Java permite que os desenvolvedores possam criar aplicaes Desktop, desde aplicaes pequenas e simples at aplicaes complexas e empresariais. Nesse texto, foi apresentado uma breve introduo aos componentes do pacote javax.swing e como eles so utilizados na montagem de uma aplicao Desktop.

REFERNcias
DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8 ed. So Paulo: Pearson, 2010. HORSTMANN, Cay S.. Big Java. 4 ed. Porto Alegre: Bookman, 2006. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8 ed. So Paulo: Pearson, 2009. ORACLE. What is Swing? Disponvel em: <http://docs.oracle.com/javase/tutorial/ui/overview/intro.html>. Acesso em: 16 Out. 2012.

193
www.metodista.br/ead

_________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________
194
Universidade Metodista de So Paulo

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________

Implementao de Sistemas Cliente Servidor

Criando aplicaes desktop que gravam informaes em arquivos texto


Prof. Rafael Guimares Sakurai Objetivo:
Apresentar componentes Swing para desenvolvimento de telas para aplicativos desktop.

Mdulo

Palavras-chave:

Java, Swing, io

www.metodista.br/ead

No desenvolvimento de aplicaes Swing, existe diversos componentes que podem ser utilizados para a criao das telas. Nesse texto sero abordados vrios componentes como JTable, JMenu, JFileChooser, JScroolPane, entre outros, utilizando alguns exemplos simples. Tambm ser apresentado um exemplo que obtm os dados de um formulrio e grava essas informaes em um arquivo no formato texto.

GRavaNdo iNFoRmaEs Em aRQuivo TExTo


Nesse exemplo ser criada uma aplicao desktop chamada Contatos usando a linguagem Java, que permitir cadastrar contatos (com nome e telefone) e gravar as informaes em arquivo texto. Para representar um contato com nome e telefone, crie a seguinte classe Java: package br.metodista.ead.ads3.modelo; public class Contato { private String nome; private String telefone; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; } } Ser criado uma tela utilizando o JFrame para montar o cadastro dos contatos e listar os contatos em uma tabela. A tela ficar com a seguinte aparncia:

196
Universidade Metodista de So Paulo

Para comear, crie uma tela (JFrame) e adicione os componentes de Label (JLabel) para representar os textos fixos, adicione dois Campo de Texto (JTextField) para o usurio digitar as informaes e um boto (JButton) para adicionar um novo contato. Para criar uma linha de separao, adicione tambm o componente Separador (correspondente a classe javax.swing. JSeparator) na tela:

Altere o nome das variveis de caixas de texto para nome e telefone. Altere, tambm, o nome da varivel do boto para adicionar. A parte da tela que cadastrar os contatos est pronta. Para visualizar os contatos cadastrados ser adicionado o componente Painel de Rolagem (correspondente a classe javax.swing. JScrollPane), que ser utilizado para controlar se for necessrio, uma barra de rolagem horizontal e vertical:

197
www.metodista.br/ead

E, em cima do Painel de Rolagem ser adicionada uma Tabela (correspondente a classe javax.swing.JTable). Nessa tabela, sero adicionados os contatos cadastrados:

Uma JTable possui um modelo que conter os contatos cadastrados, permitindo adicionar novos contatos na tabela. Esse modelo representado por uma subclasse de AbsctractTableModel, exemplo: package br.metodista.ead.ads3.tela; import javax.swing.table.AbstractTableModel; public class ContatoTableModel extends AbstractTableModel { @Override public int getRowCount() { throw new UnsupportedOperationException(Not supported yet.); } @Override public int getColumnCount() { throw new UnsupportedOperationException(Not supported yet.); } @Override public Object getValueAt(int linha, int coluna) { throw new UnsupportedOperationException(Not supported yet.); } } 198
Universidade Metodista de So Paulo

Ao estender a classe AbstractTableModel preciso implementar trs mtodos: - getRowCount() Retorna a quantidade de linhas da tabela. - getColumnCount() Retorna a quantidade de colunas da tabela. - getValueAt(int linha, int coluna) Retorna o valor da tabela com base na linha e coluna informada. Para guardar os contatos na tabela, ser utilizada uma List<Contato>: private List<Contato> contatos = new ArrayList<Contato>(); Implemente os trs mtodos com o auxlio da lista de contatos: @Override public int getRowCount() { // Retorna o tamanho da lista. return contatos.size(); } @Override public int getColumnCount() { // Retorna o nmero fixo 2, como quantidade de colunas. return 2; } @Override public Object getValueAt(int linha, int coluna) { // Obtm o contato da linha. Contato c = contatos.get(linha); // De acordo com a coluna devolve o valor. switch(coluna) { case 0: return c.getNome(); case 1: return c.getTelefone(); default: return null; } } Para definir os nomes das colunas, necessrio implementar o mtodo getColumnName(int coluna): @Override 199
www.metodista.br/ead

public String getColumnName(int coluna) { switch(coluna) { case 0: return Nome; case 1: return Telefone; default: return ; } } Com o comportamento bsico da tabela criado, inclua o mtodo adicionar(Contato c), que recebe um contato que deve ser adicionado na tabela: public void adicionar(Contato c) { contatos.add(c); fireTableRowsInserted(contatos.size()-1, contatos.size()-1); } Aps criar a classe ContatoTableModel necessrio especificar quando criar a JTable para ele utilizar essa classe como modelo. Para isso, crie um objeto dentro da classe da tela: private ContatoTableModel tabela = new ContatoTableModel(); Aps isso, personalize o cdigo da criao do JTable para utilizar este modelo. Para isso, clique com o boto direito do mouse em cima da JTable e escolha a opo Personalizar Cdigo... Na janela de personalizar cdigo, altere a segunda opo para propriedade personalizada e modifique o contedo do cdigo que inicializa os valores da tabela para utilizar a varivel tabela declarada anteriormente.

200
Universidade Metodista de So Paulo

Agora, adicione o comportamento do boto, crie um evento actionPerformed e quando o boto for acionado, crie um novo contato; adicione o novo contato na lista; e atualize a tabela com o novo contato: private void adicionarActionPerformed(java.awt.event.ActionEvent evt) { if(validarCampos()) { Contato c = new Contato(); c.setNome(nome.getText()); c.setTelefone(Integer.valueOf(telefone.getText())); tabela.adicionar(c); JOptionPane.showMessageDialog(this, Contato adicionado!, Cadastro de Contato, JOptionPane.INFORMATION_MESSAGE); limparCampos(); } } Nesse mtodo realizado uma validao dos campos atravs do mtodo validarCampos. Se os campos estiverem corretos, cria-se um novo objeto do tipo Contato, adiciona o contato na tabela, apresenta uma mensagem informativa e limpa os campos. O componente javax.swing.JOptionPane utilizado para apresentar uma caixa de mensagem na qual pode ser apresentado uma simples mensagem de alerta, uma mensagem de confirmao, entre outros. O mtodo validarCampos() verifica se os campos foram preenchidos, se o telefone tem 8 ou 9 nmeros e se o telefone numrico: private boolean validarCampos() { boolean valido = true; if(nome.getText() == null || .equals(nome.getText())) { JOptionPane.showMessageDialog(this, Campo nome obrigatrio!, Cadastros de Contato, JOptionPane.ERROR_MESSAGE); valido = false; } if(telefone.getText() == null || .equals(telefone.getText())) { JOptionPane.showMessageDialog(this, Campo telefone obrigatrio!, Cadastros de Contato, JOptionPane.ERROR_MESSAGE); valido = false; } else if(!(telefone.getText().length() == 8 || telefone.getText().length() == 9)) { JOptionPane.showMessageDialog(this, Campo telefone deve ter 8 ou 9 nmeros!, Cadastros de Contato, JOptionPane.ERROR_MESSAGE); 201
www.metodista.br/ead

valido = false; } else { try { Integer numero = Integer.valueOf(telefone.getText()); } catch (Exception ex) { JOptionPane.showMessageDialog(this, Campo telefone deve ser nmerico!, Cadastros de Contato, JOptionPane.ERROR_MESSAGE); valido = false; } } return valido; } E o mtodo limparCampos() apaga o contedo do campo nome e telefone: private void limparCampos() { nome.setText(null); telefone.setText(null); } Adicione mais um mtodo para gravar as informaes do contato em um arquivo no formato texto. private void gravarContato(Contato contato) { FileWriter fw = null; try { fw = new FileWriter( new File(C:/contatos.txt), true); fw.write(contato.getNome() + - + contato.getTelefone() + \r); } catch (IOException e) { JOptionPane.showMessageDialog(this, Erro ao gravar o arquivo!, Cadastros de Contato, JOptionPane.ERROR_MESSAGE); } finally { if(fw != null) { try { fw.close(); } catch (IOException e) { JOptionPane.showMessageDialog(this, Erro ao fechar o arquivo!, Cadastros de Contato, JOptionPane.ERROR_MESSAGE); } } 202
Universidade Metodista de So Paulo

} } O FileWriter uma classe que permite escrever textos dentro de um arquivo. Nesse cdigo obtido um arquivo new File(endereco/nomearquivo.formato). Se o arquivo existir utiliza o arquivo existente, caso contrrio cria um novo arquivo. Escreve dentro do arquivo (fw. write(texto)) e fecha o arquivo (fw.close()) para salvar o texto. Adicione no mtodo adicionarActionPerformed() uma chamada para o mtodo gravarContato(): gravarContato(c); Teste a aplicao para verificar se ao criar um novo contato ele aparecer na tabela da tela e, tambm, se ser gravado no arquivo c:/contatos.txt.

EscoLhENdo aRQuivos com JFiLEChoosER


Existe um componente Swing que serve para localizar e selecionar um ou mais arquivos ou diretrios no sistema operacional. Seu nome javax.swing.JFileChooser (Selecionador de Arquivo). O exemplo a seguir cria uma aplicao chamada Listar Contatos, para mostrar o contedo de um arquivo texto:

Depois de montada a tela, adicione a ao actionPerformed no boto Pesquisar, que ser responsvel por abrir a tela do Selecionador de Arquivo (JFileChooser) e mostrar o contedo do arquivo escolhido dentro da rea de Texto (correspondente a classe javax.swing.JTextArea): private void pesquisarActionPerformed(java.awt.event.ActionEvent evt) { try { JFileChooser fc = new JFileChooser(); 203
www.metodista.br/ead

fc.setFileSelectionMode(JFileChooser.FILES_ONLY); fc.showOpenDialog(this); File arquivo = fc.getSelectedFile(); if(arquivo != null) { caminho.setText(arquivo.getAbsolutePath()); String texto = ; Scanner s = new Scanner(arquivo); while(s.hasNextLine()) { texto += s.nextLine(); } conteudo.setText(texto); } } catch (IOException e) { JOptionPane.showMessageDialog(this, Erro ao ler o arquivo de contatos!, Cadastros de Contato, JOptionPane.ERROR_MESSAGE); } } Nas propriedades do JFileChooser possvel definir atravs da propriedade fileSelectionMode se o Selecionador de Arquivo ir aceitar FILES_ONLY (Somente Arquivos), DIRECTORIES_ ONLY (Somente Diretrios) e FILES_AND_DIRECTORIES (Arquivos e Diretrios). Quando executar a aplicao, ser apresentada a seguinte tela:

Ao clicar no boto Pesquisar, abre-se a janela do Selecionador de Arquivos:

204
Universidade Metodista de So Paulo

Depois que selecionar o arquivo texto, clique no boto Abrir e ser apresentado o contedo do arquivo na rea de Texto:

UTiLizaNdo o JMENuBaR, JMENu E JMENuITEm


O componente JMenuBar utilizado para montar uma barra do menu, em que dentro dessa barra so adicionados os componentes JMenu, que criam os menus, e o JMenuItem cria os itens do menu. Nesse exemplo, ser criado um menu para fechar a aplicao e dois menus que sero utilizados para abrir outras telas.

205
www.metodista.br/ead

Crie um JFrame chamado Biblioteca e adicione dentro dele uma Barra de Menu (JMenuBar):

Ao adicionar um JMenuBar na tela, o mesmo j vem com dois JMenu (File e Edit). Altere os textos deles para Arquivo e Livro, depois altere o nome das variveis para menuArquivo e menuLivro, respectivamente:

206
Universidade Metodista de So Paulo

Agora, dentro do menu Arquivo adicione um Item de Menu (JMenuItem). Esse item ter o nome Sair e o nome da vari vel ser arquivoSair. A JFrame ficar com a seguinte aparncia:

O item Sair ser utilizado para encerrar a aplicao. Clique com o boto direito do mouse nele e adicione o evento actionPerformed: private void menuSairActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); } Dentro do menu Livro, adicione os Itens de Menu Novo e Listar. Altere os nomes das variveis para livroNome e livroListar, respectivamente:

Agora, crie um novo JFrame chamado LivroNovo, que possui um formulrio para cadastrar novos livros:

207
www.metodista.br/ead

Crie tambm um JFrame chamado LivroListar, que ser usado para apresentar todos os livros cadastrados:

Depois de criadas as telas LivroNovo e LivroListar, adicione as aes nos itens do menu da tela Biblioteca: O item do menu Livro Novo ter o seguinte cdigo, que serve para abrir a tela de LivroNovo. private void menuNovoActionPerformed(java.awt.event.ActionEvent evt) { LivroNovo ln = new LivroNovo(); ln.setVisible(true); } Listar. O item do menu Livro Listar ter o seguinte cdigo, que serve para abrir a tela de Livrosprivate void menuListarActionPerformed(java.awt.event.ActionEvent evt) { LivroListar ll = new LivroListar(); ll.setVisible(true); } Execute a aplicao para verificar o comportamento dos itens do menu.

CoNcLuso
Nesse texto, foi apresentado novos componentes do pacote javax.swing, que permitem a criao de telas mais completas e complexas. Tambm foi apresentado um exemplo de formulrio no qual seus dados so guardados em objetos e em arquivo texto.

Referncias DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8. ed. So Paulo: Pearson, 2010. HORSTMANN, Cay S. Big Java. 4. ed. Porto Alegre: Bookman, 2006. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8. ed. So Paulo: Pearson, 2009. 208
Universidade Metodista de So Paulo

Implementao de Sistemas Cliente Servidor

Criando uma aplicao Swing com acesso ao banco de dados


Prof. Rafael Guimares Sakurai

Mdulo

Apresentar o desenvolvimento de uma aplicao Swing que utiliza banco de dados.

Objetivo:

Java; Swing; Banco de Dados

Palavras-chave:

www.metodista.br/ead

As aplicaes desktop normalmente fazem uso de algum banco de dados para armazenar as informaes. Nesse texto, ser abordado um exemplo simples de aplicao que controla as operaes de um Valet e utiliza o banco de dados Oracle para guardar as informaes de cadastros. Crie uma aplicao Java chamada ValetDesk com uma tela para controlar o Valet. A aplicao ficar com a seguinte aparncia:

Crie um JFrame e adicione campos para digitar o Modelo e Placa do veculo, tabela para visualizar os Valets dos carros que esto na garagem e os botes Adicionar, Finalizar e Novo para controlar as aes da tela:

210
Universidade Metodista de So Paulo

Com a tela criada, crie a classe Valet com as informaes de id, modelo, placa, data de entrada, data de sada e valor pago. package br.metodista.ead.ads3.modelo; import java.util.Date; public class Valet { private Long id; private String modelo; private String placa; private Date entrada; private Date saida; private Double valor; public Valet() { } public Valet(String modelo, String placa) { this.modelo = modelo; this.placa = placa; this.entrada = new Date(); } public Valet(Long id, String modelo, String placa, Date entrada) { this.id = id; this.modelo = modelo; this.placa = placa; this.entrada = entrada; } public Valet(Long id, String modelo, String placa, Date entrada, Date saida, Double valor) { this.id = id; this.modelo = modelo; this.placa = placa; this.entrada = entrada; this.saida = saida; this.valor = valor; 211
www.metodista.br/ead

} public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getModelo() { return modelo; } public void setModelo(String modelo) { this.modelo = modelo; } public String getPlaca() { return placa; } public void setPlaca(String placa) { this.placa = placa; } public Date getEntrada() { return entrada; } public void setEntrada(Date entrada) { this.entrada = entrada; } public Date getSaida() { return saida; } public void setSaida(Date saida) { this.saida = saida; } public Double getValor() { return valor; } public void setValor(Double valor) { this.valor = valor; } } Observao: adicione no projeto o driver JDBC para conectar no banco de dados Oracle, crie uma sequence chamada VALET_SEQ e a tabela VALET com as colunas ID, MODELO, PLACA, ENTRADA, SAIDA e VALOR. Para persistir as informaes no banco de dados Oracle, crie a classe ValetDAO. Nela adicione os mtodos para conectar e desconectar do banco de dados, inserir e atualizar os dados de um Valet e consultar todos os Valets que ainda no tem data de sada: package br.metodista.ead.ads3.dao; import br.metodista.ead.ads3.modelo.Valet; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; 212
Universidade Metodista de So Paulo

import java.util.GregorianCalendar; import java.util.List; import java.util.Random; public class ValetDAO { private Connection conectar() throws Exception { try { /* Carrega o driver de conexo do Oracle. */ Class.forName(oracle.jdbc.driver.OracleDriver); /* Cria a conexo com o Oracle. */ Connection conn = DriverManager.getConnection(jdbc:oracle:thin:@ localhost:1521:XE, root, root); System.out.println(Conectado no banco da dados.); return conn; } catch (Exception ex) { ex.printStackTrace(); throw new Exception(Erro ao conectar no BD.); } } /** * Mtodo que fecha a conexo com o banco de dados. */ public void desconectar(Connection conn) throws Exception{ try { /* Fecha a conexo com o banco de dados. */ if (conn != null) { conn.close(); System.out.println(Desconectado do banco de dados.); } } catch (SQLException ex) { ex.printStackTrace(); throw new Exception(No conseguiu fechar a conexo.); } } public Valet salvar(Valet valet) throws Exception { 213
www.metodista.br/ead

Connection conn = conectar(); PreparedStatement stm = null; ResultSet rs = null; try { // Salva um novo Valet. if (valet.getId() == null) { DUAL; String consultarId = SELECT VALET_SEQ.NEXTVAL AS PROXIMO_ID FROM stm = conn.prepareStatement(consultarId); rs = stm.executeQuery(); if (rs.next()) { valet.setId(rs.getLong(PROXIMO_ID)); (?, ?, ?, ?); String inserir = INSERT INTO VALET (ID, MODELO, PLACA, ENTRADA) VALUES stm = conn.prepareStatement(inserir); stm.setLong(1, valet.getId()); stm.setString(2, valet.getModelo()); stm.setString(3, valet.getPlaca()); stm.setTimestamp(4, new java.sql.Timestamp(valet.getEntrada().getTime())); stm.execute(); } // Atualiza um Valet. } else { String atualizar = UPDATE VALET SET MODELO = ?, PLACA = ?, ENTRADA = ?, SAIDA = ?, VALOR = ? WHERE ID = ?; stm = conn.prepareStatement(atualizar); stm.setString(1, valet.getModelo()); stm.setString(2, valet.getPlaca()); stm.setDate(3, new java.sql.Date(valet.getEntrada().getTime())); stm.setDate(4, new java.sql.Date(valet.getSaida().getTime())); stm.setDouble(5, valet.getValor()); stm.setLong(6, valet.getId()); stm.executeUpdate(); } } catch (SQLException ex) { ex.printStackTrace(); throw new Exception(Erro ao salvar o Valet.); 214
Universidade Metodista de So Paulo

} finally { if (rs != null) { rs.close(); } if (stm != null) { stm.close(); } desconectar(conn); } return valet; } public List<Valet> consultarValetsGaragem() throws Exception { List<Valet> valets = new ArrayList<Valet>(); Connection conn = conectar(); PreparedStatement stm = null; ResultSet rs = null; try { da; String consulta = SELECT * FROM Valet WHERE saida IS NULL ORDER BY entrastm = conn.prepareStatement(consulta); rs = stm.executeQuery(); while (rs.next()) { Valet valet = new Valet(rs.getLong(ID), rs.getString(MODELO), rs.getString(PLACA), new Date(rs.getTimestamp(ENTRADA).getTime())); valets.add(valet); } } catch (SQLException ex) { ex.printStackTrace(); throw new Exception(Erro ao consultar os valets.); } finally { if (rs != null) { rs.close(); } if (stm != null) { stm.close(); 215
www.metodista.br/ead

} desconectar(conn); } return valets; } } Para apresentar os dados na JTable, crie uma classe chamada ValetTableModel que herda de AbstractTableModel. package br.metodista.ead.ads3.telas; import br.metodista.ead.ads3.dao.ValetDAO; import br.metodista.ead.ads3.modelo.Valet; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import javax.swing.table.AbstractTableModel; public class ValetTableModel extends AbstractTableModel { private List<Valet> valets = new ArrayList<Valet>(); private DateFormat df = new SimpleDateFormat(dd/MM/yyyy HH:mm); public ValetTableModel() { try { ValetDAO dao = new ValetDAO(); List<Valet> lista = dao.consultarValetsGaragem(); valets.addAll(lista); } catch (Exception e) { e.printStackTrace(); } } @Override public int getRowCount() { return valets.size(); }

216
Universidade Metodista de So Paulo

@Override public int getColumnCount() { return 3; } @Override public Object getValueAt(int linha, int coluna) { Valet v = valets.get(linha); switch(coluna) { case 0: return df.format(v.getEntrada()); case 1: return v.getModelo(); case 2: return v.getPlaca(); default: return ; } } @Override public String getColumnName(int coluna) { switch(coluna) { case 0: return Data Entrada; case 1: return Modelo; case 2: return Placa; default: return ; } } public void adicionar(Valet v) { valets.add(v); fireTableRowsInserted(valets.size()-1, valets.size()-1); 217
www.metodista.br/ead

} public void remover(int linha) { valets.remove(linha); fireTableRowsInserted(valets.size()-1, valets.size()-1); } public Valet getValet(int linha) { return valets.get(linha); } } Na tela, crie um atributo para representar o ValetDataModel e personalize o cdigo de criao do JTable para utilizar esse modelo. private ValetTableModel tabela = new ValetTableModel(); Adicione tambm na tabela o evento de mouseClicked para obter o Valet da tabela que foi clicado e preencher os dados do formulrio: private void jTable1MouseClicked(java.awt.event.MouseEvent evt) { //Obtm o Valet da linha que foi clicada. Valet v = tabela.getValet(jTable1.getSelectedRow()); //Coloca os dados do Valet nos campos da tela. modelo.setText(v.getModelo()); placa.setText(v.getPlaca()); try { DateFormat df = new SimpleDateFormat(dd/MM/yyyy HH:mm); entrada.setText(df.format(v.getEntrada())); } catch (Exception e) { e.printStackTrace(); } v.setValor(obterValor(v.getEntrada())); valor.setText(R$ + String.valueOf(v.getValor())); selecionado = v; } Crie tambm um atributo para guardar o Valet que foi selecionado na tabela: private Valet selecionado = null; Para calcular o valor que deve ser pago pelo Valet, utilize o seguinte mtodo, que calcula R$ 3,00 pela primeira hora e mais R$ 2,00 para cada hora adicional: private double obterValor(Date entrada) { 218
Universidade Metodista de So Paulo

long tempo = System.currentTimeMillis() - entrada.getTime(); long horas = tempo / 1000 / 60 / 60; long minutos = (tempo / 1000 / 60) % 60; double valor = 3; // R$3,00 a primeira hora if(horas > 1) { valor = (horas - 1) * 2; // R$2,00 a hora } if(minutos > 0) { valor += 2; } return valor; } Assim, quando uma linha da tabela for clicada, ser obtido o Valet da linha e calculado o valor que deve ser pago:

219
www.metodista.br/ead

Para controlar as aes da tela, adicione os eventos para os botes da tela, no boto Novo limpe os campos da tela: private void novoActionPerformed(java.awt.event.ActionEvent evt) { limpar(); } private void limpar() { modelo.setText(null); placa.setText(null); entrada.setText(null); valor.setText(null); } Ao clicar no boto Novo, limpa os dados do formulrio: No boto Adicionar, crie um novo Valet, adicione-o na tabela e depois limpe os dados do formulrio:

private void adicionarActionPerformed(java.awt.event.ActionEvent evt) { try { Valet v = new Valet(modelo.getText(), placa.getText()); ValetDAO dao = new ValetDAO(); v = dao.salvar(v); 220
Universidade Metodista de So Paulo

tabela.adicionar(v); limpar(); } catch (Exception e) { JOptionPane.showMessageDialog(this, e.getMessage(), Controle de Valet, JOptionPane.ERROR_MESSAGE); } } Ao adicionar um novo Valet, esse novo registro adicionado na tabela e o formulrio limpo:

E para finalizar um servio de Valet implemente o cdigo do evento de clique do boto Finalizar, que define a data de sada do veculo, salve o Valet atualizado, remova o Valet da JTable e limpa os campos do formulrio: private void finalizarActionPerformed(java.awt.event.ActionEvent evt) { try { selecionado.setSaida(new Date()); ValetDAO dao = new ValetDAO(); dao.salvar(selecionado); tabela.remover(jTable1.getSelectedRow()); limpar(); } catch (Exception e) { e.printStackTrace(); } } 221
www.metodista.br/ead

Ao clicar no boto Finalizar, limpa os campos do formulrio e remove o registro do Valet da tabela:

Execute a aplicao para visualizar o comportamento da tela, crie novos Valets e finalize alguns Valets para testar os eventos dos botes.

CoNcLuso
Nesse exemplo foi criada uma aplicao desktop utilizando a API de Swing que faz comunicao com o banco de dados Oracle. Nessa aplicao utilizou-se os componentes JButton, JTable, JTextField, JScrollBar e JLabel e foi criado uma classe de acesso ao banco de dados (DAO) que executa as operaes bsicas para persistir e consultar os dados.

Referncias DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8 ed. So Paulo: Pearson, 2010. HORSTMANN, Cay S. Big Java. 4. ed. Porto Alegre: Bookman, 2006. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8. ed. So Paulo: Pearson, 2009.

222
Universidade Metodista de So Paulo

Implementao de Sistemas Cliente Servidor


Mdulo

Conexo com bancos de dados utilizando a Java Database Connectivity


Prof. Cristiano Camilo dos Santos de Almeida Objetivo:

Apresentar a Java Database Connectivity (JDBC), um conjunto de interfaces e classes que definem a forma padro de comunicao do Java com diferentes bancos de dados disponveis hoje no mercado. O exemplo que veremos foi preparado para estabelecer uma conexo com o banco de dados MySQL.

Java, JDBC, Base de Dados.

Palavras-chave:

www.metodista.br/ead

O banco de dados onde persistimos (armazenamos) os dados que pertencem ao nosso sistema. A maioria dos bancos de dados comerciais, hoje em dia, do tipo relacional e derivam de uma estrutura diferente da orientada a objetos. Para executarmos o manuseio de informaes em um banco de dados, devemos fazer uso de sublinguagens de banco de dados (Database Sub Language DSL) voltadas para os objetos e operaes do banco de dados. Geralmente, as sublinguagens de dados so compostas da combinao de recursos para a definio de dados (Data Definition Language DDL) e recursos especficos para a manipulao de dados (Data Manipulation Language DML). A conhecida linguagem de consulta SQL (Structured Query Language) uma destas linguagens que fornece suporte tanto a DDL como a DML. A linguagem Java implementa um conceito de ponte para efetivarmos a conexo de um programa com uma base de dados qualquer, que disponibiliza todas as funcionalidades que um banco de dados padro deve nos fornecer.

Figura 1

No desenho anterior podemos notar o relacionamento direto da JDBC com o banco de dados, porm este relacionamento depende tambm da extenso desta ponte que representada pela implementao JDBC escolhida. Esta implementao depende do banco de dados com o qual queremos nos comunicar e a ela damos o nome de Driver. Para gerenciar estes drivers de conexo, a linguagem Java possui um gerente de drivers chamado java.sql.DriverManager. Atualmente, existe uma srie de bancos de dados no mercado que j possuem conectividade com a linguagem Java. Para tanto, normalmente, os fabricantes destas bases de dados disponibilizam drivers de conexo com as suas bases de dados gratuitamente, tal como a Oracle para seus bancos de dados MySQL e Oracle, a Microsoft com o SQL Server, entre outros. Assim sendo, escolha o driver adequado ao seu banco de dados no site de seu fabricante e adicione ao seu projeto. Por exemplo, o driver do MySQL, que pode ser obtido no site da Oracle ou utilizado o driver que vem com o NetBeans. Para ser utilizado basta ser adicionado atravs das Propriedades do Projeto, na aba Biblioteca utilize o boto Adicionar Biblioteca.

224
Universidade Metodista de So Paulo

Figura 2 -

Ser apresentado uma lista de bibliotecas que j vem includas no NetBeans. Selecione o MySQL JDBC Driver e clique em Adicionar Biblioteca.

Figura 3

Observao: caso queria colocar o driver de outro banco de dados preciso clicar no boto Adicionar JAR/Pasta e selecionar o arquivo com a extenso .jar, que representa o driver desejado. Com o driver do banco de dados adicionado ao projeto, podemos criar uma conexo com o banco de dados. Primeiramente, necessrio carregar a classe do driver atravs do mtodo Class. forName(). Esse mtodo carregar a classe na memria da aplicao. 225
www.metodista.br/ead

Com o driver carregado, utilizaremos a classe DriverManager, que conecta a uma determinada base de dados atravs do mtodo getConnection(url, user, password) e devolve um objeto do tipo Connection. O cdigo a seguir apresenta como conectar e desconectar de um banco de dados utilizando o JDBC: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Conexao { public static void main(String[] args) { Conexao conexao = new Conexao(); Connection conn = conexao.conectar(); conexao.desconectar(conn); } public Connection conectar(){ Connection conn = null; try{ Class.forName(com.mysql.jdbc.Driver); Conn = DriverManager.getConnection(jdbc:mysql:+ //localhost/test,root,root); } catch(SQLException ex){ ex.printStackTrace(); System.out.println(Erro na conexo ao BD!); } catch(ClassNotFoundException ex){ ex.printStackTrace(); System.out.println(Erro para obter o Driver do BD!); } return conn; } private void desconectar(Connection conn) { try{ if(conn != null && !conn.isClosed()){ System.out.println(Desconectado com sucesso); } } catch(SQLException ex){ ex.printStackTrace(); 226
Universidade Metodista de So Paulo

System.out.println(Erro na conexo ao BD); } } } No incio do cdigo da classe, na chamada de Class.forName, estamos carregando o driver do banco de dados MySQL com.mysql.jdbc.Driver. Em seguida utilizamos o mtodo getConnection da classe DriverManager para criar uma conexo com o banco de dados armazenado em um objeto do tipo java.sql.Connection. O mtodo getConnection() recebe trs parmetros: 1 URL de conexo com o banco de dados, 2 o usurio, e 3 a senha. Para fazer a conexo com o banco de dados precisamos tratar algumas excees que podem ocorrer. No primeiro catch deste mtodo, tratamos a exceo java.sql.SQLException, que lanada caso no consiga criar uma conexo com o Banco de Dados. J no segundo catch do mesmo bloco try, tratamos a exceo java.lang.ClassNotFoundException, que lanada caso no consiga carregar o driver do banco de dados. Depois de utilizar a conexo com o banco de dados muito importante que liberemos esta conexo, ou seja, precisamos encerrar a conexo com o banco de dados. Por fim, o mtodo desconectar recebe uma Connection como parmetro. Neste mtodo estamos verificando se a conexo com o banco ainda no foi encerrada para depois encerr-la. Quando tentamos encerrar uma conexo com o banco tambm pode ocorrer alguma exceo, para tanto estamos tratando caso ocorra alguma java.sql.SQLException . Quando executamos esta classe, temos a seguinte sada no console:

Figura 4

Consulta de dados
Uma vez conectado, podemos ento solicitar a execuo de comandos SQL. Para que tenhamos acesso a este tipo de chamada ao banco de dados necessrio criarmos um java.sql. Statement. O Statement o objeto que servir de instrumento para a execuo de comandos SQL, porm importante ressaltar que o intuito de uma consulta a um banco de dados o de receber uma informao, logo, fundamental que essa resposta seja armazenada em uma estrutura. Para isso, podemos utilizar a classe java.sql.ResultSet, que deve receber o retorno do mtodo executeQuery, o responsvel por executar a consulta. O exemplo a seguir consulta todas as pessoas cadastradas no banco de dados que tem o seu nome comeando com o caractere A: import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.sql.SQLException; 227
www.metodista.br/ead

public class ConsultaBD { public static void main(String[] args) { ConsultaBD consultaBD = new ConsultaBD(); consultaBD.consulta(); } private void consulta() { Conexao conexao = new Conexao(); Connection conn = conexao.conectar(); try{ /* Consulta todas as pessoas que o nome comea com a letra A. */ String consulta = SELECT * FROM PESSOA WHERE NOME LIKE A%; Statement stm = conn.createStatement(); ResultSet rs = stm.executeQuery(consulta); while (rs.next()) { System.out.print(rs.getLong(ID)); System.out.print( - + rs.getString(NOME)); System.out.print( - + rs.getInt(IDADE) + \n); } } catch (SQLException ex){ ex.printStackTrace(); System.out.println(No conseguiu consultar os dados de pessoa); } finally { conexao.desconectar(); } } } Quando executamos esta classe, temos a seguinte sada no console:

Figura 5

228
Universidade Metodista de So Paulo

Note pelo exemplo anterior que o mtodo responsvel por executar a consulta na base de dados foi o executeQuery(consulta), um objeto do tipo ResultSet retornado da execuo deste mtodo. A classe ResultSet fornece alguns mtodos para navegar pelos resultados obtidos da consulta. O mtodo next() percorre a resposta dada pelo banco de dados. Caso a consulta retorne 4 linhas, por padro o ResultSet estaria com seu ponteiro posicionado na posio -1, logo, antes de ler a primeira linha de resposta de sua consulta necessrio a chamada a este mtodo next() para que o ponteiro passe para a primeira posio e possa resgatar as informaes desejadas. O mtodo next() retorna true, caso ainda existam novas linhas na resposta, e false, quando no tenha mais registros para percorrer. Observao: s pode haver um nico objeto ResultSet aberto por vez para o Statement. Para resgatar as informaes desejadas, a classe ResultSet oferece mtodos do tipo getXxx() para todos os tipos de dados primitivos, exceto char. Todos estes mtodos devem receber como parmetro o nome da coluna de resposta, assim como no exemplo anterior, ou o nmero correspondente a posio da coluna retornada.

Manipulao de dados
Podemos utilizar a classe Statement para guardar (persistir) ou atualizar as informaes na base de dados, utilizando o mtodo execute. O exemplo a seguir mostra como inserir e atualizar dados em um banco de dados. import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class Manipulacao { public static void main(String[] args) { Manipulacao m = new Manipulacao(); m.inserir(Rafael, 28); m.atualizar(Rafael, Rafael Sakurai); } public void inserir(String nome, int idade) { Conexao conexao = new Conexao(); Connection conn = conexao.conectar(); try { String adicionar = INSERT INTO PESSOA (NOME, IDADE) VALUES ( + nome + , + idade +); Statement stm = con.createStatement(); stm.execute(adicionar); System.out.println(Adicionou a pessoa + nome + no BD); } catch (SQLException ex) { 229
www.metodista.br/ead

ex.printStackTrace(); System.out.println(No conseguiu adicionar uma pessoa no banco de dados); } finally { conexao.desconectar(conn); } } public void atualizar(String nome, String novoNome) { Conexao conexao = new Conexao(); Connection conn = conexao.conectar(); try { String atualizar = UPDATE PESSOA SET NOME = + novoNome + WHERE NOME LIKE + nome + ; Statement stm = con.createStatement(); stm.execute(atualizar); System.out.println(Atualizou a pessoa + novoNome + no BD); } catch (SQLException ex) { ex.printStackTrace(); System.out.println(No conseguiu atualizar uma pessoa no banco de dados); } finally { conexao.desconectar(conn); } } } No mtodo inserir pedimos para o Statement adicionar um novo registro na tabela PESSOA do banco de dados. No mtodo atualizar pedimos para o Statement atualizar um registro da tabela PESSOA do banco de dados. A classe Statement possui o mtodo execute para inserir ou atualizar um registro no banco de dados e o mtodo executeUpdate para atualizar as informaes no banco de dados. A diferena que o mtodo executeUpdate retorna um inteiro com a quantidade de registros que foram alterados. Aps a concluso das operaes de leitura ou de manipulao de dados, importante a chamada ao mtodo close(), tanto da classe Statement como da classe Connection, para que a conexo com o banco de dados seja finalizada.

Relao de algumas bases de dados


Para cada banco de dados precisaremos adicionar drivers diferentes e a String de conexo tambm diferente. A tabela a seguir mostra alguns exemplos: 230
Universidade Metodista de So Paulo

Banco Microsoft ODBC MySQL Oracle


Tabela 1

Driver sun.jdbc.odbc. JdbcOdbcDriver com.mysql.jdbc.Driver oracle.jdbc.driver. OracleDriver

String de Conexo jdbc:odbc:<<nome da base>> jdbc:mysql://<<ipDoBanco>>/<<baseDeDados>> jdbc:oracle:thin:@<<ipDoBanco>>:1521:<<nomeDa Base>>

Exemplo de aplicao para inserir, consultar, atualizar e remover informaes do banco de dados Neste exemplo, veremos, passo a passo, a criao de uma aplicao completa de acesso a uma base de dados utilizando JDBC. Para esta aplicao, criaremos um sistema de cadastro de veculos. Para tal, criamos a classe Carro, conforme o cdigo a seguir: public class Carro { private String placa; private String modelo; private Double potencia; public String getModelo() { return modelo; } public void setModelo(String modelo) { this.modelo = modelo; } public String getPlaca() { return placa; } public void setPlaca(String placa) { this.placa = placa; } public Double getPotencia() { return potencia; } 231
www.metodista.br/ead

public void setPotencia(Double potencia) { this.potencia = potencia; } } Agora que j modelamos a classe principal, devemos definir como nosso programa ir interagir com a base de dados. Para estabelecermos a conexo com a base de dados de uma maneira mais simples, faremos uso da classe Conexao, conforme o cdigo a seguir: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * Classe utilizada para executar as aes no banco de dados. */ public class Conexao { private Connection conn = null; private Statement stm = null; private ResultSet rs = null; private Connection conectar() { try { String usuario = root; String senha = root; String ipDoBanco = localhost; String nomeDoBanco = carro; String stringDeConexao = jdbc:mysql:// + ipDoBanco + / + nomeDoBanco; Class.forName(com.mysql.jdbc.Driver); conn = DriverManager.getConnection(stringDeConexao, usuario, senha); System.out.println(Conectou no banco de dados.); } catch (SQLException ex) { ex.printStackTrace(); System.out.println(Erro: No conseguiu conectar no BD.); } catch (ClassNotFoundException ex) { ex.printStackTrace(); System.out.println(Erro: No encontrou o driver do BD.); 232 }
Universidade Metodista de So Paulo

return conn; } public ResultSet executarConsulta(String consulta) { conn = conectar(); try { stm = conn.createStatement(); rs = stm.executeQuery(consulta); } catch (SQLException ex) { ex.printStackTrace(); System.out.println(No conseguiu executar a consulta\n + consulta); //Caso ocorra algum erro desconecta do banco de dados. desconectar(); } return rs; } public boolean executarDML(String dml) { boolean ok = false; conn = conectar(); try { stm = conn.createStatement(); stm.execute(dml); ok = true; } catch (SQLException ex) { ex.printStackTrace(); System.out.println(Nao conseguiu executar o DML\n + dml); } finally { desconectar(); } return ok; } public void desconectar() { 233
www.metodista.br/ead

fecharResultSet(this.rs); fecharStatement(this.stm); fecharConnection(this.conn); } public void fecharConnection(Connection conn) { try { if(conn != null && !conn.isClosed()) { conn.close(); System.out.println(Desconectou do banco de dados.); } } catch (SQLException ex) { ex.printStackTrace(); System.out.println(Nao conseguiu desconectar do BD.); } } public void fecharStatement(Statement stm) { try { if(stm != null && !stm.isClosed()) { stm.close(); } } catch (SQLException ex) { ex.printStackTrace(); System.out.println(Erro ao fechar o procedimento de consulta.); } } public void fecharResultSet(ResultSet resultado) { try { if(resultado != null && !resultado.isClosed()) { resultado.close(); } } catch (SQLException ex) { ex.printStackTrace(); System.out.println(Erro ao fechar o resultado da consulta.); } 234
Universidade Metodista de So Paulo

} } Utilizaremos um padro de projeto chamado DAO (Data Acess Object), que possui o comportamento de acesso ao banco de dados. O DAO deve saber buscar os dados do banco e converter em objetos para ser usado pela sua aplicao. Semelhantemente, deve saber como pegar os objetos, converter em instrues SQL e mandar para o banco de dados. Desta forma, conseguimos distinguir fortemente a modelagem do sistema da modelagem de dados e das regras de negcio. Geralmente, temos um DAO para cada objeto do domnio do sistema, ou seja, para esse exemplo criaremos uma classe CarroDAO com as quatro operaes bsicas, definidas por seus mtodos. import java.sql.ResultSet; import java.sql.SQLException; /** * Classe utilizada para executar as operaes * no banco de dados, que envolvem o Carro. */ public class CarroDAO { public void incluir(Carro carro) { String incluir = INSERT INTO CARRO VALUES ( + carro.getPlaca() + , + carro. getModelo() + , + carro.getPotencia() + ); Conexao conexao = new Conexao(); conexao.executarDML(incluir); } public Carro consultarPorPlaca(String placa) { Conexao conexao = new Conexao(); Carro carro = null; try { String consulta = SELECT * FROM CARRO WHERE PLACA LIKE + placa + ; ResultSet rs = conexao.executarConsulta(consulta); if(rs.next()) { carro = new Carro(); carro.setModelo(rs.getString(MODELO)); carro.setPlaca(rs.getString(PLACA)); carro.setPotencia(rs.getDouble(POTENCIA)); } 235
www.metodista.br/ead

} catch (SQLException ex) { System.out.println(Nao conseguiu consultar os dados do Carro.); } finally { conexao.desconectar(); } return carro; } public void alterarPorPlaca(Carro carro) { String update = UPDATE CARRO SET MODELO = + carro.getModelo() + , POTENCIA = + carro.getPotencia() + WHERE PLACA = + carro.getPlaca() + ; Conexao conexao = new Conexao(); conexao.executarDML(update); } public void excluir(Carro carro) { String delete = DELETE FROM CARRO WHERE PLACA = + carro.getPlaca() + ; Conexao conexao = new Conexao(); conexao.executarDML(delete); } } Para que a classe acima no apresente nenhum erro de compilao, necessrio que voc acrescente a biblioteca (arquivo .jar) correspondente ao seu banco de dados. Para o nosso exemplo, devemos importar o arquivo correspondente ao banco de dados MySQL. Observe que o mtodo incluir() apenas recebe o objeto Carro a ser inserido na base de dados e internamente faz toda a operao relacionada ao banco de dados. Desta forma, conseguimos isolar toda esta interao com a base de dados do restante do cdigo, tornando-o mais simples de se realizar qualquer tipo de manuteno. O mtodo consultarPorPlaca recebe apenas a placa de um carro (imagine que esta informao uma chave da tabela e que no devemos ter mais de um carro com a mesma placa) e que retorna um objeto do tipo Carro com todos os seus atributos devidamente alimentados. O mtodo alterarPorPlaca() recebe um objeto Carro e a partir de sua placa faz a atualizao nos atributos placa e potencia. O mtodo excluir() recebe o Carro como parmetro e o apaga da base de dados. Para testarmos o sistema, crie uma classe de teste semelhante a seguinte: import java.util.Scanner; 236
Universidade Metodista de So Paulo

/** * Classe utilizada para testar o CRUD de Carro. */ public class TestarCarro { public static void main(String[] args) { CarroDAO carroDAO = new CarroDAO(); char opcao = ; do { Carro carro = null; opcao = menu(); switch(opcao) { case I: carro = coletarDados(); carroDAO.incluir(carro); break; case E: String placaExcluir = consultarPlaca(); carro = carroDAO.consultarPorPlaca(placaExcluir); carroDAO.excluir(carro); break; case A: carro = coletarDados(); carroDAO.alterarPorPlaca(carro); break; case C: String placaConsultar = consultarPlaca(); carro = carroDAO.consultarPorPlaca(placaConsultar); break; } mostrarDadosCarro(carro); } while(opcao != S); } public static char menu() { Scanner s = new Scanner(System.in); char opcao = ;

237
www.metodista.br/ead

System.out.println(Escolha a sua opcao: ); System.out.println(\t(I)ncluir); System.out.println(\t(E)xcluir); System.out.println(\t(A)lterar); System.out.println(\t(C)onsultar); System.out.println(\t(S)air); System.out.print(\nOpcao: ); opcao = s.nextLine().toUpperCase().charAt(0); return opcao; } public static String consultarPlaca() { Scanner s = new Scanner(System.in); System.out.print(Digite a placa do carro: ); return s.nextLine(); } public static Carro coletarDados() { Scanner s = new Scanner(System.in); Carro carro = new Carro(); System.out.print(Digite a placa do carro: ); carro.setPlaca(s.nextLine()); System.out.print(Digite o modelo do carro: ); carro.setModelo(s.nextLine()); System.out.print(Digite a potencia do carro: ); carro.setPotencia(s.nextDouble()); return carro; } public static void mostrarDadosCarro(Carro carro) { if(carro != null) { System.out.println(\n########### DADOS DO CARRO #############); System.out.println(PLACA: + carro.getPlaca()); System.out.println(MODELO: + carro.getModelo()); 238
Universidade Metodista de So Paulo

System.out.println(POTENCIA DO MOTOR: + carro.getPotencia()); System.out.println(############# DADOS DO CARRO #############\n); } } } Ao executarmos a classe TestarCarro, temos a seguinte sada no console:

Figura 6

O console fica aguardando at que digitemos alguma opo. Primeiro, vamos criar um novo carro. Para isto, vamos entrar com a opo I:

Figura 7

239
www.metodista.br/ead

Se consultarmos todos os carros cadastrados no banco de dados, aparecer o carro que acabamos de criar:

Figura 8

Fonte: Agora, vamos utilizar a opo C para consultar um carro pela placa abc-1234:

Figura 9

240
Universidade Metodista de So Paulo

Agora, vamos utilizar a opo A para alterar as informaes de modelo e potncia:

Figura 10

Se consultarmos todos os carros cadastrados no banco de dados, aparecer o carro que acabamos de alterar:

Figura 11 -

241
www.metodista.br/ead

Agora, vamos utilizar a opo E para apagar o carro do banco de dados.

Figura 12

Se consultarmos todos os carros, no teremos nenhum registro no banco de dados:

Figura 13

Concluso
Desta forma, somos capazes que conhecer algumas das interfaces que compem o pacote JDBC. muito importante observar que a base de funcionamento desta API que garante a compatibilidade do Java com qualquer banco de dados. Est em sua arquitetura totalmente amparada e construda com base em interfaces e desta forma utiliza conceitos polimrficos de funcionamento atravs de conjuntos de classes especificas chamadas Drivers.

242
Universidade Metodista de So Paulo

Referncias DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8 ed. So Paulo: Pearson, 2010. HORSTMANN, Cay S.. Big Java. 4 ed. Porto Alegre: Bookman, 2006. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8 ed. So Paulo: Pearson, 2009.

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________
243
www.metodista.br/ead

_________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________
244
Universidade Metodista de So Paulo

_________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ __________________________________________

Implementao de Sistemas Cliente Servidor

Enumeraes e tipos genricos


Prof. Cristiano Camilo dos Santos de Almeida

Mdulo

O texto tem por objetivo apresentar os recursos Java de Enumeraes e dos tipos genricos, desta forma justificando a importncia do fato de terem sido acrescentados linguagem em sua verso 5.0 e consequentemente os ganhos obtidos com os mesmos.

Objetivo:

Java, Enums, enumeraes, Generics.

Palavras-chave:

www.metodista.br/ead

Assim como em outras linguagens de programao, em Java tambm possvel se trabalhar com constantes. Para tanto, basta utilizar o modificador de acesso final. Dependendo do escopo e da utilizao desta sua varivel, possvel combin-la com outros modificadores de acesso, por exemplo. Uma vez que a varivel foi declarada como uma constante, obrigatria a atribuio de um valor inicial para a mesma. Observe, no exemplo abaixo, que tanto um atributo como uma varivel interna a um mtodo pode ser declarado como constante.
01 02 03 04 05 06 07 08 09 10 11 /** * Classe utilizada para demonstrar o uso de variaveis do tipo contante. */ public class ExemploConstantes { private final long NUMERO_ATRIBUTO_CONSTANTE = 547L; public final double OUTRO_NUMERO_ATRIBUTO_CONSTANTE = 365.22; public static void main(String[] args) { final char VARIAVEL_CONSTANTE = A; }

Tendo em vista que tais variveis foram declaradas como constantes, seu valor no pode ser alterado aps a sua declarao. Observe que a tentativa de atribuir um valor a qualquer uma destas variveis gerar um erro de compilao.

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

/** * Classe utilizada para demonstrar o uso de variaveis do tipo contante. */ public class ExemploConstantes2 { private final long NUMERO_ATRIBUTO_CONSTANTE = 547L; public final double OUTRO_NUMERO_ATRIBUTO_CONSTANTE = 365.22; public static void main(String[] args) { final char VARIAVEL_CONSTANTE = A; ExemploConstante exemplo = new ExemploConstante(); exemplo.NUMERO_ATRIBUTO_CONSTANTE = 10001010L; exemplo.OUTRO_NUMERO_ATRIBUTO_CONSTANTE - 201015.06; VARIAVEL_CONSTANTE = B; } }

Trabalhando com enums


As Enums ou enumeraes surgiram na linguagem Java a partir da verso 5 como uma alternativa ao uso de constantes e para melhor atender algumas das situaes especficas que podem ocorrer durante a programao.

246
Universidade Metodista de So Paulo

Justificativas do uso de Enums a constantes


Abaixo, temos algumas justificativas do por que de se utilizar Enums em Java em relao s constantes: As constantes no oferecem segurana Como normalmente constantes so variveis de um tipo especfico, caso sua constante sirva para ser utilizada em algum mtodo, qualquer classe pode passar um valor de mesmo tipo da sua constante, mas que na verdade no existe. Por exemplo, veja a seguinte classe: /** * Classe utilizada para demonstrar o uso de enumeration (enum). */ public class ExemploUsarEnuns { public final int CONCEITO_RUIM = 1; public final int CONCEITO_BOM = 2; public final int CONCEITO_OTIMO = 3; public void calcularAprovacao(int conceito) { if(conceito == CONCEITO_OTIMO) { System.out.println(Aprovado com louvor!); } else if(conceito == CONCEITO_BOM) { System.out.println(Aprovado!); } else if(conceito == CONCEITO_RUIM) { System.out.println(Reprovado!); } } } Caso outra classe invoque o mtodo calcularAprovacao e passe o nmero 4 como parmetro ele simplesmente no funcionar. No h um domnio estabelecido Para evitar duplicidades entre os nomes de constantes nas diversas classes de um sistema, o desenvolvedor forado a padronizar um domnio. Perceba no exemplo acima que todas as constantes iniciam com o prefixo CONCEITO justamente com este fim. Fragilidade de modelo Como uma constante sempre requer um valor, caso voc crie um novo valor intermedirio aos j existentes, todos os atuais devero ser alterados tambm. Por exemplo, ainda considerando o exemplo acima, imagine que voc precise criar um novo conceito chamado REGULAR. Qual seria seu valor uma vez que ele deveria estar entre os conceitos RUIM e BOM? Provavelmente, voc teria de alterar todo o seu cdigo para algo semelhante ao que segue abaixo: 247
www.metodista.br/ead

/** * Classe utilizada para demonstrar o uso de enumeration (enum). */ public class ExemploUsarEnuns2 { public final int CONCEITO_RUIM = 1; public final int CONCEITO_REGULAR = 2; public final int CONCEITO_BOM = 3; public final int CONCEITO_OTIMO = 4; public void calcularAprovacao(int conceito) { if(conceito == CONCEITO_OTIMO) { System.out.println(Aprovado com louvor!); } else if(conceito == CONCEITO_REGULAR) { System.out.println(Regular!); } else if(conceito == CONCEITO_BOM) { System.out.println(Aprovado!); } else if(conceito == CONCEITO_RUIM) { System.out.println(Reprovado!); } } } Note que, ao invs de apenas criamos este novo valor, somos forados a alterar os valores das variveis BOM e OTIMO. Imagine isso em um contexto com duzentas ou trezentas variveis, por exemplo. Seus valores impressos so pouco informativos Como constantes tradicionais de tipos primitivos so apenas valores numricos em sua grande maioria, seu valor impresso pode no representar algo consistente. Por exemplo, o que o nmero 2 significa para voc em seu sistema? Um conceito? Uma temperatura? Um modelo de carro? Etc.

Como criar uma Enum


A estrutura de uma Enum bem semelhante de uma classe comum. Toda a Enum possui um construtor que pode ou no ser sobrecarregado. Vamos ao primeiro exemplo: /** * Classe utilizada para demonstrar o uso de enumeration (enum). */ public enum ConceitosEnum { 248
Universidade Metodista de So Paulo

OTIMO, BOM, REGULAR, RUIM; public void calcularAprovacao(ConceitosEnum conceito) { if(conceito == OTIMO) { System.out.println(Aprovado com louvor!); } else if(conceito == REGULAR) { System.out.println(Regular!); } else if(conceito == BOM) { System.out.println(Aprovado!); } else if(conceito == RUIM) { System.out.println(Reprovado!); } } } Observe que no exemplo acima quatro valores foram criados, mas, diferentemente das constantes, eles no possuem um tipo especfico sendo que todos eles so vistos como elementos da enumerao Conceitos. Isto j torna desnecessria a denominao de um prefixo de domnio para os nomes dos conceitos, visto que a prpria enum j cumpre este papel.

Uma Enum pode possuir mtodos


Ainda sobre o exemplo acima, tambm vale ressaltar que uma enum pode ter mtodos. O mtodo calcularAprovacao na linha 10 recebe como parmetro agora no mais um nmero inteiro qualquer, mas uma enum do tipo ConceitosEnum. Desta forma, garante-se que ele sempre receber um valor conhecido e que no teremos os mesmos problemas que poderiam ocorrer com uma varivel de um tipo especfico, tal como ocorria com as constantes. Por fim, observe que como os elementos da enum no possuem mais um valor atrelado a si, a criao de um novo conceito, tal como um EXCELENTE ou PSSIMO, em nada influenciaria no cdigo j existente dentro da enum. Uma enum, diferentemente de uma classe, j inicializada quando voc inicia sua aplicao Java, no necessitando ser instanciada. Vamos, agora, a um exemplo de uma enum com mtodo construtor e com atributos: /** * Classe utilizada para demonstrar o uso de enumeration (enum). */ public enum ConceitosEnumComConstrutor { OTIMO(Aprovado com louvor!), 249
www.metodista.br/ead

BOM(Regular!), REGULAR(Aprovado!), RUIM(Reprovado!); private String mensagem; private ConceitosEnumComConstrutor(String mensagem) { this.mensagem = mensagem; } public String calcularAprovacao() { return this.mensagem; } } Perceba que agora as mensagens esto sendo utilizadas no construtor e sero populadas no atributo mensagem para cada um dos elementos da enum. Desta forma, outra classe poderia acessar estes dados de maneira muito mais transparente, conforme segue abaixo: /** * Classe utilizada para testar o enum. */ public class PrincipalTesteEnum { public static void main(String[] args) { System.out.println(Conceito..: + ConceitosEnumComConstrutor.OTIMO.calcularAprovacao()); } } Observe na linha 7 como a enum est sendo invocada. No precisa criar uma instncia para us-la.

Figura 1 -

Generics
At a verso 4.0 da linguagem Java, quando se precisava criar uma classe ou um mtodo capaz de trabalhar com outras classes, restava apenas as opes: 250
Universidade Metodista de So Paulo

Criar uma referncia a uma interface e, desta forma, ficar restrito a trabalhar com os tipos que implementassem esta interface; Criar uma classe para cada uma das outras que se deseja trabalhar, exemplo: OrdenarAnimais, OrdenarLivros, etc.; Criar uma referncia classe Object e, desta forma, tornar sua classe totalmente compatvel com qualquer outra classe. Independentemente da opo escolhida, um problema nas operaes de manipulao desta referncia era gerado, pois uma vez colocado um objeto nesta estrutura no se podia trat-la como um subtipo especfico sem fazer as devidas verificaes. Podemos ver este comportamento no seguinte exemplo: package br.universidadejava.generics.exemplo1; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class Prateleira { private Object[] objetos; int posicaoAtual; public Prateleira(int tamanho){ this.objetos = new Object[tamanho]; this.posicaoAtual = 0; } public void armazenar(Object objeto) { if (this.posicaoAtual < this.objetos.length) { this.objetos[this.posicaoAtual++] = objeto; } } public Object retirar() { if (this.posicaoAtual > 0) { return this.objetos[--this.posicaoAtual]; } return null; 251
www.metodista.br/ead

} } Observe que a classe criada acima est preparada para receber qualquer tipo de objeto, tornando-a assim uma classe com um escopo genrico. Para avaliarmos o funcionamento da mesma, criaremos duas classes simples (POJO), conforme segue, abaixo: package br.universidadejava.generics.exemplo1; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class Livro { }

package br.universidadejava.generics.exemplo1; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class Vaso { } Agora, criaremos uma classe principal e nela armazenaremos e retiraremos nossas instncias das classes acima criadas:

package br.universidadejava.generics.exemplo1; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ 252
Universidade Metodista de So Paulo

public class Principal { public static void main(String[] args) { Prateleira prateleira = new Prateleira(5); prateleira.armazenar(new Livro()); prateleira.armazenar(new Vaso()); Object oQueDeveSer = prateleira.retirar(); if(oQueDeveSer instanceof Livro){ System.out.println( um livro); } else if (oQueDeveSer instanceof Vaso) { System.out.println( um vaso); } else { System.out.println(No sei o que isto!); } } } Observe que as oprees de armazenamento funcionam muito bem uma vez que este mtodo foi preparado para receber qualquer tipo de objeto. J o mtodo de retirada de itens da prateleira nos obrigou a receber um objeto do tipo Object. Tal operao nos fora a checar o tipo do objeto armazenado nesta varivel, ainda em tempo de execuo, por meio do uso do operador instanceof. Desta forma, o cdigo vai se tornando to extenso quanto a quantidade de classes que se necessita verificar.

Figura 2

Por este motivo, a partir do Java 5.0, podemos utilizar esta nova mecnica para se trabalhar com tipos genricos chamada de Generics. Para transformarmos nossa classe Prateleira em uma estrutura capaz de trabalhar com tipos genricos, devemos fazer uso do operador diamante. No interior deste operador, devemos declarar um nome qualquer para receber o tipo ou tipos que se desejar. As letras mais usuais para uso em tipos genricos so: T: Type (Tipo); E: Element (Elemento); K: Key (Chave); V: Value (Valor); 253
www.metodista.br/ead

S, U: Letras usadas se houver tipos secundrios, tercirios ou mais. A estrutura de Generics serve para restringir as listas a um determinado tipo de objetos (e no qualquer Object), assim como segue o exemplo: package br.universidadejava.generics.exemplo1; import java.lang.reflect.Array; /** * * @author cristianocamilo * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class PrateleiraTipada <T>{ private T[] objetos; int posicaoAtual; public PrateleiraTipada(int tamanho){ this.objetos = (T[])(new Object[tamanho]); this.posicaoAtual = 0; } public void armazenar(T objeto) { if (this.posicaoAtual < this.objetos.length) { this.objetos[this.posicaoAtual++] = objeto; } } public T retirar() { if (this.posicaoAtual > 0) { return this.objetos[--this.posicaoAtual]; } return null; }

254
Universidade Metodista de So Paulo

} A partir deste momento, qualquer declarao de uma varivel do tipo de nossa classe pode receber por meio do operador diamante um tipo qualquer, conforme o exemplo abaixo: package br.universidadejava.generics.exemplo1; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class PrincipalTipada { public static void main(String[] args) { PrateleiraTipada<Livro> prateleira = new PrateleiraTipada<Livro>(5); prateleira.armazenar(new Livro()); Livro umLivro = prateleira.retirar(); } } Observe que, agora, no mais necessrio verificar o tipo do objeto em tempo de execuo, pois na declarao da varivel j especificamos o tipo objeto que nossa classe estar preparada para trabalhar. Observe que at o prprio code-assist da IDE de desenvolvimento j nos mostra que os retornos e parmetros de nossos mtodos j retornam e recebem objetos do tipo correspondente.

Figura 3

A partir do Java 7.0, a declarao de uma varivel de um tipo genrico tambm pode ser simplificada, fazendo-a da seguinte forma:

255
www.metodista.br/ead

PrateleiraTipada<Livro> prateleira = new PrateleiraTipada<>(5); Veja que o tipo foi declarado apenas na criao da varivel e que na instanciao o tipo foi suprimido para o uso do operador diamante vazio. Mtodos com Generics Assim como utilizados em classes, os tipos genricos podem ser aplicados a apenas mtodos, possibilitando assim a criao de classes com mtodos que operem com diferentes tipos de objetos. Veja o seguinte exemplo: package br.universidadejava.generics.exemplo2; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class Utilitarios { public static <T> T[] transformarEmVetor(T p1, T p2, T p3){ T[] vetor = (T[]) new Object[3]; return vetor; } } A classe foi criada com seu mtodo transformarEmVetor como passvel de se trabalhar com tipos genricos. Desta forma, na invocao deste mtodo, assim como quando trabalhamos com classes, devemos informar o tipo que trabalharemos. Este tipo deve ser informado entre os operadores maior e menor entre o nome da varivel de referncia (ou nome de classe, no caso de mtodos estticos) e o nome do mtodo. Veja no exemplo abaixo como fica esta construo: package br.universidadejava.generics.exemplo2; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class PrincipalMetodoGenerico { public static void main(String[] args) { String n1 = Joao; String n2 = Maria; String n3 = Carlos; 256
Universidade Metodista de So Paulo

String[] vetor = Utilitarios.<String>transformarEmVetor(n1,n2,n3); Integer n1 = 3; Integer n2 = 6; Integer n3 = 9; Integer[] vetor2 = Utilitarios.<Integer>transformarEmVetor(n1,n2,n3); } }

Trabalhando com Tipos Genricos delimitados


Mesmo quando se deseja trabalhar com tipos genricos, em determinados contextos pode-se ainda delimitar o tipo de dado que ser passado por parmetro na definio do seu tipo genrico, a exemplo de um cenrio em que se deseja trabalhar apenas com variveis do tipo numrico, por exemplo, independentemente de qual seja este tipo. Nestes casos, basta utilizar a palavra reservada extends na declarao do tipo genrico da seguinte forma: package br.universidadejava.generics.exemplo3; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class NumeroNatural<T extends Number> { private T n; public NumeroNatural(T n) { this.n = n; } public boolean isPar() { return n.intValue() % 2 == 0; } } Neste exemplo, estamos referenciando a classe Number. Desta forma, qualquer classe filha desta, seja em qual nvel for, passvel de ser definida como tipo desta classe genrica. importante ressaltar ainda que, neste caso, tambm pode-se utilizar uma interface nesta delimitao, neste caso, qualquer classe que implemente esta interface ou que seja filha de uma classe que a implemente ser aceita. Vamos ver um exemplo de uso da classe NumeroNatural: 257
www.metodista.br/ead

package br.universidadejava.generics.exemplo3; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class Principal { public static void main(String[] args) { NumeroNatural<Float> num1 = new NumeroNatural<>(35.4f); System.out.println(num1.isPar()?Par:Impar); } } Desta forma, conseguimos invocar nossa classe passando um tipo Float como parmetro, uma vez que esta classe pertence a hierarquia de classes abaixo de Number.

Figura 4

Utilizando ainda o operador extends, possvel estabelecer que o tipo genrico deva no somente pertencer a uma hierarquia, mas a um grupo de hierarquias. Para isto, basta separar os tipos pelo operador &, da seguinte forma: public class Numero <T extends Number & Comparable> { }

Herana e tipos genricos


Em se tratando dos conceitos de herana para os tipos genricos, a herana continua operando normalmente, ou seja, por meio do conceito um possvel se criar um tipo genrico de um supertipo e armazenar no mesmo qualquer subtipo daquela classe. Considere, novamente, o exemplo da classe NumeroNatural: 258
Universidade Metodista de So Paulo

package br.universidadejava.generics.exemplo3; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class NumeroNatural<T extends Number> { private T n; public NumeroNatural(T n) { this.n = n; } public boolean isPar() { return n.intValue() % 2 == 0; } } Agora, vamos criar uma nova classe principal, mas desta vez definiremos trs diferentes tipos genricos, cada um de um tipo especfico, e vamos tentar trocar os valores dos mesmos: package br.universidadejava.generics.exemplo3; /** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class Principal { public static void main(String[] args) { NumeroNatural<Float> num1 = new NumeroNatural<>(35.4f); NumeroNatural<Long> num2 = new NumeroNatural<>(35l); num1 = num2; num2 = num1; NumeroNatural<Number> num3 = new NumeroNatural<>(3); 259
www.metodista.br/ead

} } Observe que as trs linhas em negrito no seriam compiladas, devido a erros. Analisando cada uma delas individualmente percebemos que as seguintes atribuies num1 = num2; num2 = num1; esto realizando trocas de tipos genricos para variveis genricas de tipos diferentes, mas mesmo ambos os tipos respeitando a restrio do tipo genrico, estas linhas geraro erro, pois os tipos genricos foram definidos para Float e Long respectivamente, logo, o tipo genrico criado aceitar apenas cada um destes tipos especificamente. J na terceira linha com erro, a seguinte declarao foi feita: NumeroNatural<Number> num3 = new NumeroNatural<>(3); Porm, importante observar que o tipo genrico foi criado com o nmero inteiro 3, um dado do tipo Integer, mas a varivel de referncia num3 foi criada para receber objetos do tipo Number especificamente. O que se deve observar neste caso que a relao de herana existe entre Number e Integer, mas no entre Numero<Number> e NumeroNatural<Integer>, gerando assim o erro de compilao.

Concluso
Desta forma, pudemos conhecer estes novos recursos da linguagem Java e compreendermos seus ganhos atravs da comparao em relao s limitaes que suas ausncias nos geravam em verses anteriores da linguagem.

Referncias DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8 ed. So Paulo: Pearson, 2010. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8 ed. So Paulo: Pearson, 2009. ORACLE [1]. Enum Types. Disponvel em: <http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html>. Acesso em: 16 Out. 2012. ORACLE [2]. Generics (Updated). Disponvel em: <http://docs.oracle.com/javase/tutorial/ java/generics/>. Acesso em: 16 Out. 2012.

260
Universidade Metodista de So Paulo

Implementao de Sistemas Cliente Servidor

Collections

Mdulo

Prof. Cristiano Camilo dos Santos de Almeida

Apresentar o conceito de colees na linguagem Java e suas propriedades de armazenamento de outros objetos dentro de sua estrutura. Algumas das classes que sero apresentadas so objetos de estudo de temticas relacionadas aos conceitos das estruturas de dados, tal como pilha, fila e lista.

Objetivo:

Java, Collections, Colees.

Palavras-chave:

www.metodista.br/ead

Uma coleo (collection) um objeto que serve para agrupar muitos elementos em uma nica unidade. Estes elementos precisam ser Objetos. Pode haver colees homogneas e heterogneas e normalmente utilizamos colees heterogneas de um tipo especfico. O ncleo principal das colees formado pelas interfaces da figura a abaixo. Essas interfaces permitem manipular a coleo independentemente do nvel de detalhe que elas representam.

Figura 1

Temos quatro grandes tipos de colees: Set (conjunto), List (lista), Queue (fila) e Map (mapa). A partir dessas interfaces temos muitas subclasses concretas que implementam vrias formas diferentes de se trabalhar com cada coleo. Todas as interfaces e classes so encontradas dentro do pacote (package) java.util, embora a interface Map no seja uma filha direta da interface Collection. Ela tambm considerada uma coleo devido a sua funo de armazenar outros objetos dentro de si.

java.util.Collection
A interface Collection define diversos mtodos que so implementados pelas classes que representam colees. Dentro das colees so adicionados Objetos tambm chamados de elementos. Alguns dos mtodos que devem ser implementados por todas as subclasses de Collection so: add(Object e) Adiciona um Objeto dentro da coleo. addAll(Collection c) Adiciona uma coleo de Objetos dentro da coleo. contains(Object o) Verifica se um Objeto est dentro da coleo. clear() - Remove todos os Objetos da coleo. isEmpty() - Retorna uma boolean informando se a coleo est vazia ou no. remove(Object o) Remove um Objeto da coleo. size() - Retorna o tamanho da coleo. toArray() - Converte uma coleo em um vetor.

A imagem a seguir mostra em azul as principais filhas da classe Collection, com exceo da interface Map. Mostra, tambm, em verde, algumas das classes concretas mais utilizadas que implementam as interfaces.

262
Universidade Metodista de So Paulo

Figura 2

A partir do Java 5, com a chegada dos tipos genricos, todas as colees foram revisadas para possibilitar a tipagem dos objetos que a coleo trabalhar. Desta forma, podemos definir o tipo ou trabalharmos com todas elas sem tipagem, operando assim com qualquer subtipo de Object. importante ficar atento a documentao destas classes, uma vez que algumas destas classes permitem a definio de mais de um tipo que a coleo operar, tal como os mapas como falaremos mais adiante.

java.util.Set
A interface Set uma coleo do tipo conjunto de elementos. As caractersticas principais deste tipo de coleo so: os elementos no possuem uma ordem de insero especfica (no considerando algumas implementaes) alm de ser um tipo de estrutura que no permite duplicidade de elementos. Segue abaixo um exemplo de uso de um subtipo de Set que a classe TreeSet. Esta classe possui as caractersticas bsicas de um Set, porm implementando a lgica de uma rvore binria, ou seja, os elementos vo sendo ordenados conforme vo sendo inseridos na estrutura. Isso traz como consequncia o consumo maior de tempo na insero de elementos nesta estrutura, no entanto, no se necessita orden-la posteriormente. package br.universidadejava.collections.set; import java.util.Set; import java.util.TreeSet; 263
www.metodista.br/ead

/** * @author Cristiano Camilo dos Santos de Almeida * @author Rafael Guimares Sakurai */ public class ExemploSet { public static void main(String[] args) { } } A sada em tela deste cdigo seria a seguinte: Set<String> grupo = new TreeSet<String>(); grupo.add(Carlos); grupo.add(Maria); grupo.add(Denis); grupo.add(Carlos); System.out.println(grupo);

Figura 3

Atente que os elementos j foram impressos de forma ordenada, por se tratar de um TreeSet, e que esta implementao de lista possui o mtodo .toString() sobrescrito, o que gerou uma sada em tela compreensvel ao usurio.

java.util.Queue
A interface Queue uma coleo do tipo fila/pilha. As principais caractersticas deste tipo de coleo so: a ordem que os elementos entram na fila a mesma ordem que os elementos saem da fila (FIFO); podemos tambm criar filas com prioridades. Alguns dos principais mtodos da interface Queue e que so implementados por todas as classes filhas desta hierarquia so: boolean offer(E e) -> Adiciona um elemento pilha. E poll() -> Retira um item da pilha. E peek() -> Retona uma referncia do objeto no topo da pilha, mas no o remove da mesma.

264
Universidade Metodista de So Paulo

package br.universidadejava.collections.queue; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; /** * Classe exemplo de uso de uma Queue */ public class ExemploQueue { public static void main(String[] args) { Queue<String> pilha = new ArrayBlockingQueue<>(4); pilha.offer(Carlos); pilha.offer(Maria); pilha.offer(Denis); pilha.offer(Carlos); while (!pilha.isEmpty()) { System.out.println(pilha.poll() + ); } System.out.println(Usando mtodo add..: + pilha); } } Para o cdigo acima, a sada em tela ficaria conforme a figura abaixo. Observe que o comportamento First in First Out, foi devidamente respeitado:

Figura 4 -

java.util.Deque
importante aproveitar, j que falamos sobre filas, e tratarmos brevemente sobre a interface Deque. Esta interface uma subinterface de Queue, portanto traz consigo todos os mtodos necessrios para lidar com estruturas do tipo FIFO. Verifique a tabela abaixo, em que esto listados todos os mtodos que esta interface oferece. Observe que possvel lidar com elementos tanto do incio da fila quanto de seu fim: 265
www.metodista.br/ead

Primeiro Elemento (Head) Lanam Exception Inserir Remover Examinar (sem remover)
Tabela 1

ltimo Elemento (Tail) Special value offerFirst(e) pollFirst() peekFirst() Lanam Exception addLast(e) removeLast() getLast() Special value offerLast(e) pollLast() peekLast()

addFirst(e) removeFirst() getFirst()

Isto oferece muitas outras funcionalidades interessantes a esta estrutura, pois alm de operar com as duas extremidades da fila, a mesma pode adaptar o uso de uma lista para tornla uma pilha, uma estrutura do tipo LIFO (Last In First Out) . Realizando sempre inseres e remoes no fim da fila. Existe em Java uma classe chamada Stack que foi criada para representar uma pilha. No entanto, seu uso desencorajado uma vez que a mesma j uma implementao concreta. Desta forma, no sendo possvel operar com uma interface que a represente. A tabela abaixo lista os mtodos da pilha e seus equivalentes em uma Deque:
Mtodos de Stack push(e) pop() peek()
Tabela 2

Mtodos de Deque addFirst(e) removeFirst() peekFirst()

Funo Adicionar elemento na pilha. Remover elemento da pilha. Examinar elemento da pilha.

Segue, abaixo, um exemplo de uso da interface Deque atravs de uma de suas implementaes, a LinkedList, ou lista ligada: package br.universidadejava.collections.deque; import java.util.Deque; import java.util.LinkedList; /** * Classe demonstrativa do uso de uma implementao de Deque. Operaes do * tipo FIFO e LIFO sero apresentados */ public class ExemploDeque { public static void main(String[] args) { Deque<String> fila = new LinkedList<>(); Deque<String> pilha = new LinkedList<>(); fila.add(Carlos); fila.add(Maria); fila.add(Denis); 266
Universidade Metodista de So Paulo

fila.add(Carlos); while(fila.size()>0){ System.out.print(fila.remove()); } System.out.println(); pilha.push(Carlos); pilha.push(Maria); pilha.push(Denis); pilha.push(Carlos); while(pilha.size()>0){ System.out.print(pilha.pop()); } System.out.println(); } } Veja a sada em tela e observe a diferena de comportamento dos mtodos acima utilizados:

Figura 5

java.util.List
A interface List uma coleo do tipo lista, em que a ordem dos elementos se d atravs de sua insero na lista, ou seja, os elementos esto simplesmente alinhados em funo de algum critrio especfico de sua implementao. Este tipo de estrutura tambm se caracteriza por permitir insero e remoo de elementos em qualquer ponto da lista, normalmente acessados por um ndice assim como um vetor. Os principais mtodos que a interface List oferece so: lista. void add(int index, E element) -> Adiciona um elemento no ndice correspondente da

E get(int index) -> Retorna o elemento do ndice correspondente da lista. E remove(int index) -> Adiciona um elemento no ndice correspondente da lista. E set(int index, E element) -> Substitui o elemento existente na posio indicada por aquele passado no parmetro. Object[] toArray() -> Retorna um vetor correspondente aos elementos da lista.

267
www.metodista.br/ead

O cdigo abaixo exemplifica o uso de uma implementao da interface List: import java.util.ArrayList; import java.util.List; /** * Classe utilizada para demonstrar o uso da estrutura * de dados Lista. */ public class ExemploLista { public static void main(String[] args) { List nomes = new ArrayList(); nomes.add(Zezinho); nomes.add(Luizinho); nomes.add(Joozinho); for(int cont = 0; cont < nomes.size(); cont++) { String nome = (String) nomes.get(cont); System.out.println(nome); } } } Neste exemplo, ir imprimir Zezinho, Luizinho e Joozinho, pois a ordem que os elementos foram adicionados na lista. Outra forma de percorrer os elementos de uma lista atravs da interface java.util.Iterator. import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Classe utilizada para demonstrar o uso da estrutura * de dados Lista. */ public class ExemploLista2 { public static void main(String[] args) { List nomes = new ArrayList(); nomes.add(Zezinho); nomes.add(Luizinho); 268
Universidade Metodista de So Paulo

nomes.add(Joozinho); for(Iterator it = nomes.iterator(); it.hasNext();) { String nome = (String) it.next(); System.out.println(nome); } } }

java.util.Map
A interface Map uma coleo do tipo mapa. As principais caractersticas deste tipo de coleo so: os objetos so armazenados na forma de chave / valor e no pode haver chaves duplicadas dentro do mapa. Assim sendo, importante destacar que existem diferentes tipos de mapas. No entanto, a organizao dos objetos dentro desta estrutura dependem da implementao escolhida. Para localizar um objeto dentro do mapa necessrio ter sua chave ou voc ser forado a percorrer o mapa por completo. importante ressaltar que a escolha do tipo de objeto chave refletir diretamente na performance de acesso de seu mapa, ou seja, o quo melhor forem as implementaes dos mtodos equals(Object o) e hashCode() desta classe, mais performtico ser seu mapa. Veja abaixo uma lista dos principais mtodos de um Map: boolean containsKey(Object key) -> Verifica se o mapa possui uma chave especfica. boolean containsValue(Object value) -> Verifica se o mapa possui um valor especfico. V get(Object key) -> Retorna um valor com base em sua chave. Set<K> keySet() -> Retorna um Set com todas as chaves. V put(K key, V value) -> Acrescenta um par, chave/valor em um mapa. V remove(Object key) -> Remove um elemento do mapa com base em sua chave. Veja, abaixo, um exemplo de uso de um mapa: package br.universidadejava.collections.map; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Exemplo de uso da interface Map */ public class ExemploMapa { public static void main(String[] args) { 269
www.metodista.br/ead

Map<Integer, String> mapa = new HashMap<>(); mapa.put(1, Antonio); mapa.put(2, Manuel); mapa.put(3, Carlos); mapa.put(2, Julia); Set<Integer> chaves = mapa.keySet(); for(Integer chave: chaves){ System.out.print(CHAVE = + chave ); System.out.println( VALOR = + mapa.get(chave) ); } } } A sada em tela do cdigo acima representada pela figura abaixo. Observe que utilizamos o mtodo put duas vezes passando a mesma chave, o nmero 2, logo, o primeiro elemento l contido (Manuel) foi sobre-escrito pelo segundo (Julia).

Figura 6

importante reforar que a interface Map no uma especializao da interface Collections, mas como seu comportamento assemelha-se as colees no tocante ao armazenamento de objetos, a mesma abordada quando tratamos de Colees.

Concluso
Assim fomos capazes de conhecer algumas das classes que compem o pacote das colees e, desta forma, compreender a importncia em se ter estruturas capazes de armazenar diferentes objetos de outras classes de forma dinmica e com diferentes comportamentos de armazenagem tal como garantia de no duplicidade, ordem definida entre outros.

Referncias DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8 ed. So Paulo: Pearson, 2010. HORSTMANN, Cay S.. Big Java. 4 ed. Porto Alegre: Bookman, 2006. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8 ed. So Paulo: Pearson, 2009. 270
Universidade Metodista de So Paulo

Prova Integrada
Anlise e desenvolvimento de sistema cliente e servidor
Polo: Curso: Tecnlogo em Anlise e desenvolvimento de sistema Nome do aluno: N0 matrcula: Nota: Data:

Prova Integrada
Anlise e desenvolvimento de sistema cliente e servidor
Polo: Curso: Tecnlogo em Anlise e desenvolvimento de sistema Nome do aluno: N0 matrcula: Nota: Data:

Prova Integrada
Anlise e desenvolvimento de sistema cliente e servidor
Polo: Curso: Tecnlogo em Anlise e desenvolvimento de sistema Nome do aluno: N0 matrcula: Nota: Data:

Prova Integrada
Anlise e desenvolvimento de sistema cliente e servidor
Polo: Curso: Tecnlogo em Anlise e desenvolvimento de sistema Nome do aluno: N0 matrcula: Nota: Data:

Prova Integrada
Anlise e desenvolvimento de sistema cliente e servidor
Polo: Curso: Tecnlogo em Anlise e desenvolvimento de sistema Nome do aluno: N0 matrcula: Nota: Data:

Prova Integrada
Anlise e desenvolvimento de sistema cliente e servidor
Polo: Curso: Tecnlogo em Anlise e desenvolvimento de sistema Nome do aluno: N0 matrcula: Nota: Data:

Prova Integrada
Anlise e desenvolvimento de sistema cliente e servidor
Polo: Curso: Tecnlogo em Anlise e desenvolvimento de sistema Nome do aluno: N0 matrcula: Nota: Data:

Prova Integrada
Anlise e desenvolvimento de sistema cliente e servidor
Polo: Curso: Tecnlogo em Anlise e desenvolvimento de sistema Nome do aluno: N0 matrcula: Nota: Data: