• Nenhum resultado encontrado

APOSTILA DE PROGRAMACAO

N/A
N/A
Protected

Academic year: 2021

Share "APOSTILA DE PROGRAMACAO"

Copied!
51
0
0

Texto

(1)

2º MÓDULO

ESCOLA ESTADUAL DE ENSINO PROFISSIONAL Dr. SOLON TAVARES

ORIENTAÇÃO A OBJETOS PROFESSOR

Engenheiro e Mestrando ALEXANDRE DIEFENTHÄLER Revisada em 2011/1

(2)

2 Orientação a objetos ... 2

2.1 Análise estruturada versus Orientação a Objetos ... 2

2.2 Por que Orientação a Objetos? ... 4

3 Paradigmas... 5 3.1 Abstração ... 5 3.2 Hierarquização ... 6 3.3 Encapsulamento ... 6 3.4 Classificação ... 7 3.5 Modularização ... 8 3.6 Relacionamento ... 8 4 Conceitos básicos... 9 4.1 Objeto ... 9 4.2 Classe ... 9 4.3 Colaboração ... 10 4.3.1 Generalização/Especialização ... 10 4.4 Polimorfismo ... 11 5 UML ... 12

6 Diagramas de caso de uso ... 14

7 Diagrama de Classes ... 17 7.1 Identificando Classes ... 17 7.2 Relacionamentos ... 18 7.2.1 Dependência... 18 7.2.2 Herança ... 19 Exercício 1... 19

8 Linguagem de programação JAVA ... 20

8.1 Principais objetivos da tecnologia java ... 21

8.2 A Java Virtual Machine... 22

8.3 O garbage collection ... 22

(3)

8.5.1 Class loader... 24

8.5.2 Bytecode verifier ... 24

8.5.3 Compilando e executando o código ... 24

9 Introdução a linguagem de programação JAVA ... 26

9.1 JREs e JDKs ... 26

9.2 Atributos ... 27

9.2.1 Booleanos ... 27

9.2.2 Caracteres ... 28

9.2.3 Inteiros ... 28

9.2.4 Número em ponto flutuante ... 28

9.3 Operadores Aritméticos... 28 9.4 Atribuição composta ... 29 9.5 Incremento e decremento... 29 Exercício 2... 29 9.6 Relacionais... 30 9.7 Lógicos ... 30 9.8 Estruturas de controle... 30

9.8.1 Estruturas de controle if... 30

9.8.2 Estrutura de seleção switch... 32

9.8.3 Estruturas de repetição ... 32 9.9 Modificadores de acesso ... 33 Exercício 3... 37 9.10 Classes wrappers ... 39 9.11 Herança... 40 9.12 Polimorfismo ... 44 10 Referências bibliográficas ... 48

(4)

1 INTRODUÇÃO

Até o início da década de 70, o computador era utilizado somente por grandes empresas. Nesse período, com a queda do preço dos computadores e a conseqüente proliferação do uso desses, cresceu a demanda por softwares. As técnicas de desenvolvimento de software utilizadas até então não eram suficientes para contornar os problemas existentes no desenvolvimento de sistemas, principalmente quando desenvolvidos em grande escala, como então se exigia. Na verdade, pouco se possuía de técnicas que estivessem sendo realmente aplicadas. [1]

Assim, surgiu a programação estruturada, seguida pelo conceito de desenvolvimento estruturado de sistemas. Essa metodologia tentava oferecer soluções para os problemas ligados ao desenvolvimento de sistemas, ao pregar a aplicação de certas técnicas, como abstração, hierarquia, etc. Essas técnicas tiveram uma rápida disseminação, sendo hoje conhecidas pela maioria dos que trabalham na área. [1]

Estamos agora, em uma situação semelhante àquela que se apresentava na década de 70. A disseminação do uso do computador se tornou muito grande e a todo instante surgem novas tecnologias de hardware que impulsionam os preços para baixo e nos abrem horizontes para novas aplicações, assim como novas perspectivas para as aplicações atuais. As técnicas oferecidas pela programação estruturada superavam com certa dificuldade as complexidades envolvidas no desenvolvimento desse tipo de sistema. Demandavam-se novas técnicas. [1]

Foi nessa conjuntura que se retornou o paradigma da Orientação a Objetos. Essa metodologia não é recente, mas somente há pouco se vislumbrou sua potencialidade. Isso por que a Orientação a Objetos, devido as suas características, reduz as dificuldades de desenvolvimento, como veremos mais adiante. E é nesse contexto que a metodologia de objetos vem oferecer uma solução alternativa para o desenvolvimento de sistemas, e significa uma grande evolução desde a programação estruturada. [1]

(5)

2 ORIENTAÇÃO A OBJETOS

É o nome que os pesquisadores da computação, na década de 70, usaram para batizar esse novo paradigma. Esse nome foi dado porque, de acordo com a visão de mundo desses pesquisadores, tudo é um objeto, ou ao mínimo, se pretende que seja. [1]

Um paradigma é uma maneira diferente de se tentar enxergar uma mesma coisa, um mesmo mundo. O paradigma da Orientação a Objetos (OO) busca bases filosóficas para tentar traduzir um mundo mais humano às instruções que o processador realmente entende. Combinadas às estruturas de linguagens imperativas, como C ou Pascal, que surgem as linguagens orientadas a objetos. Essas últimas se responsabilizaram pela existência da maioria dos grandes softwares produzidos nos dias atuais em todo o mundo. [1]

A proposta da Orientação a Objetos é permitir que os programadores organizem os programas da mesma forma que as nossas mentes enxergam os problemas e/ou as diversas situações a nossa volta: não como um conjunto de espaços de memória ou estruturas complexas de dados, mas como um conjunto de “coisas” que fazem parte do problema. “Coisas” que fazem parte de um determinado contexto e que se relacionam entre si de diversas maneiras. Essas “coisas”, dentro do paradigma da Orientação a Objetos, são conhecidas e entendidas como objetos. [1]

O desenvolvimento orientado a objetos impõe, implicitamente, uma disciplina que diminui se não todos, a maioria dos esforços inúteis provenientes da programação estruturada e/ou técnicas baseadas em banco de dados. Problemas, que muitas vezes são complicados de serem resolvidos pela programação estruturada, são facilmente solucionados pela Orientação a Objetos. [1]

2.1 ANÁLISE ESTRUTURADA VERSUS ORIENTAÇÃO A OBJETOS

Entender as diferenças entre dois paradigmas completamente diferentes é importante para que possamos compreender e conhecer melhor as suas características, vantagens e desvantagens, pelo fato de que um surgiu para tentar resolver determinados problemas do outro, o que caracteriza uma evolução. Mudar a forma com que pensamos e enxergamos o mundo a nossa volta é muito difícil, e isso reforça ainda mais a importância de tentarmos entender essa evolução.

Sendo assim, vamos levar em consideração o Modelo de Ciclo de Vida do Software, mais comumente conhecido: o modelo Clássico de Desenvolvimento ou Modelo em Cascata, que define as etapas básicas para o desenvolvimento de um software. Ele divide o processo de desenvolvimento em fases a serem geradas e metas a serem alcançadas em cada fase, com o

(6)

objetivo de validá-las. [1] O modelo possui a seguinte estrutura:

Figura 1: Modelo de Ciclo de Vida do Software Clássico. [2]

As características desse modelo são: [1]

Engenharia de Sistemas (levantamento de requisitos): envolve a coleta de requisitos quanto ao sistema. É essencial quando o software deve fazer interface com vários outros elementos. Aqui, os requisitos são devidamente documentados e revistos com o cliente; Análise de requisitos: inicia-se a especificação funcional, desenho de interfaces,

determinação de desempenho, etc.;

Projeto: é um processo de múltiplos passos que objetiva traduzir exigências (regras de negócio) em uma representação do software, que pode ser avaliada quanto à qualidade antes da codificação;

Codificação (implementação): Implementação do software;

Teste e integração: verificação quanto ao funcionamento do software, como verificar se esse atende os requisitos do cliente e

