1 CLASSES, OBJETOS, MÉTODOS E STRING Construir software rapidamente, corretamente e economicamente é um objetivo difícil de alcançar. Objetos, ou, mais precisamente as classes de objetos, são, essencialmente, componentes de software reutilizáveis. Há objetos de data, objetos de tempo, objetos de áudio, objetos de vídeo, objetos de automóveis, objetos de pessoas, etc. Quase qualquer substantivo pode ser representado como um atributo em termos de objeto de software (por exemplo, nome, cor e tamanho) e comportamentos (por exemplo, calcular, mover-se e comunicar). O AUTOMÓVEL COMO UM OBJETO Suponha que você queira dirigir um carro e fazê-lo ir mais rápido, pisando o pedal do acelerador. O que deve acontecer antes de você fazer isso? Antes de você pode dirigir um carro, alguém tem que projetá-lo. Um carro geralmente começa como desenhos de engenharia, que incluem o projeto para um pedal de acelerador. Os pedais de aceleração, de freio e volante ocultam do motorista os mecanismos complexos que fazem o carro ir mais rápido, que retardam e giram o carro. Você não pode dirigir um carro de desenhos de engenharia. Antes que você possa dirigi-lo, ele deve ser construído a partir dos desenhos de engenharia que o descrevem. Mesmo um carro completo com o pedal do acelerador para faze-lo ir mais rápido, não é suficiente, pois o carro não acelerará por conta própria, o motorista deve pressionar o pedal para acelerar o carro. MÉTODOS E CLASSES Realizar uma tarefa em um programa exige um método. O método abriga as declarações do programa que executam as tarefas. O método esconde estas instruções do seu usuário, assim como o pedal do acelerador de um carro esconde a partir do condutor os mecanismos de tornar o carro mais rápido. Uma classe (unidade de programa) Java abriga o conjunto de métodos que executam tarefas da classe. Por exemplo, uma classe que representa uma conta bancária pode conter um método para depositar dinheiro para uma conta, outro para retirar dinheiro de uma conta e um terceiro para saber qual é o saldo atual da conta. HTTP://erinaldosn.wordpress.com 2 INSTANCIAÇÃO Você deve criar um objeto de uma classe antes de um programa executar as tarefas que os métodos da classe definem. O processo de fazer isso é chamado instanciação. Um objeto é então referida como uma instância de sua classe. REUTILIZAR Uma classe pode ser reutilizada várias vezes para construir vários objetos. A reutilização de classes existentes para construir novas classes e programas economiza tempo e esforço. A reutilização também ajuda a construir sistemas mais confiáveis e eficazes, porque as classes existentes e componentes, muitas vezes já passaram por extensos testes, depuração e ajuste de desempenho. MENSAGENS E CHAMADA DE MÉTODOS Quando você dirige um carro, ao pisar o pedal do acelerador é enviada uma mensagem para o carro realizar uma tarefa – isto é, ir mais rápido. Da mesma forma, você envia mensagens para um objeto. Cada mensagem é implementada como uma chamada de método que indica a um método do objeto executar sua tarefa. ATRIBUTOS E VARIÁVEIS DE INSTÂNCIA Um carro, além de ter capacidade para realizar tarefas, também tem atributos, como cor, número de portas, a quantidade de combustível no tanque, sua velocidade atual e o total de quilometragem dirigida. Os atributos do carro são representados como parte de projeto nos diagramas de engenharia (que inclui, por exemplo, um velocímetro e medidor de combustível). Cada carro tem os seus próprios atributos. Da mesma forma, um objeto traz consigo atributos de como ele é usado em um programa. Esses atributos são especificados como parte da classe do objeto. Por exemplo, um objeto conta bancária tem um atributo balanço que representa a quantidade de dinheiro na conta. Cada objeto conta bancária sabe o saldo na conta que ela representa, mas não os saldos de outras contas no banco. Os atributos são especificados pelas variáveis da classe de instância. ENCAPSULAMENTO Encapsular classes, atributos e métodos em objetos – os atributos de um objeto e métodos estão intimamente relacionados. Os objetos podem HTTP://erinaldosn.wordpress.com 3 comunicar-se uns com os outros, mas eles normalmente não permitem saber como são implementados – os detalhes de implementação são ocultados dentro dos próprios objetos. Esta ocultação de informações é crucial para boa engenharia de software. HERANÇA Uma nova classe de objetos pode ser criada de forma rápida e convenientemente por herança – a nova classe absorve as características de uma classe existente, possivelmente personalizando-as e adicionando características únicas da sua própria. Na analogia do carro, um objeto da classe "conversível" certamente é um objeto da classe mais geral "automóvel", mas mais especificamente, o teto pode ser levantado ou abaixado. ANÁLISE ORIENTADA A OBJETOS E PROJETO Para criar as melhores soluções, você deve seguir um processo de análise detalhado para determinar as necessidades do seu projeto, ou seja, definir o que o sistema deve fazer, e desenvolver um projeto que satisfaça, ou decidir como o sistema deve fazê-lo. Idealmente, você passa por esse processo e revisa cuidadosamente o projeto (ter seu projeto revisado por outros profissionais de softwares) antes de escrever qualquer código. Se este processo envolve analise e projeto seu sistema de um ponto de vista orientado a objetos, ele é chamado de análise e processo orientado a objeto (APOO). LINGUAGEM DE MODELAGEM UNIFICADA Existem muitos processos APOO diferentes, mas uma única linguagem gráfica, conhecida como a Unified Modeling Language (UML), para a modelagem de sistemas orientados a objeto. CLASSE A classe é a construção lógica que define a forma e a natureza de um objeto. Constitui a base para programação orientada a objetos em Java. Qualquer conceito que se deseja implementar em um programa Java deve ser encapsulado em uma classe. Talvez a coisa mais importante para entender sobre uma classe é que define um novo tipo de dado. Uma vez definido, este novo tipo pode ser usado para criar objetos desse tipo. Assim, uma classe é um modelo para um objeto e um objeto é uma instância de uma classe. HTTP://erinaldosn.wordpress.com 4 Declarar uma Classe Quando você define uma classe, você declara sua forma exata e natureza. Você faz isso especificando os dados que ela contém e o código que opera sobre os dados. Em UML, cada classe é modelada em um diagrama de classes como um retângulo com três compartimentos. O compartimento superior contém o nome da classe. O compartimento do meio contém os atributos da classe, que correspondem a variáveis de instância em Java. O compartimento inferior contém operações da classe, que correspondem aos métodos em Java. A classe é declarada pelo uso da palavra-chave class. Os dados definidos dentro de uma classe são chamados de variáveis de instância. O código está contido dentro dos métodos. Acima está uma classe chamada Caixa que define três variáveis de instância: largura, altura e profundidade. Uma classe define um novo tipo de dados. Neste caso, o novo tipo de dado é chamado Caixa. Você vai usar esse nome para declarar objetos do tipo Caixa. Uma declaração de classe só cria um modelo, não um objeto real. Instanciar uma Classe Cada vez que você criar uma instância de uma classe, você cria um objeto que contém a sua própria cópia de cada variável de instância definida pela classe. HTTP://erinaldosn.wordpress.com 5 Adicionar um Método a Classe Raramente acontece de criar uma classe que contenha apenas dados. Na maioria das vezes, você vai usar métodos para acessar as variáveis de instância definidas pela classe. Os métodos definem a interface para a maioria das classes. Isso permite que o implementador da classe esconder o layout específico de estruturas de dados internas por trás método de abstração mais limpos. Você pode definir métodos que acessem a dados, e métodos que são usados internamente pela própria classe. As operações dos modelos UML lista o nome da operação precedida de um modificador de acesso e seguido por um conjunto de parênteses. A classe Caixa tem um método, volume. O método volume não exige informações adicionais para executar suas tarefas, de modo que os parênteses após o nome do método no diagrama de classe estão vazios. Vamos adicionar o método volume a classe Caixa. Uma vez que o volume de uma caixa é dependente do tamanho da caixa, faz sentido ter seu cálculo na classe Caixa. HTTP://erinaldosn.wordpress.com 6 Retornar um Valor Embora a implementação de volume() faça o cálculo do volume de uma caixa dentro da classe Caixa, onde ele pertence, não é a melhor maneira de fazê-lo. Imagine que outra parte do programa queira saber o volume de uma caixa, mas não mostrar o seu valor. A melhor forma de implementar volume() é calcular o volume da caixa e retornar o resultado para o chamador. HTTP://erinaldosn.wordpress.com 7 Adicionar um Método que Usa Parâmetros Enquanto alguns métodos não precisam de parâmetros, a maioria precisa. Parâmetros permitem que um método seja generalizado. Isto é, um método parametrizado pode operar uma variedade de dados e/ou ser utilizado em um número de situações diferentes. Em programas Java bem escritos variáveis de instância devem ser acessadas apenas através de métodos definidos por sua classe. No futuro, você pode alterar o comportamento de um método, mas você não precisa alterar o comportamento de uma variável de instância exposta. Uma melhor abordagem para definir as dimensões de uma caixa é criar um método que usa as dimensões de uma caixa em seus parâmetros e define cada variável de instância de forma adequada. HTTP://erinaldosn.wordpress.com 8 O diagrama de classes UML modela a classe Caixa. Esta classe contém as operações volume e setDimensao, que têm três parâmetros. Nos modelos UML lista o nome do parâmetro, seguido por dois pontos e o tipo de parâmetro entre parênteses após o nome da operação. A UML tem seus próprios tipos de dados semelhantes aos do Java. HTTP://erinaldosn.wordpress.com 9 EXERCÍCIOS 1. Distinga a abordagem de programação procedural e orientada a objeto. 2. Discuta a validade da seguinte afirmação: A abordagem de programação orientada a objeto é ideal para simular problemas do mundo real. 3. Considere os seguintes cenários e delinie os objetos e suas interações em termos de mensagens (métodos) e argumentos: a) um motorista dirigindo um carro; b) um cliente sacando dinheiro de um caixa automático; c) um cliente que comprando um CD player de um fornecedor; d) um guarda de trânsito orientando o tráfego em um cruzamento; e) um professor entregando a lição para uma turma de alunos; f) uma discussão tutorial entre professor e alunos. 4. Distinguir os termos "objeto" e "classe". 5. Considere o cenário de compra de flores de um florista. Delinie os objetos em uma operação deste tipo, juntamente com as mensagens trocadas (métodos e parâmetros). 6. Dado a definição da classe retângulo abaixo, descreva a estrutura de todas as 3 instâncias de Retangulo. classe Retangulo { Atributos: comprimento largura Métodos: obterComprimento() { retorna comprimento } obterLargura() { retorna largura } } 7. Defina usando a seguinte estrutura uma definição de classe para carros. Um carro geralmente tem capacidade para iniciar, avançar, retroceder, parar e desligar. Um carro também pode retornar à sua posição relativa. O local de partida é um valor 0. 8. Crie um método sem parâmetro que retorne o quadrado de um número digitado. 9. Crie um método que receba como parâmetro um número e retorne o seu quadrado. 10. Defina uma classe Quadrado, com o comprimento de seu lado como uma variável de instância. Inclua um método construtor apropriado e métodos para aumentar uma instância, bem como calcular a sua área. HTTP://erinaldosn.wordpress.com 10 11. Use a classe Quadrado acima, crie dez quadrados de tamanhos aleatorios e encontre a soma de suas áreas. (O método Math.random() retorna um número aleatório entre 0,0 e 1,0 a cada vez que for chamado.) 12. Crie uma classe que tenha um método que recebe como parâmetro o nome de uma disciplina e exiba-o na tela. REFERÊNCIA BIBLIOGRÁFICA DEITEL, Paul; DEITEL, Harvey. Java for programmers. 2nd ed. Boston: Pearson Education, 2012 p. 39-47. SCHILDT, Herbert. Java: The Complete Reference. 7th ed. US: McGraw-Hill, 2007 p. 105-117. POO, Dany; KIONG, Derek; ASHOK, Swarnalatha. Object-Oriented Programming and Java. 2nd ed. London: Springer, 2008 p. 1-36. HTTP://erinaldosn.wordpress.com