Baixe o app para aproveitar ainda mais
Prévia do material em texto
Recife, 2010 Modelagem Orientada a Objetos Eduardo Araújo Oliveira Patrícia Azevedo Tedesco Volume 1 Universidade Federal Rural de Pernambuco Reitor: Prof. Valmar Corrêa de Andrade Vice-Reitor: Prof. Reginaldo Barros Pró-Reitor de Administração: Prof. Francisco Fernando Ramos Carvalho Pró-Reitor de Extensão: Prof. Paulo Donizeti Siepierski Pró-Reitor de Pesquisa e Pós-Graduação: Prof. Fernando José Freire Pró-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira Pró-Reitora de Ensino de Graduação: Profª. Maria José de Sena Coordenação Geral de Ensino a Distância: Profª Marizete Silva Santos Produção Gráfica e Editorial Capa e Editoração: Allyson Vila Nova, Rafael Lira, Italo Amorim, Arlinda Torres e Gláucia Fagundes Revisão Ortográfica: Marcelo Melo Ilustrações: Glaydson da Silva Coordenação de Produção: Marizete Silva Santos Sumário Apresentação ...................................................................................................4 Conhecendo o Volume 1 .................................................................................5 Capítulo 1 - Modelagem Conceitual: Abstração X Representação .............7 Capítulo 2 - Uma Introdução à Ideia de Objetos .........................................15 Capítulo 3 - O Paradigma OO e a Linguagem UML .....................................39 Capítulo 4 - Programando de acordo com o Paradigma POO ...................49 Considerações Finais ....................................................................................82 Conhecendo os Autores ................................................................................84 Apresentação Caro(a) Cursista, Bem-vindo(a) à disciplina Modelagem Orientada a Objetos! O objetivo principal desta disciplina é apresentar a você os principais conceitos que fundamentam a Modelagem Conceitual, em particular a Modelagem Orientada a Objetos. A partir daí, vamos trabalhar juntos para que você possa, neste primeiro momento, modelar soluções para problemas de complexidade mediada e também implementá-los. E ai, vamos juntos enfrentar estes desafios? Para tornar o nosso estudo mais agradável e proveitoso, preparamos diversas atividades e materiais que veremos juntos(as) ao longo desta disciplina. Vale ressaltar que o sucesso da nossa disciplina depende muito de você! Além do material que você vai encontrar nos livros impressos e no ambiente, nós contamos com a sua colaboração para trazer questionamentos e materiais que você encontrar em suas pesquisas para enriquecermos ainda mais o nosso trabalho. O material disponível nesta disciplina servirá para nos ajudar a refletir sobre a Modelagem orientada a objetos, e como você poderá utilizá-la para criar soluções para os problemas que enfrentará ao longo de sua vida profissional. Assim, neste primeiro módulo, vamos discutir um pouco sobre Modelagem conceitual, em particular sobre a modelagem OO. Vamos também aprender juntos sobre a linguagem UML (a linguagem mais utilizada na atualidade para modelar sistemas Orientados a Objetos). Além disto, para praticar um pouco, vamos também ver a ferramenta Joice, que vai nos ajudar na modelagem UML. Por fim, ainda neste módulo, vamos estudar em detalhes os conceitos de classes e objetos. Já no segundo módulo desta disciplina, vamos refletir com detalhes sobre o modelo OO. Em particular, vamos conhecer os conceitos de encapsulamento, herança e polimorfismo, que fazem deste modelo uma alternativa flexível e adequada aos ambientes dinâmicos para os quais temos que apresentar soluções de software. Os módulos três e quatro nos trazem o lado mais prático desta disciplina. Neles vamos estudar a Linguagem Java – bastante utilizada na atualidade e praticar bastante como implementar as soluções que aprendemos a modelar nos módulos anteriores da disciplina. Esperamos que você se sinta motivado(a) a embarcar nesta viagem, rumos aos desafios da Orientação a Objetos. Vamos juntos(as) aprender a criar soluções com o auxílio da modelagem OO. Então, pronto(a) para iniciar a viagem? Sucesso nos estudos! Eduardo Oliveira, Patrícia Tedesco Professores Autores Conhecendo o Volume 1 Neste primeiro volume, você irá encontrar o Módulo 1 da disciplina Modelagem Orientada a Objetos. Para facilitar seus estudos, veja a organização deste primeiro módulo. Módulo 1 – Introdução à Modelagem Orientada a Objetos Objetivo do Módulo 1 » Apresentar os conceitos teóricos fundamentais da Modelagem Orientada a Objetos, promovendo uma reflexão sobre os componentes do Modelo orientado a objetos. Carga horária do Módulo 1: 15h Conteúdo Programático do Módulo 1 » Modelagem conceitual: Abstração X Representação » Histórico das Linguagens de Programação OO » O Modelo de Objetos: Classes e Objetos, Comunicação por troca de mensagens. » Classes e Objetos em Detalhes 6 Modelagem Orientada a Objetos Capítulo 1 O que vamos estudar neste capítulo? Objetivos Neste capítulo, vamos estudar os seguintes temas: » Modelagem conceitual: Abstração X Representação Metas Após o estudo deste capítulo, esperamos que você consiga: » Identificar o que é abstração » Perceber a importância da abstração na orientação a objetos 7 Modelagem Orientada a Objetos Capítulo 1 - Modelagem Conceitual: Abstração X Representação Vamos conversar sobre o assunto? Olá, seja bem vindo(a) ao curso de Modelagem Orientada a Objetos! Antes de passar a discutir a ideia de modelagem Orientada a Objetos (daqui para frente, chamada de modelagem OO) propriamente dita, que tal darmos uma olhada no conceito de Programação Orientada a Objetos? Até o momento, aprendemos como escrever algoritmos através de suas várias representações e, adotamos a linguagem C, que é uma linguagem estruturada, imperativa, procedural, de alto nível, e padronizada como linguagem de programação. No entanto, como vimos nas disciplinas anteriores, o problema com a modelagem estruturada é que muitas vezes criamos programas que são difíceis de manter, e também de reaproveitar. Isto pode ser um enorme problema na atualidade, onde convivemos com ambientes cada vez mais dinâmicos, e que requerem soluções complexas. Vamos refletir um pouco sobre o que fizemos nas disciplinas anteriores de programação? Nas disciplinas anteriores, criamos softwares de pequeno porte, isto é, que não possuíam muitas linhas de código. Cada vez que escrevemos um programa, estamos interessados mais em fazer a coisa funcionar, e menos no que poderia acontecer no futuro (em outras palavras, não estávamos muito interessados em responder a questões como: será que a gente ia precisar reutilizar o programa? Seria preciso adaptar os requisitos do projeto no futuro? Poderia ser interessante ampliar o alcance do sistema produzido?). Para facilitar este processo, é preciso, antes de codificar de verdade, fazer um exercício de modelagem dos sistemas que queremos produzir. A ideia aqui é a seguinte: antes de codificar de verdade, temos que pensar (com calma) nos componentes mais importantes de cada sistema que vamos construir, e em como eles se comunicam. Mas, como fazer isto? 8 Modelagem Orientada a Objetos Assim, na próxima seção vamos discutir a ideia de modelagem conceitual em maiores detalhes. Modelagem Conceitual e Abstração Dentre os paradigmas existentes, a Orientação a Objetos destaca- se pelo ní vel de abstração. Os elementos do mundo real são modelados como objetos no mundo computacional. Os objetos, por sua vez, possuem propriedades e comportamento, assim como no mundo real. Por exemplo, se tivéssemos que construir uma aplicação bancária (daquelas que executam nos caixas eletrônicos que usamos para sacar dinheiro), poderíamos pensar que as contas-corrente seriam um objeto. Associadas a cada conta teríamos propriedades como titular, saldo, linhas de crédito, cartões, senha, etc... E ao comportamento, estariam associadas todas as operações costumeiras sobre contas, como saques, depósitos, extratos, etc... E por fim,o código desenvolvido utilizando o paradigma OO (Orientação a Objetos) expressa a solução em termos mais próximos do problema. Abstração é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando caracterí sticas menos importantes ou acidentais. Por exemplo, em uma aplicação de controle acadêmico, se quiséssemos modelar alunos da UAB/UFRPE, aspectos importantes seriam número de matrícula, CPF, disciplinas cursadas, etc... Já aspectos como esportes que pratica, número de filhos, número de camisas no guarda-roupas poderiam ser deixados de lado. Assim, usando a abstração, podemos focar apenas nos aspectos relevantes para a construção de um determinado sistema de software. 9 Modelagem Orientada a Objetos Em modelagem orientada a objetos, uma classe é uma abstração de entidades existentes no domí nio do sistema de software. Em outras palavras, uma classe agrupa entidades que têm características semelhantes. Podemos também pensar em classes e subclasses (que agrupariam entidades com características específicas de uma classe) Por exemplo, vamos imaginar uma abstração referente a uma classe de Funcionários de uma empresa. Esta classe é sub-classe de uma classe Pessoa (pois os funcionários têm nome, idade, CPF, sexo, estado civil, ...), e teria sub-classes como Diretor, Operador, Caixa, Vendedor e outros (que seriam os tipos de funcionários). Abstração pode ser vista como a habilidade de modelar características do mundo real do problema que o programador esteja tentando resolver. Por exemplo, se você, programador, estiver desenvolvendo um sistema de controle acadêmico, é muito melhor dispor de uma linguagem que te permita criar algo conhecido como “aluno” (e obviamente ofereça também mecanismos para criar rotinas que implementem o comportamento desta entidade) ao invés de recorrer a estruturas de dados tipo array ou record. Nesse contexto, a abstração refere-se à capacidade de modelar o mundo real, restringindo o nosso universo de análise e desprezando as propriedades que não são relevantes para a solução sendo construída. Em termos de desenvolvimento de sistemas, a abstração significa concentrar-se no que um objeto é e faz antes de decidir como ele será implementado. O uso de abstração preserva a liberdade para tomar decisões de desenvolvimento ou de implementação apenas quando há um melhor entendimento do problema a ser resolvido. O uso apropriado de abstração permite que um mesmo modelo conceitual (orientação a objetos) seja utilizado para todas as fases de desenvolvimento de um sistema, desde sua análise até sua documentação. Segundo o dicionário Priberam, da língua portuguesa, a definição do verbo abstrair nos diz: abstrair Conjugar do Lat. abstrahere v. tr., fazer abstracção; separar mentalmente (as qualidades ou propriedades dos seres); afastar, desprezar; v. int., 10 Modelagem Orientada a Objetos considerar isoladamente; simplificar; v. refl., distrair-se; alhear-se; concentrar-se, absorver-se. E o substantivo abstração: abstracção do Lat. abstractione s. f., acção de abstrair; separação mental de uma das partes de um todo; estado da pessoa absorta em profunda meditação, contemplação, êxtase, enlevo; distracção; hipótese. Orientação a objetos é um modelo ou uma forma para se desenvolver programas onde a gente trata as partes do sistema como elementos do mundo real. Aproveitando o exemplo citado acima e o relacionando ao mundo real, nós somos instâncias da classe Pessoa. Pessoas têm características comuns. Todos têm nome, sexo, cor de pele, cor de olhos e cabelos, altura, e outros. O que precisamos identificar é se, para determinado problema que buscamos solucionar, a exemplo de um sistema de locação de vídeos, precisaremos de informações como a cor dos cabelos ou dos olhos do usuário. Isto é abstração! Esqueça informações irrelevantes para seu programa. Se a orientação a objetos diz que devemos programar as coisas como são no mundo real, a abstração, que é uma de suas bases, diz: “mas não exagere, o mundo real é um sistema muito mais complexo que o cadastro de usuários em seu sistema”. Devemos criar objetos, mas estes precisam ser coerentes com o universo do sistema em questão. A Figura 1 ilustra a ideia apresentada até aqui. Figura 1. Modelo conceitual 11 Modelagem Orientada a Objetos Conheça Mais Você pode aprofundar os conhecimentos básicos sobre modelagem conceitual e abstração através da leitura dos livros: DEITEL, M. D.; DEITEL, P. J.: C++: Como Programar. 5a. Edição. Pearson. 2006. CORNEL, G., HORSTMANN C. S.: Core Java 2. Fundamentos. 7a Edição. Alta Books. 2005. ARNOLD, KEN; GOSLING, JAMES: A Linguagem de Programação Java. 4a. Edição.Bookman.2007. Acesse também comunidades virtuais de discussão sobre a orientação a objetos e o Java: http://www.portaljava.com http://www.guj.com.br http://www.javafree.com.br Aprenda Praticando Para vermos melhor como funciona esta ideia de abstração e modelagem, vamos discutir alguns exemplos? Suponha que fomos contratados para criar uma agenda de contatos para uma loja. Esta loja pode ter diferentes tipos de contatos. A agenda deve ainda permitir o cadastro, remoção e atualização dos contatos no sistema. Solução Para o nosso problema, que é o desenvolvimento de uma agenda de contatos, com o que precisamos realmente nos preocupar? Vamos abstrair e pensar... Precisamos guardar informações sobre nome, email, telefone, endereço e data de aniversário. Informações sobre altura da pessoa, o peso da pessoa, se ela possui animais domésticos, a cor dos olhos 12 Modelagem Orientada a Objetos e cabelos, e outras informações são necessárias? Podemos abstraí- las? Pensemos mais. Como se trata de uma agenda para uma loja, podemos ter tipos de contatos em nossa agenda. Para este caso, poderíamos pensar em algo como: geral, cliente ou fornecedor. No caso de fornecedores poderíamos ter atributos que indicassem a qualidade do fornecedor (para o caso de haver mais de um fornecendo um mesmo item). No caso dos clientes, poderíamos manter um registro da data da última compra e também uma indicação do tipo do cliente (fiel, frequente, pouco frequente e apenas uma vez). E no caso de ser um contato geral, simplesmente teríamos os dados que já pensamos antes (nome, email, telefone, endereço e data de aniversário). Percebe que devemos abstrair e entender o problema de forma a simplificá- lo? Temos que focar em nosso objetivo principal, sem tornar mais complexa nossa solução. Temos de pensar no essencial. A forma como iremos inserir, remover e atualizar dados dentro do sistema fica a critério de cada desenvolvedor. Isto é um detalhe de implementação, que pode ser feito de diversas maneiras (utilizando XML, arquivos, banco de dados, estrutura de lista, etc...). Atividades e Orientações de Estudo No final deste capítulo, vamos exercitar o conceito de abstração, e refletir um pouco sobre a sua utilidade. Para isto, vamos realizar duas atividades: uma atividade de pesquisa e uma de interação. Não esqueça que quaisquer duvidas que forem aparecendo, você pode tirar no fórum com o seu tutor/professor, ok? É muitíssimo importante não esquecer nunca que mesmo a distância, você não está sozinho. A distância é apenas física. Atividades de Pesquisa Continue pesquisando sobre o assunto. Quanto mais você ler agora, melhor será sua base em orientação a objetos e mais fácil será o aprendizado na linguagem de programação Java no futuro. 13 Modelagem Orientada a Objetos Bibliografia recomendada para iniciantes em orientação a objetos e na plataforma Java. Java - Como programar, de Harvey M. Deitel Use a cabeça! - Java, de Bert Bates e Kathy Sierra (Avançado) Effective Java Programming Language Guide - 2nd edition, de Joshua Bloch Atividades de Interação Agora que a gente já viu e pesquisou outros recursos para podermos consolidar o conceito de abstração, que tal compartilhar com o grupoos resultados obtidos? Em grupos de três pessoas, preparem uma pequena apresentação PowerPoint (ou software equivalente) sobre a ideia de abstração. Cada apresentação deve conter dois exemplos de aplicação, e uma pequena discussão sobre as vantagens (e dificuldades) de refletir sobre os conceitos relevantes de um sistema antes de codificá-lo. As apresentações devem ser postas no fórum, e cada equipe deve comentar as dos colegas também. Vamos Revisar? Resumo Você estudou, neste capítulo, a noção de abstração, e sua importância na construção de sistemas que tem sido cada vez mais complexos. Também conseguiu ver que a ideia central na construção deste tipo de sistema, diferente do que fazíamos no paradigma procedural tradicional, é dar importância ao comportamento de cada componente, e fazer isto de forma a aproveitar componentes que construímos. Conseguiu perceber que programar, agora, envolve muito mais do que simplesmente codificar! 14 Modelagem Orientada a Objetos Capítulo 2 O que vamos estudar neste capítulo? Objetivos Neste capítulo, vamos estudar os seguintes temas: » Introdução à Ideia de Objetos » O Modelo de Objetos: Classes e Objetos, Comunicação por troca de mensagens » Objetos » Classes » Atributos » Métodos Metas Após o estudo deste capítulo, esperamos que você consiga: » Aprender os conceitos básicos da Orientação a Objetos » Aprender o que são objetos » Aprender o que são classes » Identificar estado, comportamento e identidade de objetos » Entender o que são métodos e atributos 15 Modelagem Orientada a Objetos Capítulo 2 - Uma Introdução à Ideia de Objetos Vamos conversar sobre o assunto? Orientação a objetos é uma maneira de programar que ajuda na organização e resolve muitos problemas enfrentados pela programação procedural. Por exemplo, muitas vezes fica difícil reutilizar o código que a gente já fez. Vamos parar para pensar um pouquinho. Lembra dos procedimentos de entrada de dados que você fez ao longo das disciplinas de Programação? Os procedimentos não são parecidos? Não seria bom que a gente pudesse reaproveitá-los? Vamos ver, ao longo desta disciplina, que a programação orientada a objetos pode nos ajudar com muitos problemas que enfrentamos quando estamos programando (até então, pensemos na programação procedural). A orientação a objetos é também conhecida como Programação Orientada a Objetos (POO) ou ainda em inglês Object-Oriented Programming (OOP). A POO é uma metodologia de programação adequada ao desenvolvimento de sistemas de pequeno, médio ou grande porte, provendo modularidade e reusabilidade [SOBRAL, 2009]. A POO introduz uma abordagem na qual o programador visualiza seu programa em execução como uma coleção de objetos cooperantes que se comunicam através de mensagens. Segundo Sobral [SOBRAL, 2009], existem alguns aspectos importantes na definição de POO: » A POO utiliza objetos e não funções ou procedimentos como seu bloco lógico fundamental de construção de programas. » Objetos comunicam-se através de mensagens. » Cada objeto é instância de uma classe ○ Modelamos classes, e não objetos ○ Objetos são entidades reais – executam algum papel no sistema ○ Classes são abstrações – capturam a estrutura e comportamento comum a um conjunto de objetos. 16 Modelagem Orientada a Objetos » Classes estão relacionadas com as outras via mecanismos de herança ○ São formadas hierarquias de classes ○ “Filhos” (ou subclasses) herdam estrutura e comportamento dos “pais” (ou superclasses) e demais “ancestrais”, de forma indireta ○ A herança possibilita ▪ Reutilização ▪ Captura explícita de características comuns Em linguagens procedurais tradicionais, a importância maior é atribuída a processos, e sua implementação em subprogramas. Em uma linguagem como C, procedimentos ativos agem sobre dados passivos que foram passados a eles. Em linguagens orientadas a objetos, ao invés de passar dados a procedimentos, requisita-se que objetos realizem operações neles próprios [SOBRAL, 2009]. Alguns aspectos são fundamentais na definição de programação orientada a objetos, que serão esclarecidos em maiores detalhes no decorrer deste volume. » Abstração de dados » Objetos » Classes » Comunicação por troca de mensagens » Herança e Polimorfismo Todos estes conceitos serão vistos em detalhes no decorrer da disciplina. 17 Modelagem Orientada a Objetos O Modelo de Objetos: Classes e Objetos, Comunicação por troca de mensagens Até agora, quando pensávamos em desenvolvimento de software, vinha logo à mente a ideia de decompor os programas em diversos módulos e dividir cada módulo em funções e procedimentos. Muitos programadores já pensaram em dividir para conquistar. As funções e procedimentos (ou módulos) são responsáveis por solucionar partes do problema do software, como já vimos em disciplinas anteriores. A orientação a objetos é uma tecnologia de desenvolvimento composta por metodologias e linguagens usadas na análise, no projeto e na implementação de programas. Apesar de existir a décadas, só recentemente (final da década de 90) a orientação a objetos ganhou popularidade. Na verdade, isto aconteceu à medida em que os ambientes ficavam cada vez mais complexos, e que o volume de informações que os programas precisavam tratar ficava maior. De fato, era preciso encontrar formas de escrever programas que pudessem ser reutilizados, e que facilitassem a manutenção de código (à medida em que as informações se disponibilizam, os requisitos das aplicações se modificam ao longo do tempo – daí a importância em modularizar o código, para facilitar seu entendimento e suas futuras manutenções). Em parte esta popularidade decorre do uso crescente de interfaces gráficas e da arquitetura distribuída dos programas atuais, características que são adequadamente apoiadas pela orientação a objetos. Os programas desenvolvidos utilizando-se de orientação a objetos são compostos por módulos e estes módulos são os “objetos” e, em cada um deles, temos dados e funções. As funções são os “métodos” e contém o código responsável pelos serviços providos pelos objetos. Perceba que na orientação a objetos não temos o conceito de procedimentos e funções. Temos apenas os métodos (que podem ou não ter tipo de retorno e receber quantos parâmetros forem necessários). Os dados, por sua vez, só podem ser acessados através do código presente nos métodos do objeto. Por este motivo, os dados são ditos encapsulados. Fernando Albuquerque. A orientação a objetos encapsula dados (atributos) e métodos (comportamentos) em objetos; os dados e métodos de um objeto estão intimamente amarrados entre si. Por enquanto, vamos pensar em atributos como variáveis e em métodos como funções, depois aprofundaremos estes conceitos. Mas, o que quer dizer ‘encapsula dados e métodos em objetos’? Os objetos têm a propriedade de ocultar informações. Apesar de poderem se comunicar, os objetos normalmente não têm permissão para conhecer os outros objetos implementados – detalhes da implementação são ocultos dentro dos próprios objetos [DEITEL, 2006]. Tome como exemplo a seguinte situação: Podemos utilizar um computador sem saber detalhes de sistemas de transmissão e comunicação de dados, protocolos de comunicação e outros 18 Modelagem Orientada a Objetos internamente. Outro exemplo é em relação ao carro. Podemos dirigi-lo sem ter conhecimento sobre detalhes do câmbio, sobre detalhes específicos do motor, sobre troca de combustível ou outras informações. Estas informações estão encapsuladas para os usuários. Entendeu agora o que quisemos dizer com ‘encapsula dados e métodos em objetos’? Você consegue perceber outros exemplos de objetos de nosso cotidiano que possuem encapsulamento de informações? Vamos agora, enfim, conhecer um pouco mais sobre os objetos. Objetos Praticamente TUDO pode ser considerado como um objeto. Elementos como pessoas, organizações, máquinas, animais ou eventos podem ser consideradosobjetos. Um objeto denota uma entidade, seja ela de natureza física, conceitual ou de software. Exemplos de objetos: » Entidades físicas: um carro, uma pessoa, uma casa » Entidade conceitual: um organograma de uma empresa » Entidade de software: um botão em uma GUI (Graphical User Interface) Um objeto é uma entidade capaz de reter um estado (informação/ atributos/propriedades) e que oferece uma série de operações (comportamentos/métodos) ou para examinar ou para afetar este estado [CASTRO, 2009]. Outra definição para objeto poderia ser: uma unidade dinâmica, composta por um estado interno privativo (estrutura de dados) e um comportamento (conjunto de operações). Segundo PRICE, um objeto em particular é como um processador com memória própria e independente de outros objetos. Em termos de implementação, objeto é um bloco de dados privados envolvidos por código, de maneira que o acesso a ele só pode ser feito sob condições especiais. Como já discutimos anteriormente, o comportamento de um objeto é descrito através de rotinas que manipulam seus dados, sendo que o seu estado corrente está em seus próprios dados; em outras palavras, cada objeto tem suas próprias características, moldadas a partir de uma matriz, a classe. Se pensarmos em um banco, podemos ter dois exemplos de classe. Uma classe representando as contas de um 19 Modelagem Orientada a Objetos banco e outra classe representando os clientes do banco. A classe Conta, que é um objeto, poderia ter atributos como saldo, limite, dono da conta, numero da conta e realizar comportamentos (métodos) como sacar valores, transferir valores e depositar valores. No caso do Cliente, poderia ser representado com atributos como nome, endereço e CPF. A troca de mensagem é justamente a chamada a um objeto para acessar um de seus métodos, ativando um comportamento descrito por sua classe. No caso, se um objeto do tipo Cliente acessa um método da classe Conta para sacar valores, os objetos estão trocando mensagens. A troca de mensagens também pode ser direcionada diretamente a uma classe (através de uma invocação a um método estático, conforme veremos no decorrer do curso). Este relacionamento entre conta e cliente é exemplificado através da Figura 2. Por enquanto, perceba apenas as duas classes representando (abstração) uma conta e um cliente. Depois explicaremos esta representação gráfica em maiores detalhes. Figura 2. Relacionamento entre a classe Conta e a classe Cliente Um objeto é composto de estado, comportamento e identidade [CASTRO, 2009]. » Estado: são as informações, estruturas de dados que representam o estado interno do objeto. Em geral, não são acessíveis aos demais objetos. Representa uma das possíveis condições em que um objeto pode existir. ○ O estado é representado pelos valores das propriedades de um objeto em um determinado instante ▪ Exemplo (Aluno Eduardo): 20 Modelagem Orientada a Objetos ▪ Nome: Eduardo ▪ Matrícula: 301182 ▪ Semestre de Ingresso: 20101X ▪ Exemplo (Conta bancária) ▪ Saldo: R$510,00 ▪ Limite: R$200,00 ▪ Numero Conta: 03098-4 ▪ Dono Conta: Antonio » Comportamento: o comportamento de um determinado objeto é definido por conjunto de operações, chamadas de métodos, que agem sobre os estados internos dos objetos. Os métodos são ativados (disparados) quando o objeto recebe uma mensagem solicitando sua execução. O comportamento determina como um objeto pode responder a interações mediante a ativação de operações decorrentes de mensagens recebidas de outros objetos. Por exemplo, toda vez que você vai ao caixa eletrônico do seu banco fazer um saque, o objeto conta bancária recebe uma mensagem indicando que ele deve atualizar seu saldo (subtraindo o valor que você acabou de sacar). Ao receber esta mensagem, o objeto ativa o método ‘atualizar saldo’, que cuida de fazer esta atualização. O interessante disto é que a forma como a atualização é feita não precisa ser conhecida por ninguém, então a gente pode atualizar este método, se for necessário, e nenhuma outra parte do sistema será afetada. Esta atualização pode ser realizada graças ao conceito de herança1, que é o mecanismo pelo qual uma classe (subclasse – a classe que irá estender a superclasse para utilizar o método ‘atualizar saldo’, quem irá chamá-lo – este passo é conhecido nosso, já realizamos chamadas a funções de programas C – isto é semelhante a chamadas de métodos agora) pode estender outra classe (superclasse - no nosso caso, a superclasse seria quem possui o método ‘atualizar saldo’), aproveitando seus comportamentos (métodos) e variáveis possíveis (atributos). Os atributos e métodos somente podem ser manipulados através das operações definidas na interface2 do objeto, de modo que a forma de armazenamento das propriedades e a implementação Saiba Mais 1 Herança - A Herança é um princípio da POO que permite que as classes compartilhem atributos e operações (métodos - comportamentos) baseados em um relacionamento, geralmente generalização. A herança permite a criação de subclasses que herdam alguns dos atributos e das operações da classe pai (superclasse). A herança é utilizada com o objetivo de reaproveitar código ou comportamento generalizado ou especializar operações ou atributos [Wikipedia]. 21 Modelagem Orientada a Objetos ▪ Nome: Eduardo ▪ Matrícula: 301182 ▪ Semestre de Ingresso: 20101X ▪ Exemplo (Conta bancária) ▪ Saldo: R$510,00 ▪ Limite: R$200,00 ▪ Numero Conta: 03098-4 ▪ Dono Conta: Antonio » Comportamento: o comportamento de um determinado objeto é definido por conjunto de operações, chamadas de métodos, que agem sobre os estados internos dos objetos. Os métodos são ativados (disparados) quando o objeto recebe uma mensagem solicitando sua execução. O comportamento determina como um objeto pode responder a interações mediante a ativação de operações decorrentes de mensagens recebidas de outros objetos. Por exemplo, toda vez que você vai ao caixa eletrônico do seu banco fazer um saque, o objeto conta bancária recebe uma mensagem indicando que ele deve atualizar seu saldo (subtraindo o valor que você acabou de sacar). Ao receber esta mensagem, o objeto ativa o método ‘atualizar saldo’, que cuida de fazer esta atualização. O interessante disto é que a forma como a atualização é feita não precisa ser conhecida por ninguém, então a gente pode atualizar este método, se for necessário, e nenhuma outra parte do sistema será afetada. Esta atualização pode ser realizada graças ao conceito de herança1, que é o mecanismo pelo qual uma classe (subclasse – a classe que irá estender a superclasse para utilizar o método ‘atualizar saldo’, quem irá chamá-lo – este passo é conhecido nosso, já realizamos chamadas a funções de programas C – isto é semelhante a chamadas de métodos agora) pode estender outra classe (superclasse - no nosso caso, a superclasse seria quem possui o método ‘atualizar saldo’), aproveitando seus comportamentos (métodos) e variáveis possíveis (atributos). Os atributos e métodos somente podem ser manipulados através das operações definidas na interface2 do objeto, de modo que a forma de armazenamento das propriedades e a implementação Saiba Mais 2Segundo o próprio site da Sun (http://java. sun.com/docs/ books/tutorial/ java/concepts/), “uma interface é um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela está comprometida a fornecer o comportamento publicado pela interface”. das operações são desconhecidas pelas outras entidades externas (encapsulamento de informações). O Comportamento é determinado pelo conjunto de operações que o objeto pode realizar. São os métodos da classe (semelhante as funções em C, como já vimos). ▪ Exemplo (Controle Acadêmico) ▪ Eduardo ▪ Solicitar matrícula ▪ Retorna: 301182 ▪ Exemplo (Conta) ▪ Realizar um saque em conta de R$50,00 ou, ▪ Realizar uma transferência ou, ▪ Realizar um depósito» Identidade: é uma propriedade que diferencia um objeto de outro; ou seja, seu nome. ▪ Eduardo (objeto - representação/abstração de um aluno) ▪ Controle Acadêmico (Sistema que está sendo construído) ▪ Semestre (estado) ▪ Matrícula 301182 (Propriedade de um aluno) A Figura 3 nos mostra como representar objetos graficamente. Em breve discutiremos esta representação e algumas outras em maiores detalhes. Conheceremos ainda um pouco sobre a Linguagem UML3 (Unified Modeling Language), que é uma das linguagens mais utilizadas atualmente para a representação gráfica de modelagem de sistemas. Hiperlink 3 UML – http:// www.uml.org 22 Modelagem Orientada a Objetos Figura 3. Notação utilizada para representação de objetos Os atributos e métodos de uma classe podem ter vários graus de visibilidade (acesso a partir de entidades externas). Para representar a visibilidade dos atributos e operações (métodos) em uma classe utiliza-se as seguintes marcas e significados: » + (público) - visível em qualquer classe ○ Visível a todos. Qualquer outra classe tem acesso a um atributo ou método publico. » # (protegido) - qualquer descendente pode usar ○ Se uma classe herdar outra, esta subclasse terá acesso aos atributos e métodos públicos da superclasse » - (privado) - visível somente dentro da classe4 ○ Os atributos e métodos são visíveis apenas pela classe que os possui. Se uma subclasse tenta acessar um atributo ou método privado de uma superclasse, esta tentativa será considerada erro de sintaxe. Nota No decorrer deste fascículo, entraremos em maiores detalhes sobre as permissões e visibilidades dos atributos e métodos. Você terá ainda oportunidade de se aprofundar neste assunto quando iniciar a leitura do volume 2, onde teremos um capítulo inteiro voltado ao encapsulamento de informações. Enquanto que os conceitos de dados e procedimentos são frequentemente tratados separadamente nas linguagens de programação tradicionais, em POO eles são reunidos em uma única Saiba Mais 4 O acesso a dados private de uma classe pode ser fornecido através de métodos get (métodos de acesso) e podem ser modificados através de métodos set (métodos mutatórios). 23 Modelagem Orientada a Objetos entidade: o objeto. Ainda não estudamos as classes, mas uma classe representa um conjunto de objetos com características semelhantes. O comportamento dos objetos é definido na classe através de seus métodos e atributos. Um exemplo de classe, que apresenta bem o conceito de ‘um conjunto de objetos com características semelhantes’ poderia ser a classe “Seres Humanos”. Exemplos de objetos da classe “Seres Humanos” seriam João, Maria, José, Eduardo, Patrícia. Se pensarmos ainda numa classe que representa os Mamíferos, teríamos objetos como baleia, morcego, seres humanos e outros como instâncias desta classe. O objeto, que é uma instância de uma classe, é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. No mundo real não é difícil a identificação de objetos (em termos de sistemas, objetos são todas as entidades que podem ser modeladas). Como exemplo, em uma empresa pode-se identificar claramente objetos da classe “Empregado” [SOBRAL, 2009] Um empregado possui uma identidade/estado próprio, seu nome: José da Silva, por exemplo. Possui também propriedades/atributos como: endereço, idade, dependentes, salário, cargo, entre outras. O comportamento/métodos pode ser determinado por operações como: aumentar salário, listar dependentes e alterar cargo. Você consegue identificar classes e objetos em seu polo de ensino, em seu trabalho ou até mesmo em sua casa? Tome nota das classes e objetos, adicione atributos e métodos e relacione as instâncias de classe. Após este exercício, discuta o que foi produzido no fórum da disciplina. Classes Uma classe é a descrição de um grupo de objetos com propriedades (atributos), comportamentos (métodos), e relacionamentos com outros objetos (associações e agregações) [CASTRO, 2009; SOBRAL, 2009]. Como já discutido antes, um objeto é uma instância de uma classe. Uma classe define os atributos e métodos de um tipo de objeto. Cada objeto individual é então criado com base no que está definido na classe. Por exemplo, Empregado é uma classe que representa funcionários de uma empresa; cada colaborador (funcionário), que possui nome, CPF, idade, sexo, dependentes, salário, enfim atributos, 24 Modelagem Orientada a Objetos é um objeto dessa classe. A estrutura da classe Empregado está representada na Figura 4. Como podemos perceber, a classe tem três atributos públicos e quatro métodos, também públicos. O método atualizarNome, por exemplo, recebe um String, que é um nome, como parâmetro e retorna um valor lógico (booleano) para notificar se o nome foi atualizado ou não. Figura 4. Representação da classe Empregado Um objeto é criado quando a gente dá valores aos atributos de uma classe. Uma classe provê toda a informação necessária para construir e utilizar objetos de um tipo, cada instância pertence a uma classe e uma classe pode possuir múltiplas instâncias (lembra do exemplo da classe Seres Humanos e da classe Mamíferos?). Exemplos de classe: Classe: Professor Atributos: Nome (String), Matrícula (String), Data de Contratação (Date), Titulação (String) Métodos: DefineNome(), AlteraNome(), TempoServiço(), DefineTitulação(), ... Classe: Turma Atributos: Cod (Inteiro), Nome (String), Local (String), Créditos (String), Horário (Date), Capacidade (Inteiro) Métodos: DefineCod(), AlteraCod(), DefineNome(), AlteraNome(), NrCreditos(), ... 25 Modelagem Orientada a Objetos Classes e Objetos em Detalhes As classes são organizadas em níveis hierárquicos (lembra que já vimos um pouco sobre herança?) compartilhando estruturas e comportamentos comuns e são associadas a outras classes (subclasses e superclasses). Por exemplo, vamos imaginar as classes que representam os mamíferos e a classe que representa os seres humanos e cachorros, mostrada na Figura 5. Figura 5. Exemplo de herança entre classes A classe cachorro poderia ser codificada em Java da seguinte maneira: class Cachorro extends Mamiferos { // Atributos dos objetos da classe public String nome; public String cor; public String raca; public int peso; public String altura; // Métodos(comportamentos dos objetos da classe) 26 Modelagem Orientada a Objetos public void andar() { //executa aqui, em códigos, a ação de andar } public void correr(int velocidade) { //executa aqui, em códigos, a ação de correr } public void latir(int altura) { //executa aqui, em códigos, a ação de latir } public void comer(int quantidade) { //executa aqui, em códigos, a ação de comer } } //encerra a classe Perceba que essa classe herda da classe Mamiferos, conforme descrito na declaração da classe, através da palavra reservada extends. Caso a classe Cachorro desejasse acessar o método mamar(), da classe mamíferos, ela conseguiria, pois ela herda os métodos e atributos públicos da classe pai (Mamíferos). Quando utilizamos herança para criar uma nova classe a partir de uma classe existente, a nova classe herda os atributos e comportamentos dessa classe existente [DEITEL, 2006]. As classes se organizam, e para facilitar a reusabilidade de classes, elas são pensadas como uma hierarquia. Isto significa que classes mais abaixo (subclasses) na hierarquia assumem propriedades das classes superiores (superclasses). Mais um exemplo de herança para pensarmos seriam as classes Pessoa e Funcionário; Funcionários herdam características de Pessoa, como idade, RG, altura, etc... Vamos agora ver um pouco sobre como escrever as classes 27 Modelagem Orientada a Objetos Declaração de Classes: [modificadores] class NomeClasse [extends SuperClasse] [implements Interface] { atributos métodos } Modificadores Classe Pública (public):a classe pode ser utilizada por objetos de fora do pacote. Classe Abstrata (abstract): não pode ter objetos instanciados Classe Final (final): a classe não pode ter subclasses As classes definem os valores de atributos e métodos. Atributos Os atributos são as características do objeto. Como já vimos, no caso de uma Classe que representa um objeto Professor, atributos como Nome, Idade, Sexo, Matrícula, Data de Contratação, entre outros, definem características do objeto. Em outras palavras, os atributos dão valores às características de cada objeto. Cada atributo tem um nome e um tipo de dado (String, Inteiro, Real, Lógico). Os atributos são representados, segundo a notação gráfica da classe, no segundo terço da imagem, conforme apresentado na Figura 6. Figura 6. Classe Professor com atributos de Nome e Idade 28 Modelagem Orientada a Objetos Atributos são definidos ao nível da classe, enquanto que os valores dos atributos são definidos ao nível do objeto [CASTRO, 2009]. Métodos Métodos ou operações são o comportamento ou funções da classe. Um método é algo que se pode pedir para um objeto de uma classe fazer. Todos os objetos de uma classe compartilham os mesmos métodos. Os métodos, assim como já vimos em funções, podem ter tipo de retorno ou não, e receber parâmetros ou não. Os métodos são definidos dentro da classe, enquanto que sua invocação/utilização é definida ao nível de objeto. Por exemplo, uma classe Professor define um método alteraNome(String) dentro da classe Professor, e quem irá acessar este método será uma instância da classe, que é um objeto. Declaração de Métodos: [acesso] [chaves] tipoRetorno nomeMetodo( parametros ) { corpo do método } acesso: » public: o mundo inteiro pode acessar » protected: somente os métodos da classe e de suas subclasses podem acessar, ou ainda, estando num mesmo pacote (depois entenderemos pacotes) » private: somente os métodos da classe podem acessar o atributo chaves: » static: método da classe e não das instâncias » abstract: utilizado somente em classes abstratas » final: o método não pode ser sobrescrito » synchronized: declara o método como zona de exclusão mutua no caso de programas concorrentes. 29 Modelagem Orientada a Objetos » tipoRetorno: pode ser tipos de dados primitivos (int, double, float, boolean, char), objetos (classes como String, Integer, Pessoa, Mamiferos, ...) ou não retornar nada (void). Os métodos são representados, segundo a notação gráfica da classe, no último segmento da imagem, conforme apresentado na Figura 7. Figura 7. Classe Professor com atributos e métodos Criando Classes Para criar um objeto é necessário criar uma classe e instanciar um objeto a partir da classe criada, conforme apresentado na Figura 8. Quando uma instância de uma classe é gerada, um objeto é criado e o sistema aloca memória para seus atributos [SOBRAL, 2009]. 30 Modelagem Orientada a Objetos Figura 8. Classe Empregado com duas instâncias (EmpregadoUm e EmpregadoDois) Em Java, teríamos algo como: Empregado empregado = new Empregado(); (dentro da Classe EmpregadoUm e dentro da Classe EmpregadoDois). Este código cria um novo objeto do tipo Empregado, com o nome de empregado (empregado é uma variável do tipo Empregado). Se este código estiver dentro de uma outra classe, estaremos criando uma instância de Empregado dentro desta outra. Visibilidade de Atributos e Métodos Na POO utilizamos o encapsulamento de informações provendo permissões de acesso aos atributos e métodos das classes. Veremos encapsulamento de informações de maneira detalhada em nosso primeiro capítulo do segundo volume. Agora, aprenderemos um pouco mais sobre o uso destas permissões de acesso (visibilidade). Modificadores de acesso: 1. Public A palavra reservada public informa que o atributo ou o método são públicos, ou seja, qualquer um pode acessar (desde subclasses como outras classes que a estão instanciando). 31 Modelagem Orientada a Objetos O alvo aqui é o programador cliente que utiliza as classes. É raro ter atributos públicos, mas é comum ter métodos públicos. 2. Private A palavra reservada private informa que a propriedade ou método só podem ser acessados internamente na classe. Nem seus filhos podem acessá-lo. A intenção aqui é permitir que apenas quem escreve a classe tenha acesso aos membros desta. 3. Protected A palavra reservada protected informa que subclasses podem acessar, mas outras classes ou funções não têm essa permissão. A intenção é dar acesso ao programadores que estenderão a classe. Ainda pensando nos modificadores de acesso, vamos aprender um pouco mais sobre os pacotes que utilizamos em Java e sobre suas funcionalidades; desta forma, conheceremos o último modificador de acesso que temos em Java. Packages (Pacotes) O conceito de package (pacote) foi criado para permitir criar um espaço grande de nomes em Java. O que ocorria se um programador criasse uma classe Empregados e outro programador já estivesse criado esta? Será que algum destes seria prejudicado ou impossibilitado de criar sua classe? Este tipo de problema não ocorre caso as classes estejam em packages diferentes. Os nomes dos packages formam uma árvore, permitindo assim um espaço de nomes muito grande. Exemplo: pacote.exemplo.nomeempresa é um nome de package pacote.exemplo.nomeempresa.Empregados é uma classe deste package (note que, por notação, as classes sempre iniciam o nome com letra Maiúscula) Por conta do uso de pacotes, poderíamos ter uma outra classe de nome Empregados, em outro pacote, a exemplo de: pacote2. 32 Modelagem Orientada a Objetos exemplo.Empregados ou pacote3.Empregados... Enfim, podemos ter várias classes de mesmo nome, desde que cada uma esteja em um pacote distinto. Os nomes dos pacotes são definidos por nós, programadores. A visibilidade e os Pacotes Se um membro de classe (atributo ou método) não possui explicitamente um modificador de acesso, este é tido como visibilidade package (friendly ou default). Esta visibilidade é como o public, mas somente dentro do package. Todas as classes de um mesmo package (e apenas estas) podem acessar um membro friendly/default. * É importante ter cuidado com a visibilidade default para atributos da classe. A depender do tamanho dos pacotes, muitos dados podem ficar expostos. Conheça Mais Agora que já vimos os conceitos básicos dos objetos, classes e a forma como se relacionam, que tal aprofundar seus conhecimentos? DEITEL, M. D.; DEITEL, P. J.: C++: Como Programar. 5a. Edição. Pearson. 2006. CORNEL, G., HORSTMANN C. S.: Core Java 2. Fundamentos. 7a Edição. Alta Books. 2005. ARNOLD, KEN; GOSLING, JAMES: A Linguagem de Programação Java. 4a. Edição.Bookman.2007. Acesse também comunidades virtuais de discussão sobre a orientação a objetos e o Java: http://www.portaljava.com http://www.guj.com.br http://www.javafree.com.br Existem ainda revistas especializadas na linguagem de orientação que iremos adotar durante esta disciplina: » Mundo Java; 33 Modelagem Orientada a Objetos » Java Magazine. E você, encontrou algum outro link interessante? Se sim, não deixe de postá-lo no fórum da disciplina, e compartilhar os seus achados com professores e colegas, está certo? Aprenda Praticando Agora, vamos ver os conceitos juntos em uma aplicação? Imagine que a gente foi contratado para modelar (segundo o paradigma da orientação a objetos, claro!) um sistema de cálculo de notas para a UAB/UFRPE. Vamos ver que objetos, classes, métodos e atributos estariam envolvidos? Passo 1. Vamos elaborar uma descrição do problema, ou seja, entender bem quais as entidades e seus comportamentos envolvidos? Passo 2. Quais as classes que precisaríamos criar? Vamos incluir alguns objetos também? Passo 3. Quais os comportamentos associados? Solução Para esta aplicação, que é simples e muitos já tiveram oportunidade de desenvolvê-la em outras disciplinas, o que precisamos? Para calcular as notasda UAB, precisamos de quantas notas? Estas notas serão atributos de nossa classe. Mas, quantas classes seriam necessárias? Com uma classe resolvemos o nosso problema? Podemos criar uma única classe, de nome CalcularMedia, e adicionar atributos do tipo double (que veremos no decorrer do curso, por enquanto precisamos saber que double = real), que poderíamos chamar de nota1, nota2, nota3, etc... Estes atributos teriam visibilidade privada, uma vez que só os utilizaríamos dentro de nossa classe CalcularMedia. E que métodos precisaríamos criar? Esta é uma decisão que pode variar de desenvolvedor para desenvolvedor. Como já estudamos, existem 1000 maneiras diferentes de escrever um algoritmo, não é mesmo? Bom, pensemos em algo bem simples então... 34 Modelagem Orientada a Objetos Podemos criar um método chamado calcularMedia, que recebe as notas por parâmetro e exibe o valor para o usuário. Em código, teríamos o seguinte programa: import javax.swing.JOptionPane; public class CalcularMedia { /** * este metodo foi criado, de maneira simples, * para calcular uma média entre duas notas * @param nota1 * @param nota2 */ public void calcularMedia(double nota1, double nota2) { //esta chamada imprime um resultado no console //(saída do programa) System.out.println((nota1+nota2)/2); } /** * este é o metodo principal do programa * (semelhante ao main do C, como ja estudamos) * @param args */ public static void main(String[] args) { //atributos do METODO main. Não são GLOBAIS. //Não são da Classe. //São acessíveis apenas dentro deste método int nota1; int nota2; 35 Modelagem Orientada a Objetos //instancia da classe CalcularMedia CalcularMedia calc = new CalcularMedia(); //JOptionPane.showInputDialog é um método, da //biblioteca Java, que apresenta uma janela para //o usuário com uma mensagem, solicitando entrada //de dados. O valor digitado pelo usuário é sempre //um String. Por este motivo, temos que // transformar este valor que no caso solicitamos //(uma nota), para um valor int, e utilizamos //então um outro método da API Java //(Integer.parseInt()). nota1 = Integer.parseInt(JOptionPane.showInputDialog (null, “Digite a nota 1”)); nota2 = Integer.parseInt(JOptionPane.showInputDialog (null, “Digite a nota 2”)); //chamada ao método que recebe as notas // e calcula uma média calc.calcularMedia(nota1,nota2); } } Atividades Práticas 1. Vamos exercitar? Para começar, vamos imaginar que fomos contratados para modelar duas aplicações. Um controle de estoque para o supermercado da nossa cidade, e uma aplicação para a locadora de filmes. Agora, para cada uma das aplicações, enumere as classes necessárias. Lembre de considerar os atributos e métodos da classe. Uma vez criado o esqueleto de cada classe, agora é hora de pensar nos parâmetros e tipos de retornos dos métodos que irá prover 36 Modelagem Orientada a Objetos em suas classes. Para desenhar as classes (representar graficamente, fazer a modelagem), você pode utilizar o JUDE5 ou o ArgoUML6. Após o desenvolvimento da atividade, discuta no fórum suas soluções. 2. Crie um arquivo texto e responda as perguntas abaixo. Depois, envie o artigo no link Atividade Virtual 1, disponível no ambiente. a. O que é uma classe? Demonstre com um trecho de código em Java b. O que é uma instância? Ilustre com um trecho de código. c. Cite 3 vantagens da programação orientada a objetos. d. Cite e explique três características que deveriam estar presentes em uma linguagem de programação OO. e. Escolha uma linguagem de programação e descreva as características do POO encontradas nesta linguagem. f. Escolha um domínio de problema, descreva este domínio através de um modelo descritivo sucinto e represente o contexto descrito através dos conceitos do POO. Atividades de Interação Vamos trocar ideias em um fórum de discussão que será coordenador pelo tutor virtual. Converse com seus colegas, entreviste pessoas sobre o assunto, leia mais sobre o tema abordado neste capítulo. Realize uma entrevista com alunos e outros colegas professores, a fim de coletar informações sobre as vantagens e dificuldades encontradas pelos desenvolvedores OO. O que é preciso ter em mente quando se participa deste tipo de desenvolvimento? Que dicas poderíamos dar para facilitar o processo? Que dificuldades você enfrentou até agora? Saiba Mais 5 Jude - o nome do programa é um acrônimo de Java and UML Developers Environment (Ambiente para Desenvolvedores UML e Java). Download em: http://jude. change-vision. com/jude-web/ download/index. html Saiba Mais 6 ArgoUML – uma aplicação open source que usa UML para modelar o softwares de computador. Download em http://argouml. tigris.org/ 37 Modelagem Orientada a Objetos Vamos Revisar? Resumo Você estudou, neste capítulo, os conceitos básicos da Orientação a Objetos. Em particular, vimos os conceitos de classes e objetos, que unem a parte de dados e comportamento das entidades de mundo real, o que permite que construamos modelos mais fiéis, e também mais fáceis de manter do mundo real. Também vimos como representar os comportamentos, através dos métodos e que níveis de visibilidade podem ser utilizados. Vimos também que, antes de começarmos a codificar, é preciso entender bem os problemas e criar soluções abstratas, que depois serão concretizadas na implementação. No próximo capítulo estudaremos a linguagem UML, que vai nos permitir representar bem todas as características de um sistema de software, antes de codificá-lo. 38 Modelagem Orientada a Objetos Capítulo 3 O que vamos estudar neste capítulo? Objetivos Neste capítulo, vamos estudar os seguintes temas: » O que é a Linguagem UML? » Diagramas da Linguagem UML Metas Após o estudo deste capítulo, esperamos que você consiga: » Identificar os conceitos básicos da UML » Identificar como representar sistemas através dos diagramas providos pela UML 39 Modelagem Orientada a Objetos Capítulo 3 - O Paradigma OO e a Linguagem UML Vamos conversar sobre o assunto? Com o avanço na utilização das linguagens orientadas a objeto na década de 90, junto à disseminação e utilização destas (linguagem Java, por exemplo), começou a surgir também um grande número de metodologias e diferentes notações para desenvolver e representar softwares. Este fenômeno foi causado pela evolução da tecnologia, que permitiu com que se construíssem aplicações cada vez mais complexas, que integram um volume imenso de informações. Com isto, era preciso, antes de implementar os sistemas propriamente ditos, criar modelos de soluções, que poderiam ser refinados juntamente com os usuários e clientes das aplicações, para garantir um desenvolvimento bem sucedido. Através da OMG7 (Object Management Group), uma proposta foi iniciada para apresentação de trabalhos de padronização de um modelo para desenvolvimento de sistemas que contribuísse com o paradigma da orientação a objetos. A Rational Software Corporation propôs e obteve Êxito com a linguagem UML (Unified Modeling Language). Esta proposta de padronização foi um esforço liderado por Grady Booch, James Rumbaugh e Ivar Jacobson que resultou na versão 1.0 da UML publicada em janeiro de 1997. A linguagem UML foi adotada como padrão pela OMG no mesmo ano [FURLAN, 1998]. O que é a linguagem UML A Linguagem de Modelagem Unificada (UML) não é um método de desenvolvimento de sistemas. É uma linguagem de modelagem gráfica para descrever um projeto de software. Ela cria visões do sistema que está sendo desenvolvido, simplificando, desta forma, o processo de construção do sistema [TONSIG, 2000; RATIONAL, 2000]. A UML possui um conjunto de 6 artefatos gráficos - Diagrama de Caso de Uso, Diagrama de Classe, Diagrama de Sequencia, Diagrama Saiba Mais 7 OMG – http:// www.omg.org 40 Modelagem Orientada a Objetos de Colaboração, Diagrama de Estados(Transição de Estados) e Diagrama de Componentes. Vamos conhecer um pouco mais sobre cada uma destas representações gráficas do UML. Diagrama de Caso de Uso Descreve a proposta de funcionamento de novos sistemas que serão desenvolvidos. Um Caso de Uso representa uma interação entre um usuário (humano ou máquina) e o sistema. Normalmente, para cada funcionalidade (ou comportamento) que queremos que um sistema apresente, é criado um caso de uso. Por exemplo: “acessar extrato” e “realizar saque “ são todos Casos de Uso de um sistema bancário. Abaixo vamos ver, em maiores detalhes, os componentes de um caso de uso. » Atores Na UML, um ator é representado por um boneco e o nome do ator. Um ator é um usuário do sistema (usuário humano ou sistema computacional, uma vez que podemos ter sistemas que se comunicam com outros, como acontece, por exemplo, quando você faz um saque no banco 24h), conforme apresentado na Figura 9. Figura 9. Representação de um ator no diagrama de casos de uso » Caso de Uso Um caso de uso é representado por uma elipse e um rótulo com o nome do caso de uso, conforme apresentado na Figura 10. Um caso de uso define uma função do sistema. Uma função pode ser estruturada em outras funções (um caso de uso pode ser estruturado). 41 Modelagem Orientada a Objetos Figura 10. Representação de um caso de uso no diagrama de casos de uso Para o nosso exemplo de sistemas de conta bancária (com pouquíssimas funcionalidades), poderíamos representa-lo através do diagrama de caso uso conforme Figura 11. Figura 11. Exemplo de diagrama de caso de uso (sistema bancário simples) » Relacionamentos Associação (entre atores e casos de uso) A associação define uma funcionalidade do sistema sob o ponto de vista do usuário, conforme apresentado na Figura 11. Generalização (entre atores) O ator pode herdar as funcionalidades (casos de uso) de outro ator, conforme apresentado na Figura 12. O ator cliente herda o caso de uso ‘realizar login’ do ator usuário (mesmo conceito de herança que já estudamos neste fascículo, relacionado à POO). 42 Modelagem Orientada a Objetos Figura 12. Exemplo de diagrama de caso de uso (sistema bancário simples) com relação entre atores Por fim, ainda se tratando de diagrama de casos de uso, existem os relacionamentos entre casos de uso. ○ Entre casos de uso ▪ Include Um relacionamento include de um caso de uso A para um caso de uso B indica que B é essencial para o comportamento de A. Pode ser dito também que B é_parte_de A. ▪ Extend Um relacionamento extend de um caso de uso B para um caso de uso A indica que o caso de uso B pode ser acrescentado para descrever o comportamento de A (não é essencial). Como o nome nos diz, é uma extensão. A extensão é inserida em um ponto de extensão do caso de uso A. Ponto de extensão em um caso de uso é uma indicação de que outros casos de uso poderão ser adicionados a ele, ou seja, um determinado caso de uso poderá ser acrescido por outros, que serão conectados a ele. Quando o caso de uso for invocado, ele verificará se suas extensões devem ou 43 Modelagem Orientada a Objetos não ser invocadas. Uma vez completados os diagramas de caso de uso, agora podemos começar a pensar no sistema computacional propriamente dito. O primeiro passo nesta direção é construir o diagrama de classes, detalhado abaixo. Diagrama de Classes Um diagrama de classes é uma representação da estrutura e relações das classes que servem de modelo para objetos, conforme ja vimos na Figura 3. As classes podem apresentar três tipos de relacionamento: associação, composição e herança (especialização ou generalização), que serão vistos em maiores detalhes no decorrer da disciplina. Através destes relacionamentos, identificamos a relação entre as classes, temos a visão de quem são as classes pai e classes filhas e que características são herdadas (atributos e métodos). Diagrama de Sequência Este diagrama representa a sequência de processos (troca de mensagens entre objetos) num sistema, conforme Figura 13. Como um projeto pode ter uma grande quantidade de métodos em classes diferentes, pode ser difícil determinar a sequência global do comportamento (Lembra dos algoritmos não sequenciais que estudamos? E dos subalgoritmos? Este diagrama representa o fluxo percorrido pelos objetos do sistema). Este diagrama possui: » Atores: Semelhantes aos do diagrama de casos de uso (usuários do sistema). » Objetos: Representam as instâncias das classes representadas no processo. Os objetos são ilustrados como retângulos. Linhas horizontais ou diagonais representam mensagens trocadas entre objetos. Estas linhas contém o nome da mensagem e, opcionalmente, os parâmetros da mesma. Observe que também podem existir mensagens enviadas para o mesmo objeto, representando uma interação; » Gate: Ponto de transmissão da mensagem para dentro ou para fora do fragmento de interação. 44 Modelagem Orientada a Objetos » Fragmento: Fragmentos de interação como: Alt (Alternativa), Opt (Opcional), Break (Parar), Loop (Repetição) e outras. » Linha de vida: As linhas de vida compõem a dimensão vertical (tempo). A dimensão vertical é a vida do objeto. Figura 13. Exemplo do ITA de um sistema de controle aéreo simples Diagrama de Colaboração O Diagrama de Colaboração apresenta uma interação realizada no sistema, apresentando um conjunto de objetos e seus relacionamentos, incluindo as mensagens que podem ser trocadas entre eles. Este diagrama é semelhante ao diagrama de sequências. Diagrama de Estados (Transição de Estados) No diagrama de estado, um objeto possui um comportamento e um estado. O estado de um objeto depende da atividade que está sendo executada por ele. Um diagrama de estado mostra os possíveis estados de um objeto e as suas possíveis mudanças de estado. Diagrama de Componentes Este diagrama apresenta como as classes deverão se encontrar organizadas através da noção de componentes8. Converse sempre com seus colegas e com o seu tutor, através do Saiba Mais 8 Componentes de Software é o termo utilizado para descrever o elemento de software que encapsula uma série de funcionalidades. Um componente é uma unidade independente, que pode ser utilizado com outros componentes para formar um sistema mais complexo [Wikipedia]. 45 Modelagem Orientada a Objetos fórum de discussão, para esclarecer as suas dúvidas. Você entendeu realmente quando devemos utilizar os diagramas UML? Quando vamos iniciar um novo sistema, qual o diagrama que devemos utilizar como ponto de partida (que nos dá a visão do que iremos desenvolver)? E após este diagrama, qual o diagrama que nos auxiliaria melhor no desenvolvimento de nosso código? Vamos discutir isto no fórum! Sugira exemplos. Atenção Apresentamos exemplos dos diagramas mais comumente utilizados em sistemas “de prateleira”. Contudo, exemplos de todos os tipos de diagramas podem ser encontrados no site: http://www.dsc.ufcg.edu.br/~jacques/cursos/ map/html/uml/diagramas/diagramas.htm. Conheça Mais Agora que já vimos os conceitos básicos UML, que tal aprofundar seus conhecimentos? Alguns links interessantes: 1. Link para Apostila Interessante de UML – Blog do Prof. Wilson 2. http://docs.kde.org/stable/pt_BR/kdesdk/umbrello/uml-basics.html - tutorial Básico sobre UML 3. http://www.micropic.com.br/noronha/Informatica/PD/AL/projeto%20 orientado%20a%20objeto%20uml.pdf – apostila com conceitos básicos do UML 4. http://imasters.uol.com.br/artigo/2934/uml/modelagem_orientada_a_ objetos_e_uml/ 5. http://www.youtube.com/watch?v=XwaCMxAVkcs - ppt de introdução à UML da Profa. Nívia Domingues E você, encontrou algum outro link interessante? Se sim, não deixe de postá-lo no fórum da disciplina, e compartilhar os seus achados com professores e colegas, está certo? 46 Modelagem Orientada a Objetos Aprenda Praticando Faça o diagrama de classes UML e programe, em Java, a classe Produtos. Cada produto tem código(inteiro), nome do produto, preço e quantidade em estoque. As funcionalidades que devem ser oferecidas pela classe são: » adicionar produto ao estoque (método que será chamado quando a loja comprar material) » vender produto (diminuindo o estoque) » alterar o nome do produto » alterar o preço do produto » métodos de acesso (get) para obter nome, código, preço e quantidade em estoque de produtos. Pense em algo como a figura ilustrada acima... Tente redesenhar este diagrama no JUDE e traduzi-lo para código Java. Atividades Práticas Vamos tentar representar nosso programa para cálculo de notas da UAB/UFRPE em UML (Diagrama de Classes e Diagrama de Caso de Uso)? Poste no fórum seu código Java e sua representação UML. 47 Modelagem Orientada a Objetos Atividades de Interação Vamos trocar ideias em um fórum de discussão que será coordenado pelo tutor virtual. Converse com seus colegas, entreviste pessoas sobre o assunto, leia mais sobre o tema abordado neste capítulo. Realize uma entrevista com alunos e outros colegas professores, a fim de coletar informações sobre as vantagens e dificuldades encontradas pelos desenvolvedores OO. O que é preciso ter em mente quando se participa deste tipo de desenvolvimento? Que dicas poderíamos dar para facilitar o processo? Que dificuldades você enfrentou até agora? Vamos Revisar? Resumo Você estudou, neste capítulo, os conceitos básicos da UML. Vimos de maneira objetiva e direta como representar sistemas através dos diagramas providos pela UML. É importante notar que a modelagem gráfica do sistema contribui para uma implementação mais rápida e correta do sistema. Antes de codificar, representamos o sistema graficamente e, desta forma, podemos então identificar falhas e pontos de melhoria, além de avaliar os requisitos com o cliente. Perceba que a visão aqui provida foi bastante objetiva. Utilize os links sugeridos e busque novas fontes de aprendizado sobre a UML. Esta linguagem é amplamente utilizada em mercado. É importantíssimo seu aprendizado! Bons Estudos! 48 Modelagem Orientada a Objetos Capítulo 4 O que vamos estudar neste capítulo? Objetivos Neste capítulo, vamos estudar os seguintes temas: » Um pouco sobre a história da programação » A linguagem Java Metas Após o estudo deste capítulo, esperamos que você consiga: » Identificar características da POO na linguagem Java » Aprender as características da linguagem Java » Configurar o seu ambiente de desenvolvimento » Desenvolver seu primeiro programa Java 49 Modelagem Orientada a Objetos Capítulo 4 - Programando de acordo com o Paradigma POO Vamos conversar sobre o assunto? Para esta disciplina, iremos aplicar os conceitos estudados através do uso da linguagem de programação Java, juntamente com o ambiente de desenvolvimento integrado (IDE) Eclipse. C++9, C#10, Java, Object Pascal, Objective-C e Python11 são outros exemplos de linguagens de programação orientadas a objetos. A linguagem Java foi escolhida para esta disciplina por esta ser, atualmente, a linguagem de programação mais utilizada no mundo. Antes de estudarmos Java em algum detalhe, vamos dar uma olhadinha nas linguagens OO, sua história e motivação para o seu estudo e desenvolvimento. Um pouco de História É praticamente incontável o número de linguagens de programação12. Uma mesma linguagem, inclusive, pode aparecer em várias versões, como Fortran, Lisp e BASIC, como Fortran 66 e Fortran 99. Ao longo dos anos, certamente milhares de linguagens foram propostas, descritas, implementadas e usadas por diferentes pessoas. Entre essas linguagens, algumas obtiveram sucesso pleno e são reconhecidas, como C, C++, Java e Pascal13. Finalmente, algumas linguagens nunca conseguiram reconhecimento, ou foram apenas propostas teóricas ou usadas em poucas localidades, sendo provavelmente desconhecidas da maior parte dos interessados na área, como Smalltalk 72 (um predecessor de Smalltalk 80). De uma forma geral, ao decorrer do tempo observou-se os seguintes aspectos: » crescimento da capacidade dos computadores e complexidade dos programas » linguagens foram ficando cada vez mais independentes do hardware Saiba Mais 9 C++ - http:// www.cplusplus. com/ Saiba Mais 10 C# - http:// msdn.microsoft. com/en-us/ library/618ayhy6. aspx Saiba Mais 11 Python - http:// docs.python.org/ reference/ Saiba Mais 12 Tim O’Reilly, conhecido como o criador da expressão Web 2.0 criou um pôster com o histórico das linguagens em programação, você pode acessá-lo através do link a seguir: http:// blog.uncovering. org/archives/ uploads/2007/ 2007090800_ linguagens_ programacaoprog _lang_poster.pdf 50 Modelagem Orientada a Objetos » necessidade de linguagens mais fáceis de usar e oferecendo um maior nível de abstração, o que implica em perda de eficiência (por exemplo, símbolos de assembly, variáveis e atribuição, estruturas de controle, módulos, parametrização de módulos) » aumento do custo de programação e diminuição do custo dos computadores » surgimento de novos conceitos e tecnologias De fato, a evolução das linguagens está intimamente ligada aos momentos tecnológicos (tipos de ambiente, informações e máquinas disponíveis). Vamos dar uma olhadinha na história e evolução das linguagens de programação15? Assembly O Assembly foi provavelmente a primeira linguagem de programação da história, surgida na década de 50, época em que os computadores ainda usavam válvulas (lembram do que vimos nas disciplinas de Laboratório/Elementos de Informática?). A ideia do assembly é usar um comando em substituição a cada instrução de máquina. Ela usa uma sintaxe complicada e “exageradamente” difícil, isto porque, antes da década de 50 os programadores de máquinas tinham que escrever instruções em código binário, isto é, cada instrução tinha um formato como 0110010110011011010110011 010111010110101 ... Na verdade, o Assembly foi criado para facilitar o uso dessa tarefa, mas é considerado uma linguagem de baixo nível, pois tudo o que o processador interpreta tem que ser descrito pelo programador. Assim o código acima seria “add EAX” em Assembly. Bastava apenas, depois de estar concluída a escrita do código, rodar o compilador e tínhamos o programa. Certamente uma alternativa menos complexa que escrever 0s e 1s, mas, ainda assim difícil de assimilar, não acham? Depois que o código está pronto, o compilador transforma o código escrito em assembly em linguagem de máquina, que finalmente poderá ser entendida pelo processador. Existem também os decompiladores, que fazem o trabalho inverso, de transformar um programa já compilado, em um código em linguagem assembly. Este recurso é chamado de engenharia reversa. É assim que conseguem “crackear” programas, quebrar códigos de proteção (como o do DVD), etc. Claro que para isso, é preciso alguém que conheça muito de assembly e que tenha disposição para ficar Saiba Mais 13 Pascal - http:// www.freepascal. org/docs-html/ref/ ref.html Saiba Mais 14 Wikibooks - http:// pt.wikibooks. org/wiki/ Introdu%C3% A7%C3%A3o_ %C3%A0_ programa %C3%A7% C3%A3o/ Linguagens_de_ programa %C3% A7%C3%A3o Saiba Mais 15 Guia do Hardware - http://www. guiadohardware. net/artigos/ linguagens/ 51 Modelagem Orientada a Objetos estudando o código até encontrar o que procura. Por causa desta característica de permitir trabalhar diretamente com as instruções do processador, o assembly é chamado de linguagem de baixo nível. Existem também linguagens de alto nível, como C++ ou Pascal, onde é possível usar várias funções já prontas ou mesmo ferramentas visuais para ajudar no desenvolvimento das aplicações. Fortran O Fortran1 foi uma das primeiras linguagens de alto nível da história. Enquanto o Assembly é chamado de linguagem de baixo nível, por nele utilizarmos diretamente as instruções e endereços do processador e memória, numa linguagem de alto nível temos várias funções prontas, o que facilita muito a programação,tornando o aprendizado mais fácil e também fazendo o código ficar independente do computador onde será executado. Por outro lado, programar em alto nível torna em muitos casos o programa maior e mais pesado, já que o compilador jamais conseguirá gerar um código tão otimizado quanto um programador experiente conseguiria. Fortran é a contração de “Formula Translator”. A primeira versão do Fortran foi criada no final da década de 50, mas a linguagem começou a ser usada em larga escala a partir da metade da década de 60, quando surgiram várias versões diferentes. Pascal O Pascal é outra linguagem de alto nível, criada durante a década de 60. O Pascal é uma linguagem bastante estruturada, com regras bastante rígidas, o que a torna difícil de usar. Por outro lado, é uma linguagem boa para fins didáticos (até o início dos anos 2000, vários cursos de engenharia ainda utilizavam o Pascal em seus cursos introdutórios). Cobol O Cobol2 (COmmon Business Oriented Language) foi uma linguagem usada para a criação e estruturação de bancos de dados financeiros nos anos 60 que ainda hoje é usada por este tipo de Saiba Mais 16FORTRAN - http://www. fortran.com/ Saiba Mais 17COBOL - http:// www.infogoal. com/cbd/ 52 Modelagem Orientada a Objetos serviços. Comparada com o Pascal e o Assembly, esta linguagem é bem amigável e bastante acessível e atualmente serve para várias tarefas em sistemas comerciais, financeiros e administrativos, para empresas e governos. Até hoje esta linguagem é usada em muitos sistemas bancários, o que explica a grande procura por programadores experientes nesta linguagem na época do bug do ano 2000. Linguagem C Poder-se-ia dizer que o C é uma das maravilhas das linguagens de programação. Muitos dos programas existentes hoje foram escritos nesta linguagem. O C foi desenvolvido nos laboratórios Bell na década de 70, e possui as seguintes características: » Portabilidade entre máquinas e sistemas operacionais » Dados compostos em forma estruturada » Total interação tanto com o SO como com a máquina » Código compacto e rápido. Nos anos 80, C era a linguagem mais utilizada por programadores, por permitir a escrita intensiva de todas as características das linguagens anteriores. O Próprio UNIX e Linux foram escritos em C, assim como o front-end do MS-DOS, Windows e as aplicações Office mais usadas no mundo (OpenOffice.org, Microsoft Office, embora cada uma delas incluísse suas próprias linguagens de script), sendo também utilizada em aplicações gráficas e criação de efeitos especiais nos filmes Strar Trek e Star Wars. A maior parte dos programas Linux e o Kernel quase todo foram escritos em C, o que explica o porquê do sistema ser tão rápido em algumas tarefas. C++ O C++ é uma evolução do C. Em outras palavras, C++ é uma linguagem que adiciona ao C um conjunto de recursos a mais, como o próprio nome sugere. O C++ é o C orientado a objetos. Avançando nos 90, passou por diversas atualizações e padronizações nesta época, o padrão do C++ foi exaustivamente trabalhado pelos desenvolvedores durante oito anos, quando finalmente foi aprovado pelo ANSI (American National Standard Institute). 53 Modelagem Orientada a Objetos Igualdades e Diferenças nas Linguagens As igualdades entre as várias linguagens são grandes, a exemplo de instruções e sintaxes. Porém é necessário notar-se que a sintaxe básica dessas linguagens modifica-se e é necessária a sua aprendizagem (por isto é importante o aprendizado de algoritmos, porque se aprende a pensar em soluções de maneira lógica e independente de linguagens). Para isso o melhor local para aprender e se aperfeiçoar são os livros sobre a matéria. O problema mais importante, hoje, na área de Linguagens de Programação, é o desenvolvimento de linguagens que aumentem a produtividade do programador. Linguagens que permitam escrever programas corretamente, esta é a razão do rápido crescimento de linguagens como Java. Além do crescimento da linguagem, observamos também o crescimento de IDEs e também de novos plug-ins e componentes que são agregados aos ambientes de desenvolvimento (oferecendo recursos gráficos mais avançados para o desenvolvimento de telas, por exemplo). Atualmente, uma das linguagens orientadas a objetos mais utilizadas é a linguagem Java [DEITEL, 2006] famosa por sua independência de plataformas (o programa que você escreve pode executar em qualquer máquina e sistema operacional, sem precisar de modificações). Por isso, vamos, ao longo desta disciplina, estudá-la mais a fundo. Para começar, que tal dar uma olhadinha na história desta linguagem? 54 Modelagem Orientada a Objetos A Linguagem Java Java é uma linguagem muito disseminada e discutida entre os desenvolvedores de todo o mundo e isto se deve a vários fatores. Java foi desenvolvida na década de 90 por uma equipe de programadores chefiada por James Gosling, na empresa Sun Microsystems [CAELUM]. Antes de prosseguir, vamos descobrir o porquê do sucesso de Java? Para isto, precisamos pensar um pouco em alguns problemas frequentemente encontrados por desenvolvedores de sistemas: » manipulação de ponteiros? ○ Os apontamentos para endereços de memória não são de fácil interpretação e entendimento. A complexidade em prover manutenção ao software também é um problema. » gerenciamento de memória? ○ Durante muito tempo, o gerenciamento de memória foi uma grande dificuldade. Os programadores eram responsáveis pela alocação e liberação da memória, tudo feito de forma manual. Hoje, em todas as plataformas modernas, Java inclusive, temos gerenciamento de memória automático através de algoritmos de coleta de lixo. » organização? ○ Como organizar o software de forma a facilitar seu reuso, manutenção e entendimento? » falta de bibliotecas? ○ Como lidar com a falta de bibliotecas/códigos? Muitas vezes, códigos simples e de grande utilidade não se encontram disponíveis. » ter de reescrever parte do código ao mudar de sistema operacional? ○ Portabilidade » custo de usar a tecnologia? ○ A linguagem tem suporte? Tem ambiente para desenvolvimento gratuito? 55 Modelagem Orientada a Objetos Java tenta amenizar esses problemas. Java é uma linguagem de programação multiplataforma, ou seja, seus programas podem ser executados em qualquer sistema operacional, desde que o interpretador esteja instalado. Diferentemente das linguagens convencionais, que são compiladas para código nativo, a linguagem Java é compilada para um “bytecode” que é executado (interpretado) por uma máquina virtual [CAELUM]. A Java Virtual Machine (JVM) ou Máquina Virtual Java é um programa que converte o código Java em comandos que o sistema operacional possa executar. Existem máquinas virtuais para vários sistemas operacionais, o problema é que devido ao processamento executado pela máquina virtual, o programa torna-se mais pesado do que seria caso escrito diretamente para a plataforma (os programas compilados, como já vimos antes). Um compilador traduz todo o código da linguagem de programação para um determinado sistema operacional, enquanto que uma linguagem interpretada se utiliza de uma máquina virtual para interpretar o código do programa, linha a linha. No lugar de traduzir o código da linguagem de programação para o sistema operacional, o código do programa é compilado para bytecodes e só então este é interpretado, linha a linha, pela máquina virtual, para o sistema operacional que está executando o programa. Explicando de forma mais elaborada, linguagens de programação “tradicionais”, como o C e o C++ utilizam um compilador diferente para cada plataforma ou sistema operacional em que o programa irá rodar. GCC (GNU Compiler Collection), Dev-C++, C++ Builder e Turbo C são exemplos de compiladores. O código fonte em si pode ser escrito de forma a ser facilmente portável, ou seja, rodar em diferentes versões do Unix ou em várias famílias de processadores diferentes sem muitas alterações,
Compartilhar