Manutenção: aprimoramento continuado. A fase mais longa. 2.2 POR QUE ORIENTAÇÃO A OBJETOS?

Mais do que saber a origem da Orientação a Objetos é importante saber quais seus principais benefícios, pois esses se tornam a motivação pela qual, grandes empresas realizam sua escolha a Orientação a Objetos: [1]

Ênfase na modelagem do mundo real: a Orientação a Objetos tenta enxergar o mundo como ele é, como um pessoa faz ao enviar mensagens ou ao realizar um serviço;

Reuso: o desenvolvimento de um sistema orientado a objetos se dá através da construção de objetos e componentes de objetos, identificados, previamente, na fase de análise e projeto, nos quais as regras de negócio são implementadas uma única vez e reutilizados quando

(7)

necessários;

Desenvolvimento rápido: a facilidade de reuso faz com que o desenvolvimento de sistemas seja mais rápido, pois não é necessário codificar repetidamente uma mesma regra de negócio pelo sistema inteiro. Simplesmente, lança-se mão de um objeto pronto;

Sistemas resilientes (tolerante à falhas): significa um sistema fácil de manter, pela forma com que ele é construído. Como foi dito anteriormente, em um sistema orientado a objetos, as regras de negócio não ficam “espalhadas” por interfaces, por módulos, etc. e não são repetidas. Ou seja: são codificadas uma única vez e em um único lugar e

Incremento na qualidade: objetos são construídos definindo-se suas tarefas e responsabilidades específicas, encapsulando regras de negócio, que por sua vez, torna possível a reutilização de código.

(8)

3 PARADIGMAS

Para compreender a essência da Orientação a Objetos é necessário conhecer e entender alguns conceitos. Alguns deles foram herdados do paradigma estruturado e receberam um enfoque um pouco diferente de sua aplicação. Para analisar problemas complexos, a metodologia de Orientação a Objetos utiliza os seguintes métodos: [1]

 Abstração;  Hierarquização;  Encapsulamento;  Modularização;  Classificação e  Relacionamento.

Na realidade, esses métodos de análise fazem parte do dia-a-dia das pessoas. Afinal, o desenvolvimento de software não é a única tarefa complexa realizada pelo ser humano. Todos os dias, problemas de maior ou menor grau de complexidade surgem, e para serem entendidos, exigem a aplicação dos métodos acima. [1]

3.1 ABSTRAÇÃO

Abstração é a capacidade de ignorar aspectos não relevantes de um assunto para o propósito em questão, tornando possível uma concentração maior nos assuntos principais. Quando se quer diminuir a complexidade, seleciona-se parte do que está sendo analisado, em vez de tentar compreender o todo. [1]

Selecionam-se os objetos que fazem parte do sistema que está sendo analisado. São eles que vão definir o escopo do sistema. Existe uma grande dificuldade em saber quais objetos fazem parte do sistema em questão e quais não fazem parte. Para que isso seja bem feito, é necessário ter um bom conhecimento do negócio, fixar bem os objetivos do sistema e a quem esse atinge. [1] Selecionados os objetos, é necessário definir os procedimentos desses objetos, ou seja, definir o comportamento de cada um. Isto vem de acordo com o escopo do sistema. Só serão definidos os procedimentos que ajudarão a resolver o problema pelo qual o sistema está sendo criado. Definir procedimentos errados pode significar que o escopo do sistema e seus objetivos não foram bem entendidos. [1]

(9)

3.2 HIERARQUIZAÇÃO

Após dividir uma forma complexa em várias partes, é comum a hierarquização dessas partes, ou seja, ordenação e organização delas. Essa organização, normalmente, parte do mais geral para o mais específico. É o que se chama de hierarquização. Exemplo: Pessoa é um tipo geral de objeto. Empregado e Estudante, um tipo mais específico de Pessoa. Assim, podemos dizer que Empregado e Estudante são subtipos de Pessoa, ou de forma reversa, Pessoa é um supertipo de Empregado ou Estudante. Todavia, hierarquizar um todo não significa priorizar determinada parte. [1] Veja estrutura abaixo:

Figura 2: Hierarquia [3]

3.3 ENCAPSULAMENTO

Encapsulamento é um mecanismo que utilizamos para esconder detalhes de estruturas complexas, que de outra forma, iriam interferir na análise. O objetivo do encapsulamento é restringir ou definir o escopo da informação para obter legibilidade, manutenibilidade e, principalmente, reutilizabilidade no desenvolvimento de sistemas. Abstração, hierarquização e encapsulamento estão ligados. [1]

Mas qual o objetivo do encapsulamento? Qual o objetivo de esconder dados e operações? O encapsulamento protege os dados de um objeto contra corrupção. Se todos os programas pudessem acessar os dados de qualquer maneira que os usuários desejassem, os dados poderiam ser facilmente adulterados ou usados para fins indevidos. O encapsulamento protege os dados contra utilização arbitrária e que fujam aos objetivos. [1]

O encapsulamento esconde dos usuários de um objeto, os detalhes da implementação interna. Os usuários compreendem quais operações podem ser solicitadas de um objeto, mas não conhecem os detalhes de como a operação é executada. Todas as características específicas dos dados de um objeto e a codificação de suas operações ficam escondidas. [1]

(10)

O encapsulamento é importante porque ele separa estas duas funções: como o objeto se comporta e como o objeto é implementado. Isso permite que as implementações no objeto sejam modificadas sem que se tenha que alterar as aplicações que o utilizam. É mais fácil alterar programas que utilizam encapsulamento porque cada tipo de objeto é modificado de cada vez. Se um objeto for alterado, apenas as operações e as estruturas de dados associados àquele objeto são afetadas e, normalmente, apenas algumas dessas operações e estruturas. [1] Veja estrutura abaixo:

Figura 3: conceito de encapsulamento. [4]

3.4 CLASSIFICAÇÃO

Classificar é associar o objeto analisado a uma determinada categoria. Cada categoria possui características próprias. Ao se comparar as características daquela categoria é que se pode ser ou não classificado como pertencente àquela categoria, definindo-se assim um tipo de objeto. [1]

Os tipos de objetos são importantes porque eles criam os elementos conceituais básicos para se projetar os sistemas. Na programação baseada em objetos, esses elementos básicos orientam o projetista na definição de classes e suas estruturas. Além disso, os tipos de objetos fornecem os índices para a operação do sistema. Por exemplo: as operações Contratar, Promover e Demitir estão intimamente ligadas ao tipo de objeto Empregado, porque elas alteram o estado de um empregado. [1]

Note que para classificar um objeto pode-se usar como parâmetro tanto suas características como finalidades (operações). [1]

3.5 MODULARIZAÇÃO

Modularizar é juntar partes com algumas semelhanças. Para melhor entendermos um sistema complexo, juntamos categorias com algumas características comuns em módulos. [1]

Esse conceito é bem empregado na fase de projeto do software. É através da aplicação dele que conseguimos organizar melhor os componentes de sistema, auxiliando no entendimento da construção, da manutenção e, muitas vezes, na implantação do software. [1]

(11)

3.6 RELACIONAMENTO

Para o funcionamento do todo é necessário que as partes funcionem separadamente, mas em conjunto. Esse funcionamento em conjunto (cooperação) é possível porque as partes se relacionam entre si. O relacionamento entre os objetos é feito através de mensagens passadas de uma parte para a outra. [1]

No paradigma da Orientação a Objetos as mensagens trocadas entre os objetos podem ser entendidas como solicitações. Essa solicitação faz com que uma determinada operação seja ativada. A operação executa o método adequado e, opcionalmente, devolve uma resposta. A mensagem que constitui a solicitação contém o nome do objeto, o nome da operação e, às vezes, um grupo de parâmetros. [1] veja estrutura abaixo:

(12)

4 CONCEITOS BÁSICOS

Nesse capítulo serão apresentados os conceitos básicos utilizados na programação a objetos.

4.1 OBJETO

Usa-se o termo “objeto” para representar uma determinada entidade do mundo real. Essa entidade, ou seja, esse objeto pode ser real ou abstrato, por exemplo: uma fatura, uma organização, uma tela com a qual o usuário interage etc. [1]

O conceito de objetos baseia-se no princípio da abstração. Através da abstração podemos dividir um determinado problema em partes para estudá-lo, separadamente. Na metodologia orientada a objetos um problema é dividido em objetos. É importante ressaltar que a metodologia estruturada também utilizava o princípio da abstração, mas sua ênfase era na procura dos processos que envolviam o problema e não nos objetos que o compunham. [1]

Um objeto pode ser composto por outros objetos. Esses objetos, por sua vez, podem ser compostos de outros objetos. Por exemplo, um motor de um carro. Ele é um objeto único, mas é composto por uma série de peças que também são vistas como objetos muito complexos. [1]

Um objeto pode, ainda, ser visto como algo que possui uma determinada característica, um estado, comportamento e identidade. É uma entidade capaz de manter um estado (informação) e que oferece um número de operações (comportamento) para examinar ou alterar o seu estado. [1]

O jargão utilizado para representar o estado e as características de um objeto é atributo e para representar as ações/reações/operações é método. Sendo assim, o software que implementa o objeto contém estruturas de dados e operações que expressam o comportamento do objeto. [1]

4.2 CLASSE

O termo classe se refere à implementação, no software, do tipo de objeto. Tipo de objeto é uma noção conceitual. Ele especifica uma família de objetos sem estipular como esses são implementados. Os tipos de objetos são identificados durante as fases de Levantamento de Requisitos e Análise. Os detalhes das classes são determinados na Análise e no Projeto. [1]

A implementação da classe especifica a estrutura de dados para cada um de seus objetos. Por exemplo: uma classe de Empregado pode incluir dados sobre isenção de impostos, cargo,

(13)

salário, número de extensão telefônica e assim por diante. Além disso, cada classe define um conjunto de operações que permitem acesso e alterações aos dados do objeto. Uma classe chamada Empregado pode incluir operações tais como contratar, promover e mudar o número da extensão telefônica. Detalhes da classe incluem a especificação de cada método. O termo método, então, refere-se à especificação que descreve uma operação. [1]

4.3 COLABORAÇÃO

Os objetos colaboram entre si a fim de disponibilizar as funcionalidades requeridas pelo sistema. Essa disponibilização de funcionalidades se dá através de troca de mensagens entre objetos. Se um objeto precisa de uma informação que não é sua, ou seja, que está em outro objeto, esse deve pedir para o outro enviando uma mensagem. Um objeto Aluno, por exemplo, não pode cancelar sua própria matrícula. Ele deve enviar uma mensagem ao objeto Setor de matrículas solicitando o cancelamento de sua matrícula. [1]

4.3.1 GENERALIZAÇÃO/ESPECIALIZAÇÃO

Especialização é quando, dada uma determinada classe ou categoria, criamos outra, com novos atributos ou serviços que a tornam mais restrita. Generalização é a operação inversa, ou seja, é a remoção de uma ou mais características de determinada classe, de modo a formar uma classe mais abrangente. [1]

Em programação, o conceito de generalização é visto como herança. Podemos então, identificar, basicamente, dois tipos de herança: herança de INTERFACE e de IMPLEMENTAÇÃO. Herdar uma interface significa assumir o compromisso de oferecer as operações definidas pela interface, ou seja, todos os métodos declarados. Dessa forma, diz-se que se herda a interface da classe. Herdar a implementação significa que instâncias da classe especializada terão parte de seus estados definidos e também controlados pela classe mais geral, mas em compensação, as operações definidas na classe mais geral também se aplicam à classe especializada, o que permite o reaproveitamento de código. [1]

Em alguns casos, apesar de uma classe definir a implementação de certa operação, convém à classe derivada especializar ou até mesmo redefinir essa operação. [1]

(14)

4.4 POLIMORFISMO

Muito provavelmente, em alguns dos primeiros programas estruturados que criamos, nos deparamos com uma pequena dúvida: “... será que eu poderia criar um procedimento em que o número de parâmetros se modificasse em tempo de execução?” A questão anterior, na verdade, quer saber se é possível criar uma operação que mude seu código em tempo de execução. Esse tipo de questionamento é o princípio do polimorfismo. Ou seja: fazer a mesma coisa de várias formas ou de forma diferente (poli=muito; morfismo=formas). [1]

SetorMatrículas Aluno

Matricular(nome: String, rg:String): void Matricular(rg:String, codigoCurso:int): void Matricular(rg:String, codigoDisciplina:long): void

Figura 5: exemplo de polimorfismo.

Saindo um pouco do conceito teórico e entrando em questões de programação, se percebe que a implementação do Polimorfismo é, por exemplo, a construção de métodos de classe com o mesmo nome (mesma ação), porém com assinaturas diferentes (mesma ação de forma variada). A assinatura de um método é dada pelo nome do método, pelo tipo de dado de seus argumentos e pelo tipo de retorno do método, caso ele possua. No exemplo citado, se vê três métodos com nomes iguais, mas com assinaturas distintas:

 Matricular (String, String);  Matricular (String, int);  Matricular (String, long);

(15)

5 UML

A Unified Modeling Language (UML- Linguagem de Modelagem Unificada) é a sucessora da onda dos métodos da análise e projeto orientado a objetos, que surgiu por volta da década de 90. Ela é a unificação do que há de melhor nos métodos de modelagem de Grand y Booch (OOD – Projeto Orientado a Objetos), James Rumbaugh (OMT – Técnicas de Modelagem a Objetos) e Ivar Jacobson (OOSE – Engenharia de Software Orientada a Objetos). [1]

Em 1997 a OMG (Objetct Management Group) tornou a UML uma linguagem de modelagem padrão para aplicações orientadas a objetos. A importância dessa padronização está no fato de que a OMG possui mais de 800 filiados, incluindo empresas como IMB, HP, Borland (Delphi) entre outras. Ou seja, os principais softwares que utilizamos são modelados e idealizados por meio da UML. [1]

Mas por que modelar? Por que perder tempo desenhando modelos enquanto poderíamos já estar codificando e, por conseqüência, construindo o software? Na verdade, os modelos são uma importante ferramenta que envolve muitos outros aspectos úteis na condução do desenvolvimento de um sistema computacional, tais como: [1]

 Diminuição da complexidade do sistema, já que é difícil entender a complexidade do todo;  Simplificação da realidade por meio de uma abstração que pode ser facilmente entendida;  Possibilidade de enxergar os problemas do sistema antes mesmo que aconteçam e  Possibilidade de simular situações que seriam perigosas ou até danosas, caso fossem

executadas no sistema em ação.

Com a UML temos condições ideais para conceber, compreender, testar, validar, arquitetar (lógica e fisicamente) e, ainda, identificar todos os possíveis comportamentos do sistema, especialmente os sistemas orientados a objetos. O esforço dessa linguagem de modelagem é permitir que, desde a representação das funções básicas do sistema e seus respectivos responsáveis, até o planejamento da arquitetura de implementação, todo o processo aconteça de maneira coerente e com uma estreita ligação com o plano anterior. [1]

Todavia, a UML não prescreve nenhum roteiro para o desenvolvimento de sistemas de informação, apenas permite que a criatividade e o bom senso permeiem um desenvolvimento com qualidade. [1]

É importante deixar claro que a UML não é uma metodologia de desenvolvimento de sistemas. Uma Metodologia de Desenvolvimento de Sistemas de Informação é baseada em um Processo de Desenvolvimento que, por sua vez, é descrito a partir do Modelo de Ciclo de Vida do software escolhido pela empresa, como o modelo padrão para construção de sistemas. Alguns

(16)

modelos de ciclo de vida do software são bastante conhecidos, tais como O modelo em Cascata (...). Esses modelos definem as etapas que devem ser cumpridas para o desenvolvimento de um Sistema de Informação. [1]

Sendo assim, é fácil identificar que o objetivo da UML é duplo: um deles é proporcionar consistências informando o patrocinador (cliente) do projeto de que o domínio do problema está bem entendido. O outro é proporcionar um modelo de consistências para a implementação adequada do software. No entanto, se utilizar a UML sem um bom Processo de Desenvolvimento, o produto final tende a ter uma qualidade discutível. [1]

(17)

6 DIAGRAMAS DE CASO DE USO

Sistemas de informação são construídos para que pessoas os utilizem e não para serem uma caixa preta que processa entradas e produz saídas. Portanto, do ponto de vista da Orientação a Objetos, o primeiro passo é identificar quem ou o que interage com a proposta de um sistema. Após, destacam-se as ações que cada parte identificada executa. Assim, é possível identificar melhor as fronteiras do sistema e, por conseqüência, entender melhor o problema. [1]

Caso de Uso é um termo técnico para definir Regras de Negócio. Quando construímos uma casa, o engenheiro precisa saber a altura do “pé-direito” da mesma para continuar a construção. “Pé-direito” é um termo técnico da construção civil para definir a altura das paredes de uma casa. Além disso, os casos de uso são uma excelente forma de entender o ponto de vista do usuário simplesmente pelo fato de que modela o que ele precisa executar. [1]

Internamente, um caso de uso é uma seqüência de ações que permeiam a execução completa de um comportamento esperado para o sistema. Esse é o ponto de partida para todo o processo, por isso é necessário ter muito cuidado e não incluir detalhes demais. Um Diagrama de Caso de Uso dever ser simples, porém não pode ser incompleto. [1] Veja figura abaixo:

Figura 6: Caso de Uso.

Um caso de uso não deve se preocupar com o “como” das funções. Este diagrama não deve prescrever seqüências de execução, mas sim, as ações que são executadas pelos Atores. É importante encapsular ações que em conjunto sejam relevantes e que, de alguma forma, influenciam algo ou alguém no sistema. Identificar um caso de uso, portanto, é um esforço que envolve: [1]

(18)

 Descobrir um ator;

 Verificar, para esse ator, ações das quais ele participa e

 Agrupar tais ações de forma que possuam um nome em comum (geralmente, um verbo no infinitivo).

Na visão UML, o desenho dos atores e casos de uso identificados e definidos se dá através do Diagrama de Caso de Uso. Esse corresponde a uma visão externa do sistema e representa, graficamente, os atores, casos de uso e relacionamentos entre esses elementos. O Diagrama de Caso de Uso tem o objetivo de ilustrar, em um nível alto de abstração, quais elementos externos interagem com qual funcionalidade do sistema. Um ator e um caso de uso são identificados pela figura 6. O relacionamento entre os dois é definido por uma seta que parte do ator em direção ao caso de uso. Essa seta indica que aquele ator executa aquela função, ou seja, aquele caso de uso. [1]

Após ter identificado os atores e os casos de uso, é necessário realizar outro exercício de abstração. É importante identificar se os casos de uso identificados possuem algo em comum. Se sim, deve haver uma “normalização” desses casos de uso, criando outros e os associando aos seus casos de uso de origem. Esse trabalho é importante para que não existam regras de negócio duplicadas dentro do sistema a ser desenvolvido. [1]

É importante estudar, na figura 6, duas ocorrências: a primeira é a respeito das setas tracejadas. Por exemplo, nos casos de usos denominados Gerar Documento com o Texto Anotado e Recuperar Página Web Anotada, duas linhas tracejadas saem de ambos e se encontram no caso de uso Navegar pelas anotações dos alunos. No exemplo, esse tipo de relacionamento entre casos de uso é identificado como extend. Ele identifica que um caso de uso (Navegar pelas anotações dos alunos) foi derivado de outros e pode utilizado por um deles. A segunda ocorrência seria, mas não ocorre na figura 6, o caso da palavra include. Essa palavra indica que funcionalidades de um determinado caso de uso devem estar presentes em outro. Ou seja: se executar um caso de uso, esse terá que também executar aquele que inclui. Assim, Gerar Documento com o Texto Anotado e Recuperar Página Web Anotada podem incluir comportamentos especificados por Navegar pelas anotações dos alunos.

O tipo de relacionamento no qual o reuso é evidente é o de generalização. Esse relacionamento permite que um caso de uso (ou um ator) herde características de um caso de uso (ou de um ator) base. O caso de uso herdeiro pode especializar o comportamento do caso de uso base. O relacionamento de generalização pode existir entre os dois casos de uso ou entre dois atores. [1]

(19)

Assim, na generalização entre casos de uso Gerar Documento com o Texto Anotado e Recuperar Página Web Anotada, é possível dizer que os dois herdam de Navegar pelas Anotações dos Alunos as seqüências de comportamento que, então, valem também para eles.

A vantagem de utilização de generalização entre casos de uso é que seqüências de comportamento feitas no caso de uso original são reutilizadas pelos casos de uso herdeiros. Somente o comportamento que não faz sentido ou é diferente para casos de uso herdeiro precisa ser redefinido. [1]

(20)

7 DIAGRAMAS DE CLASSES

[1]

Em qualquer aplicação orientada a objetos, classes são importantes por quatro motivos:

 Na verdade, são as reais estruturas de dados, ou seja, é o objeto final para o início da etapa de programação;

 Dar ao programador a noção do domínio do problema;  Projetar uma solução de implementação ao problema e

 Traçar perspectivas de escalabilidade ao sistema (onde e como o sistema pode escrever em termos funcionais).

A construção de um Diagrama de Classes está, obviamente, baseada no conceito de classe. Desse fato, pode-se concluir que Diagramas de Classes são estáticos, ou seja, devem apenas esboçar o que interage e não o que acontece quando as classes interagem. Portanto, para que se crie um Diagrama de Classes é imprescindível conhecer todos os conceitos do Paradigma de Orientação a Objetos relacionados à noção de classes. [1]

7.1 IDENTIFICANDO CLASSES

A identificação inicial de classes, seus atributos, métodos e relacionamentos, se dá através de uma análise semântica sobre todas as descrições de caso de uso identificadas. Esse é o segundo passo na tarefa de análise no processo de desenvolvimento de um sistema de informação. As regras dessa análise semântica são simples e ajudam o analista de sistemas a identificar possíveis classes dentro da documentação do sistema. Porém, elas não devem ser entendidas como a única forma de identificação de classes, atributos, métodos e relacionamentos.

[1]

Essa análise semântica consiste em marcar todos os substantivos e verbos nas descrições dos casos de uso. Os substantivos identificados surgem como possíveis classes e atributos de classes; e os verbos como possíveis relacionamentos entre as classes e seus métodos. Atributos, métodos e relacionamentos identificados pela análise semântica devem ser, efetivamente, observados para que o mapeamento das classes não se dê de forma errônea. É necessário, antes de tudo, bom senso. [1]

(21)

Uma classe existe como um encapsulamento de atributos e métodos. O último aspecto a ser considerado é a experiência do analista de sistema no que diz respeito ao exercício de abstração, junto ao seu conhecimento do negócio do usuário e dos conceitos que definem o paradigma da Orientação a Objetos. [1]

C L A S S E - A T R IB U T O 1 : char - A T R IB U T O 2 : int + M É T O D O 1 ( ) :void + M É T O D O 2 ( ) :String + M É T O D O 3 ( ) :int N o m e da c la s se D a d os d a cla sse O p e raç õ es e xe cu ta da s p e los o bje t o s d a c la sse Figura 7: classe 7.2 RELACIONAMENTOS

Uma classe não é um ponto isolado dentro do sistema e não é totalmente autônoma também. Para que uma classe obtenha sucesso e realmente execute suas tarefas, invariavelmente, ações vindas de outras classes serão necessárias. [1]

7.2.1 DEPENDÊNCIA

Em um diagrama de classes, o mapeamento de dependência significa que a classe cliente invoca métodos/operações da classe fornecedor, em um mesmo nível do contexto em que elas estão inseridas. Esse tipo de relacionamento é identificado quando mapeamos coleções no diagrama de classes. Significa que a classe “dependida” está nos métodos da classe dependente como seu argumento. Veja figura:

(22)

7.2.2 HERANÇA

Uma forma de criar hierarquias entre classes pode parecer desnecessária, mas é extremamente importante conhecer o limite de classes utilizadas na implementação, além de dar um limite ao escopo do problema. Uma classe especializada herda operações e atributos da classe superior, ou seja, não é necessário refazer métodos ou identificar atributos de classes generalizadas, pois eles já foram definidos em um nível superior. [1] Veja figura:

Figura 9: associação por herança. [7]

EXERCÍCIO 1:

Através do que já foi estudado no desenvolvimento de software orientado a objetos, faça os diagramas de caso de uso e diagramas de classes para a proposta de um software esquematizado na figura:

Pessoa

Professor Aluno

Chamada Prova Conceito Matrícula Prova Cancelar Matrícula

(23)

8 LINGUAGEM DE PROGRAMAÇÃO JAVA

A tecnologia Java é: [8]

 Uma linguagem de programação;  Um ambiente de desenvolvimento;  Um ambiente de aplicações e  Um ambiente de distribuição.

A sintaxe da linguagem de programação Java é similar à do C++. Você pode usar a linguagem de programação Java para criar todas as espécies de aplicações que criaria usando qualquer linguagem de programação convencional. [8]

Como ambiente de desenvolvimento, a tecnologia Java oferece a você um amplo conjunto de ferramentas: um compilador, um interpretador, um gerador de documentação, uma ferramenta de empacotamento de arquivos de classes e assim por diante. [8]

A linguagem de programação Java é, normalmente, mencionada no contexto WORLD WIDE WEB (web) e de navegadores (browsers) que são capazes de executar programas chamados de applets. Applets são programas escritos em linguagem de programação Java que residem em web servers. São descarregados (downloaded) por um navegador para um sistema cliente (client) e são executados por esse navegador. Os applets, geralmente, têm tamanho reduzido para minimizar o tempo de download, e são carregados por uma página de web em

Hypertext Markup Language (HTML). [8]

As aplicações da tecnologia Java são programas isolados que não exigem um web browser para serem executados. Eles são, tipicamente, programas de uso geral executados em qualquer equipamento que tenha o Java Runtime Environment (JRE) instalado. [8]

Existem dois ambientes de distribuição principais. O primeiro é o JRE, fornecido pelo Java 2 Software development Kit (Java SDK), que contém o conjunto completo de arquivos de classes de todos os pacotes da tecnologia Java, incluindo as classes básicas da linguagem, as classes componentes da GUI, uma collections API avançada e assim por diante. O outro ambiente principal de distribuição está no seu web browser. A maioria dos browsers comerciais fornece um interpretador e um ambiente de runtime da tecnologia Java. [8]

(24)

8.1 PRINCIPAIS OBJETIVOS DA TECNOLOGIA JAVA A tecnologia Java fornece o seguinte: [8]

 Uma linguagem fácil de programar por que:

o Elimina vários dos problemas de outras linguagens, tais como aritmética de ponteiros e o gerenciamento de memória que afetam a robustez do código;

o É orientada a objetos para ajudar você a visualizar o programa de uma forma próxima do mundo real e

o Permite que você agilize o código.

 Um ambiente interpretado, resultando nos benefícios a seguir: [8]

o Velocidade no desenvolvimento – reduz o ciclo de compilação-link-carga-teste e o Portabilidade de código – permite que você escreva um código que pode ser

executado em vários sistemas operacionais (em qualquer JVM certificada).

 Um modo pelo qual os programas podem executar mais de uma thread de atividade.  Um meio de alterar os programas dinamicamente durante o seu ciclo de vida runtime,

permitindo que os mesmos façam download de módulos de código.

 Uma maneira de garantir a segurança pela verificação dos módulos de código carregados.

A arquitetura da tecnologia Java usa os seguintes recursos para atingir os objetivos acima carregados: [8]

 A JVM;

 Garbage Collection;  O JRE e

(25)

8.2 A JAVA VIRTUAL MACHINE

A Java Virtual Machine Specification define a JVM como: [8]

“Uma máquina imaginária implementada por emulação de software em uma máquina real. O código da JVM é armazenado em arquivos.class, cada um contendo código de, no máximo, uma classe pública.”

A Java Virtual Machine Specification fornece as especificações da plataforma de hardware para as quais você compila todos os códigos da tecnologia Java. Essa especificação permite que o software Java seja independente da plataforma porque a compilação é feita para uma máquina genérica conhecida como JVM. Você pode emular essa “máquina genérica” por software para que ela seja executada em diversos sistemas de computadores existentes ou implementada no hardware. [8]

O compilador pega o código fonte da aplicação Java e gera bytecodes. Os bytecodes são instruções em código de máquina para a JVM. Cada interpretador da tecnologia Java tem uma implementação da JVM, independentemente dele ser uma ferramenta de desenvolvimento da tecnologia Java ou um web browser que pode executar applets. [8]

A especificação da JVM fornece definições concretas para a implementação de: um conjunto de instruções, um register set, o formato dos arquivos de classes, uma pilha de runtime, uma pilha de garbage collection, uma área de memória (chamada HEAP), um mecanismo de relato de erros fatais e suporte para timing de alta precisão. [8]

O formato de código da JVM consiste em bytecodes compactos e eficientes. Os programas representados pelos bytecodes da JVM devem manter uma disciplina de tipos adequada. A maior parte da verificação de tipos é feita no momento da compilação. [8]

O design da JVM permite a criação de implementações para múltiplos ambientes operacionais. Por exemplo: a Sun Microsystems fornece implementações de JVM para o Sistema Operacional Solaris e para os ambientes operacionais Linux e Microsoft Windows. [8]

8.3 GARBAGE COLLECTION

(26)

dinamicamente no momento do runtime (tempo em que o programa está em execução). O processo de alocar memória varia com base na sintaxe da linguagem, mas sempre envolve o retorno de um ponteiro para o endereço inicial de um bloco de memória. [8]

Depois que a memória alocada não for mais necessária (o ponteiro que dá referência na memória desaparece da extensão), o programa ou o ambiente de runtime deve desalojar a memória. [8]

Em C, C++ e em outras linguagens, você é o responsável pelo desalojamento da memória. Às vezes, isso pode ser uma tarefa difícil, porque nem sempre você sabe com antecedência quando a memória deve ser liberada. Os programas que não desalojam a memória acabarão por apresentar problemas quando não houver memória livre para ser alocada pelo sistema. Nesses casos, diz-se que os programas têm “vazamento de memória”. [8]

A linguagem de programação Java tira de você a responsabilidade de desalojar memória. Ela oferece uma thread de nível de sistema que controla cada alocação de memória. Durante os ciclos ociosos na JVM, a thread de garbage collection verifica e libera qualquer memória que puder ser liberada. [8]

A garbage collection acontece automaticamente durante o ciclo de vida de um programa da tecnologia Java, eliminando assim, a necessidade de desalojar a memória e evitando vazamentos de memória. Entretanto, os esquemas de garbage collection podem variar muito de uma implementação de JVM para outra. [8] É importante saber que a garbage collection não atue em conexões com banco de dados ou rede.

8.4 AMBIENTE DE RUNTIME DA TECNOLOGIA JAVA (JRE)

Os arquivos fonte do software Java (exemplo: arquivo. java) são compilados. Isso quer dizer que eles são convertidos em um conjunto de bytecodes a partir do formato de texto no qual você os escreve. Os bytecodes são armazenados em arquivos.class. [8]

No runtime, os bytecodes que compõem um programa e software Java são carregados, verificados e executados em um interpretador. No caso dos applets, você pode descarregar os bytecodes e depois eles são interpretados pela JVM incorporada no browser. O interpretador tem duas funções: executar os bytecodes e fazer as chamadas apropriadas para o hardware correspondente. [8]

(27)

estará instalado no sistema operacional de seu computador.

8.5 FERRAMENTA DE INTEFACE JVM

As três principais tarefas executadas pela JVM são:  Carga do código – executado pelo class loader;

 Verificação do código – executado pelo bytecode verifier e  Execução do código – realizada pelo interpretador de runtime.

8.5.1 CLASS LOADER

O class loader carrega todas as classes necessárias para a execução de um programa. Ele promove um aumento de segurança separando os namespaces das classes do sistema de arquivos local daqueles que são importados de outras fontes da rede. Isso limita a ação de qualquer programa do tipo cavalo de tróia porque as classes locais sempre são carregadas em primeiro lugar. [8]

Depois que todas as classes foram carregadas, o layout de memória do arquivo executável é determinado. Nesse ponto, endereços específicos de memória são designados para referências simbólicas e a tabela de lookup é criada. Como o layout de memória ocorre no momento de execução, o interpretador de tecnologia Java inclui proteção contra acesso não autorizado dentro das áreas restritas de código. [8]

8.5.2 BYTECODE VERIFIER

O código do software Java passa por diversos testes antes de ser executado no seu equipamento. A JVM passa o código por um bytecode verifier que testa o formato dos fragmentos de código e verifica se existe algum código ilegal nesses fragmentos – um código que força ponteiros, viola direitos de acesso aos objetos, ou tenta alterar o tipo de objeto. [8]

8.5.3 EXECUTANDO O CÓDIGO

(28)

sistema operacional:  Javac arquivo.java

Se o compilador não retornar nenhuma mensagem de erro, um arquivo do tipo “.class” estará armazenado no mesmo diretório do arquivo fonte, a menos que outro diretório seja especificado. [8]

Para executar a sua aplicação, use o interpretador da tecnologia Java. Os executáveis das ferramentas da tecnologia Java (javac, java, javadoc e assim por diante) estão localizados no diretório chamado “bin”. Execute a seguinte linha de comando no prompt para rodar o programa:

(29)

9 INTRODUÇÃO A LINGUAGEM DE PROGRAMAÇÃO JAVA

Existem diferentes versões da tecnologia Java disponíveis, e é importante desenvolvedor entender as diferenças entre as mesmas. [9]

O Java Development Kit (JDK) é o conjunto básico de ferramentas para o desenvolvedor Java. Fazem parte do JDK ferramentas importantes como o javac (compilador), java (a máquina virtual), javadoc (gerador automático de documentação) e diversas outras ferramentas importantes. [9]

Desde o lançamento do primeiro JDK em 1995, várias versões já surgiram. [9] Algumas das mais importantes são listadas abaixo:

 JDK 1.1 – essa versão incorporou uma grande quantidade de funcionalidades, entre elas, algumas das mais importantes são: Java RMI (servidor para sistemas distribuídos), JavaBeans, novo modelo de eventos e JDBC (driver para acesso a banco de dados). [9]  Java 2 – depois da evolução da JDK 1.2, foi considerado que a plataforma Java

tinha atingido uma maturidade e evolução suficientes para ser realizada uma troca de nome, de forma a permitir a inclusão de tecnologias pertinentes. [9]

 Java 2 Micro Edition (J2ME) – a plataforma Java voltada para pequenos devices (dispositivos) como telefones celulares, agendas eletrônicas, televisores, aparelhos eletrônicos em geral, também chamados de PDAs. [9]

 Java 2 Standard Edition (J2SE) – a plataforma voltada para aplicações client (cliente). Essa é a plataforma que será encontrada nos browsers web e instalada nos sistemas operacionais que já incluírem a plataforma Java. [9]

 Java 2 E n t e r p r i s e Edition (J2EE) – essa é a plataforma Java para o desenvolvimento e execução de aplicações servidoras. Possui todo o suporte para desenvolver aplicações robustas e escaláveis para suportar grande número de usuários. Os servidores de aplicação implementam essa plataforma. [9]

9.1 JREs e JDKs

Enquanto o JDK é o ambiente voltado para desenvolvedores, o Java Runtime Environment (JRE) é, basicamente, composto da Máquina Virtual Java (JVM) e o conjunto de

(30)

bibliotecas, ou seja, tudo o que você precisa para executar aplicações Java. [9]

Entre os atrativos do JRE estão os plugins. Desde a versão 1.2 (Java 2) que o JRE já traz embutido o Java Plugin, cuja JVM substitui a JVM dos browsers web e permite que mesmo versões mais antigas de browsers suportem aplicações Java. Ao instalar o JRE, você já estará instalando o Java Plugin, automaticamente. [9]

Os plugins são programas que funcionam anexados a outros programas. Suas características tornam possível visualizar vários tipos de arquivos (geralmente de multimídia como os formatos de vídeo: Avi, Mov, Mpeg, Flash, etc. Também os de som: mp3, midi, apresentações multimídia, etc. [10]

9.2 ATRIBUTOS

A definição de atributos de uma classe Java reflete de forma quase direta a informação que estaria contida na representação da classe em um diagrama UML. [9]

Para tanto, a sintaxe utilizada para definir um atributo de um objeto é: [9] <modificador> <tipo> <nome>;

Onde:[9]

 Modificador = public, protected, private, package, final e static;

 Tipo = deve ser um dos tipos primitivos da linguagem Java ou o nome de uma classe. Exemplo: int, String, etc. e

 Nome = deve ser um identificador válido.

Em Java, são oferecidos tipos literais primit ivos (não objetos) para representar valores booleanos, caracteres, inteiros e ponto flutuante. [9] O nome de um atributo sempre começa com letra minúscula e o restante com maiúscula.

9.2.1 BOOLEANOS

Variáveis do tipo boolean podem assumir os valores true ou false. O valor default (padrão) para um atributo booleano de uma classe, se não especificado, é false. [9] Uma variável do tipo boolean ocupa um bit de armazenamento. [9] Exemplo de declaração e uso: [9]

(31)

9.2.2 CARACTERES

Uma variável do tipo char contém um caractere Unicode, ocupando 16 bits ou 4 bytes de armazenamento em memória. O valor default de um atributo de classe do tipo char, se não especificado, é null. [9] Um valor literal do tipo caractere é representado entre aspas simples. [9] Exemplo:

char umCaratere = „a‟;

9.2.3 INTEIROS

Representam números sem casas decimais. Os tipos inteiros em Java podem ser: [11]  Byte: inteiro de tamanho de 8 bits que varia de -128 até +127.

 Short: inteiro de tamanho de 16 bits que varia de -32.768 a +32.767.

 Int: inteiro de tamanho de 32 bits que varia de -2.147.483.648 a +2.147.483.647.  Long: inteiro de tamanho de 64 bits que varia de

-9.223.372.036.854.775.808 a +9.223.372.036.854.775.807. 9.2.4 NÚMERO EM PONTO FLUTUANTE

Representa os números em casas decimais. [9] Os tipos podem ser:

 Float: ponto flutuante simples de tamanho de 32 bits. Exemplo: 7.9; 456.87; etc.

 Double: ponto flutuante de precisão dupla de 64 bits. Exemplo: 354335.65678765; 65.999876436776; etc.

9.3 OPERADORES ARITMÉTICOS

Operador Significado Exemplo Resultado

+ Soma dois números. 5.8+7.3 13.1

- Subtrai dois números. 9-2 7

* Multiplica dois números. 4* (-8) -32

/ Divide o primeiro número pelo segundo. 7/2 3.5

% Obtém o resto da divisão de dois números. 13%4 1

(32)

9.4 ATRIBUIÇÃO COMPOSTA

Operador Significado Exemplo Equivalente

+ = Soma e atribui. X + = 5 X= X + 5

- = Subtrai e atribui. X - = 2 X = X - 2

* = Multiplica e atribui. X * = 3 X = X * 3

/ = Divide e atribui. X / = 9 X = X / 9

% = Resto e atribui. X % = 7 X = X % 7

Tabela 2: Operadores de Atribuição Composta. [11]

9.5 INCREMENTO E DECREMENTO

Operador Significado Exemplo 1 Exemplo 2

++ Incrementa X ++ ++ X

- - Decrementa X - - - - X

Tabela 3: Operadores de Incremento e Decremento. [11]

EXERCÍCIO 2: Utilizando a chamada “System. out.printf (args [0], args [1])” que exibe na tela (prompt) o resultado das operações aritméticas estudas até aqui, faça programas que executem essas operações. Veja exemplo de uma classe Java abaixo:

public class TesteUm{

public static void main(String[] args) { System. out.printf (“%d”,5+4);

} }

(33)

9.6 RELACIONAIS

Operador Resultado verdadeiro quando:

= = Ambos operandos são iguais.

> O primeiro é maior que o segundo.

< O primeiro é menor que o segundo.

> = O primeiro é maior ou igual ao segundo.

< = O primeiro é menor ou igual ao segundo.

! = Os operandos são dieferentes.

Tabela 4: Operadores relacionais. [11]

9.7 LÓGICOS

Operador Resultado verdadeiro quando: Operandos

& & Ambos operandos são verdadeiros. 2

| | Qualquer um dos operandos é verdadeiro. 2

^ Um, e apenas um, dos operandos é verdadeiro. 2

! Inverte o valor lógico do operando. 1

Tabela 5: Operadores Lógicos. [11] 9.8 ESTRUTURAS DE CONTROLE

As estruturas de controle permitem controlar o fluxo de execução a partir de uma ou combinação de condições.

9.8.1 ESTRUTURA CONDICIONAL IF

Utilizada para decidir se executa um ou mais comandos a partir de uma condição. [11] Se a condição for verdadeira pode executar um único comando, ou pode executar um conjunto de comandos. No primeiro caso, não é necessário a utilização de chaves ({}) para delimitar a instrução. Porém, no caso de um conjunto de comandos, é obrigatório o uso de chaves.

Exemplo 1:

if(condição for verdadeira) comando único;

(34)

Exemplo 2:

if(condição for verdadeira){ comando um;

comando dois; }

Nos exemplos acima o comando ou comandos somente serão executados se a condição for verdadeira. Caso contrário, nada será executado. Existem, porém, situações que se caso uma condição não for verdadeira, queremos que outra parte do código, então, seja executada. Utilizamos a mesma estrutura descrita acima, mas acrescentamos a palavra reservada else. Veja exemplo:

Exemplo 1:

if(condição for verdadeira) comando único; else

comando único;

Exemplo 2:

if(condição for verdadeira){ comando um; comando dois; }else{ comando um; comando dois; }

Outra estrutura muito utilizada com o condicional if é o else if. Essa estrutura nos permite selecionar vários possíveis blocos de execução dentro de um programa. Exemplo:

if(condição1 for verdadeira){ comando um;

comando dois;

}else if(condição2 for verdadeira){ comando um;

(35)

comando dois; }else{...}

9.8.2 ESTRUTURA DE SELEÇÃO SWITCH

A estrutura de seleção switch seleciona através de uma variável a opção exata correspondente, como se fosse um menu. Só podemos usar o switch com variáveis do tipo short, int ou char. [11]

A instrução “break” é necessária para que saia imediatamente do case selecionado e do switch. Note que no caso do default não é necessário o “break”, pois não há mais case. [11] Exemplo: int v; switch(v){ case 1: comando1; break; case 2: comando2; break; default: comando3; } 9.8.3 ESTRUTURAS DE REPETIÇÃO

Enquanto a condição for verdadeira, repete o “laço”. [11]

Para executar esse laço podem ser utilizados três comandos, chamados de while, do while e for. No caso do while, a regra para a utilização das chaves é a mesma do if.

Exemplo 1:

while(condição for verdadeira) comando único;

Exemplo 2:

while(condição for verdadeira){ comando 1;

comando 2; comando 3; }

(36)

ou bloco de comandos. A chave deve ser sempre utilizada. Veja exemplo na próxima página: Exemplo: do{ comando 1; comando 2; comando 3;

}while(condição for verdadeira);

Por fim, o laço for, o mais utilizado. Na linguagem de programação Java existe muitas formas para utilizá-lo, mas vamos começar pelo mais comum. Exemplos:

Exemplo 1:

for(inicialização; condição; incremento ou decremento) comando1;

Exemplo 2:

for(inicialização; condição; incremento ou decremento){ comando1;

comando2; comando3; }

9.9 MODIFICADORES DE ACESSO

Alguns modificadores podem ser classificados como pertencentes a um grupo chamado

modificadores de acesso. Tais modificadores ditam como membros de uma classe são

visíveis por outras classes. [12] São eles:

Private: O modificador de acesso private é o mais restritivo de todos, e com esse

modificador os atributos são visíveis somente dentro da definição da própria classe, acessando-o diretamente acessando-ou através de uma instância da mesma classe. Exemplacessando-o: private int numero;

Protected: O modificador de acesso protected define que variáveis com esse modificador

podem somente ser acessados por classes no mesmo pacote (diretório) ou subclasses (herança) da classe onde o elemento foi definido. O modificador protected pode ser aplicado somente em variáveis e outros que veremos mais tarde, e o seu uso em classes não é permitido. Exemplo: protected int numero;

(37)

fazem parte de um mesmo pacote (diretório). A palavra reservada public modifica essa visibilidade de forma a ampliá-la, deixando-a sem restrições. Exemplo: public int numero;

Final: O comportamento descrito pelo operador final tem um conceito comum: o de

imutabilidade, isto é, um elemento final não pode ser mudado (constante). Exemplo: public final int NUMERO;

Static: A idéia geral sobre o modificador static é que elementos com esse modificador

estão associados à classe e não com instâncias da mesma. Uma variável estática é compartilhada por todas as instâncias da classe, ou seja, ao invés de cada instância da classe ter uma cópia dessa variável ela é uma única variável compartilhada por todas as instâncias. Para a existência de uma variável estática não é usada a criação de uma instância da classe que contenha a variável, é necessário somente que a classe seja carregada na Máquina Virtual Java, já que essa é criada e inicializada no momento de carga da classe. Exemplo: static int numero;

Abstract: O modificador abstract pode ser aplicado somente a classes e métodos

(que veremos mais tarde), e não a atributos.

Vejamos agora como declaramos variáveis (atributos) com esses modificadores em uma classe Java:

public class TesteUm{ private int numero1; protected int numero2; public int numero3; public final int numero4; static int numero5;

public static void main(String[ ] args) { TesteUm teste = new TesteUm();

System. out.printf (“%d”,teste.numero1+teste.numero2); }

}

A maioria das classes Java tem seus atributos declarados com modificadores

private, sendo muito específico o uso dos outros modificadores. Além dos citados, temos o package (onde nenhum modificador é especificado, sendo o atributo acessado por todas as

(38)

ainda.

Note, no exemplo anterior, que os modificadores de acesso não têm seu uso restringido aos atributos, mas também ao tipo de acesso à classe. O nome da classe do exemplo é TesteUm. Depois do modificador de acesso public, a palavra class determina que o código que segue diz respeito a uma classe. Na maioria das vezes, as classes são sempre declaradas com modificadores de acesso do tipo public, o que tem sentido, pois um objeto de uma classe pode ser acessado por um objeto de outra classe, sem problemas, a não ser em casos especiais.

Outro ponto a ser observado no código da classe é o trecho “public static void main (String [] args) { . . . }”. Nesse trecho de código há dois modificadores de acesso. O primeiro é o já conhecido public enquanto o outro é o static, definido anteriormente. O public tem a mesma função, tornar esse trecho de código acessível por outras classes. O static indica que esse trecho de código pertence à classe e não a um objeto que essa classe gerar.

Esse trecho de código, que faz parte de uma classe entre outras que podem existir, indicará essa como a classe principal. Daí o main, que em inglês quer dizer principal. Portanto, ao “rodar” um programa implementado com classes, a que tiver esse trecho de programa será a classe principal, portanto, a primeira a ser “rodada”. Pode haver apenas um trecho em uma única classe com o main indicado.

Uma classe pode ser composta por vários trechos de código. Esses trechos são chamados de métodos e pertencem à classe e aos objetos que essa gerar (se não forem static).

Para definir métodos, a linguagem de programação Java usa uma técnica semelhante à de outras linguagens de programação, particularmente da C e C++. A declaração tem o seguinte formato: [8]

<modificador> <tipo de retorno> <nome>(<argumento>){ comando1;

comando2; ... ;

}

O <tipo de retorno> indica o tipo do valor retornado pelo método. Se o método não retornar nenhum tipo de valor, ele deve ser declarado como void. A tecnologia Java é rigorosa quanto aos valores retornados e, se a declaração diz que o método retorna um int, por exemplo, o método deve retornar um int a partir de todos os caminhos de retorno possíveis. Para isso,

(39)

utiliza-se a declaração return de um método para retornar um valor. Exemplo: [8]

public class Dog{ // Declaração da classe.

private int weight; // Attribute. public int getWeight( ){ // Método 1.

return weight; // Utilizando o return.

} // Fim do método 1.

public void setWeight( int weight){ // Método 2.

this.weight = weight; // A palavra reservada this.

} // Fim do método 2.

} // Fim da classe.

O exemplo anterior é de uma classe simples chamada Dog. Note que o método public static void main (String [ ] args){...} não aparece, indicando que essa não é a classe principal. Porém, há dois métodos implementados, chamados de getWeight e setWeight. Um método, depois de definido o seu modificador de acesso e seu tipo de retorno, tem um nome (qualquer) que deverá sempre iniciar com letra minúscula e o restante iniciados com maiúscula. Isso é um padrão nas linguagens de programação orientadas a objetos. Também são padrões os métodos citados. Get, em inglês, significa pegar, enquanto set, marcar. Assim, se outra classe quiser acessar o peso do cachorro (weight), deverá utilizar os métodos para ter acesso a esse atributo, pois o modificador de acesso private impossibilita o acesso direto. Lembrando de Orientação a Objetos, temos aqui, implementado, o encapsulamento, garantido segurança nos dados. No caso de um atributo boolean, getXX é substituído por isXX.

Outro ponto a respeito dos métodos são os parênteses no final de cada um. No caso do getWeight(), nenhum parâmetro foi passado ao método. Parâmetro é um dado que é passado ao método quando necessário. Se os parênteses estiverem vazios, nada é enviado, caso contrário, algum dado é, necessariamente, enviado ao método, o que ocorre com o segundo método setWeight( int Weight). Sabendo que o parâmetro nada mais é do que uma cópia do dado enviado ao método, esse dado também deve ter um tipo, nesse caso, um int (inteiro).

O tipo de retorno no setWeight é void, uma vez que set apenas coloca o dado enviado por outra classe no atributo do objeto da classe Dog, sem precisar retorno algum. Já o getWeight pega o dado armazenado no atributo e o retorna a classe que pediu o dado. Por isso a palavra return no fim do método seguido do nome do atributo.

(40)

orientadas a objetos (não apenas Java). A palavra this (“esse”, em inglês). Note que no método setWeight(int weight) o nome do argumento é igual ao do atributo da classe! Para diferenciar o atributo da classe do argumento do método, utilizamos a palavra reservada this. Outra maneira é mais simples: fazer os nomes não serem iguais, o que é possível, mas esse tipo de implementação não é utilizado na programação orientada a objetos, pois o uso do this é importante em muitos outros aspectos que serão vistos mais adiante.

Assim, temos a primeira classe para ser utilizada, onde podemos colocar o peso de um cachorro e recuperar esse valor mais tarde. No entanto, vimos que essa não é a classe principal, então, é necessário criá-la com um método principal. Vamos chamá-la de PetShop.

Veja exemplo:

Public class PetShop{

Public static void main(String[ ] args){ Dog dog = new Dog( ); Dog.setWeight(args[0]);

System.out.printf(“%s %d”, “peso:”, dog.getWeight( )); }

}

Essas duas classes devem ser escritas em um editor de texto (o mais simples) e

armazenadas em um mesmo diretório. A extensão do arquivo sempre deve ser <arquivo>. java. Exercício 3: Considere o diagrama de classes abaixo e escreva as classes (programas) correspondentes, exceto PetShop, que será feita com o professor.

(41)

Para o exercício, podemos indicar alguns pontos. O primeiro são os trechos de códigos utilizados, chamados de métodos. Entre todos os itens que já foram utilizados (set e get, por exemplo), um não foi indicado no início da classe após a declaração dos atributos, onde sempre deve estar. Esse é chamado de construtor e toda classe sempre tem um. Assim, mesmo não escrevendo o construtor (que não é um método!), a tecnologia Java o inclui no programa por padrão, mas sem escrevê-lo. Um construtor, a princípio, não possui nenhum trecho de código explícito dentro de seu corpo. Ele é quem inicia o objeto da classe assim que essa é instanciada.

Instanciar é criar um objeto a partir dos atributos e métodos de uma classe referenciada. Esse objeto instanciado é único. Não há outro igual a ele, mesmo que todos os atributos sejam iguais a outro objeto instanciado com a mesma classe! A referência a um objeto consiste em um ponteiro para o determinado objeto. Esse ponteiro é declarado como uma simples variável de tipo igual à classe que gerará o objeto. Por exemplo: A classe Dog possui atributos e métodos para esses atributos, mas é apenas um “molde” para instanciar objetos. Assim, para criar um objeto do tipo Dog, utiliza-se a seguinte seqüência: Dog dog = new Dog ( );

A palavra Dog é o nome da classe, enquanto dog é o nome do ponteiro que referenciará um endereço para o objeto do tipo Dog na memória. Pode ser qualquer nome, como uma variável. Esse ponteiro recebe um novo objeto da classe Dog. O recebimento é indicado pelo sinal de igual, enquanto a palavra new indica um novo objeto. Por fim, note que há uma chamada direta ao construtor da classe Dog. Ou seja: Dog( ). Esse procedimento é padrão para instanciar qualquer objeto de uma classe que não seja do tipo static, que veremos mais tarde.

No segundo ponto, podemos começar a criar a classe PetShop do exercício 3, que será a classe principal e instanciará todas as outras a medida que for preciso utilizá-las dentro do programa. Como vimos antes, a classe principal sempre possui um método static e main.

Para começar a programar, um programador deve considerar como o programa deve se comportar para atender os requisitos do cliente. No exercício 3, a diagrama de classes demonstra um programa do ponto de vista de um atendente de uma petshop, portanto, a primeira coisa a fazer, é criar um objeto do tipo Atendente. Exemplo: Atendente atendente = new Atendente( );

Essa linha de código deve ser inserida no corpo do método principal da classe PetShop. Considerando o raciocínio, deve-se indicar no objeto atendente criado, o nome do atendente.

Referências

Documentos relacionados

explica quando Dom Quixote escreve a Sancho: “Quando esperava ouvir novas de teus descuidos e impertinências; Sancho amigo, ouvi-as das tuas discrições, e por isso dei

De seguida, vamos adaptar a nossa demonstrac¸ ˜ao da f ´ormula de M ¨untz, partindo de outras transformadas aritm ´eticas diferentes da transformada de M ¨obius, para dedu-

•   O  material  a  seguir  consiste  de  adaptações  e  extensões  dos  originais  gentilmente  cedidos  pelo 

1595 A caracterização do repertório de habilidades sociais dos alunos do Grupo com Baixo Desempenho Acadêmico (GBD) e do Grupo com Alto Desempenho Acadêmico (GAD),

Já agora não se me dá de confessar que sentia umas tais ou quais cócegas de curiosidade, por saber onde ficava a origem dos séculos, se era tão misteriosa como a origem do Nilo, e

For minor hand surgery procedures such as trigger finger re- lease, De Quervain tenosynovitis operation topical and local anaesthesia seemed to be a viable solution, especially in the

• Para a realização de obras em planos horizontais ou verticais ou obras com uma inclinação em uma ou duas direções • Desempenho em obras com visível laser vermelho (NL400)

Recomenda-se fortemente que o estudante se organize para ter um horário semanal fixo para se dedicar à disciplina (preferencialmente o mesmo horário toda a semana). Assim, é