Orientação a objetos Disciplina: Linguagens de Programação Prof. Alexandre Cassimiro Andreani
Sumário 1 Objetivo...3 2 Origem da programação orientada a objetos...4 2.1 Exercícios...4 3 Classes e Objetos...6 3.1 Exercícios...6 4 Herança...7 4.1 Exercícios...8 5 Interface e Polimorfismo...9 5.1 Exercício...10 6 Encapsulamento de Dados...11 6.1 Exercício...11 7 Bibliografia...12
1 Objetivo Este material tem como propósito abordados os principais conceitos estudados na matéria de Linguagem de Programação do Curso Técnico Integrado de Informática do Instituto Federal de São Paulo do Campus Presidente Epitácio. É esperado que o aluno entenda os conceitos de Programação Orientada a Objetos através do uso de uma linguagem de fácil entendimento e exemplos que se relacionam com seu universo pessoal.
2 Origem da programação orientada a objetos A programação orientada a objetos (POO) foi concebida nada década de 1970 e características desse paradigma já apareciam na linguagem Simula, criada na década de 1960, com o propósito de fazer simulações. A primeira linguagem a usar esse paradigma foi a linguagem Simula-68. Outra linguagem que contribuiu para a elaboração da da POO foi o Smalltak criado pela Xerox em 1972. Java surgiu somente em 1995 e está entre as principais linguagens de programação utilizadas atualmente. Enquanto nós podemos focar nossa atenção sobre o código que estamos escrevendo, independente da metodologia que esteja sendo usada, não é a criação do código que a fonte de geração dos problemas A maior parte dos problemas no desenvolvimento de sistemas de softwares (KENDAL, 2009), surgem por: Má definição de requisitos e projeto: o sistema não faz o que cliente espera que faça. Má manutenibilidade: o sistema é difícil de entender e revisar quando mudanças são solicitadas. 70% do custo do software não vem da fase de desenvolvimento mas sim dos anos subsequentes em a empresa se responsabilizou por realizar as modificações. Por isso é essencial que os projetistas do software façam de tudo para garantir que o sistema é de fácil manutenção durante os anos posteriores a sua criação. Antes da POO, o paradigma procedural era abordagem mais usada. Neste caso, o código era modularizado de acordo com os processos do sistema. Por exemplo, no desenvolvimento de um sistemas para bibliotecas, seria considerado o processo para retirada, reserva, catalogação e entrega de livros. A análise do sistema envolveria analisar estes processos em termos de tarefas procedimentais que representaria o fluxo destes processos. POO, por outro lado, modela objetos e suas interações no espaço problema. (POO; KIONG; ASHOK, 2008) 2.1 Exercícios
1) Quais os problemas que acometem o desenvolvimento de software e a POO colabora para a melhoria? 2) Em que se baseia a POO?
3 Classes e Objetos Imagine que você deseje criar um jogo de tênis de mesa. Para isso será necessário definir elementos como raquetes, mesa, bolinha, jogadores e placar. Como fazer isso? Em termos de execução do programa, a classe é código e somente leitura. Já o objeto é criado a partir da classe e pode sofrer leitura, escrita e execução. A POO permite que cada elemento seja definido através de classes. Uma classe define as ações e características que estes elementos têm. No entanto, a classe é apenas a definição, o gabarito, a forma do bolo. O bolo em si chamamos de objeto. Ou seja, a classe representa como deve ser mas é o objeto que é de fato o exemplar de bolo, raquete, mesa ou bolinha que realizará interações com outros objetos. figura 1: Bolo e forma 3.1 Exercícios
1) Crie uma classe para representar as raquetes em um jogo de tênis de mesa 2) Crie uma classe para representar uma pessoa. Essa classe deve armazenar o nome da pessoa. Crie um método apresentar. Este método deve retornar Olá, eu sou o NOME_DA_PESSOA. 3) A fim de representar empregados em uma firma, crie uma classe chamada Empregado que inclui as três informações a seguir como atributos: um primeiro nome, um sobrenome, um salário mensal. Sua classe deve ter um construtor que inicializa os três atributos. Forneça um método set e get para cada atributo. Se o salário mensal não for positivo, configure-o como 0.0. Escreva um aplicativo de teste que demonstra as capacidades da classe. Crie duas instâncias da classe e exiba o salário anual de cada instância. Então dê a cada empregado um aumento de 10% e exiba novamente o salário anual de cada empregado 4 Herança Um das mais poderosas características da POO é o reuso de código. A POO permite a definição de relacionamentos entre classes que facilitam não somente o reuso de código, mas também melhor projeto através da organização e fatoração das características comuns entre as classes (WEISFELD, 2004). A figura 2 mostra uma relação de herança entre animais. É possível verificar que o atributo NúmeroDePatas é comum tanto para gato quanto para passáro. Mas AlturaDeVoo é específico de passáros. Ou seja, através da herança organizamos as características que devem ser reutilizadas para cada classe de forma bem estratificada.
Animal NúmeroDePatas Gato Pássaro AlturaDeVoo figura 2: relação de herança entre animais canário avestruz 4.1 Exercícios Exercício 1: Elabore uma classe ContaBancaria, com os seguintes membros: atributo String cliente atributo int num_conta atributo float saldo método sacar (o saldo não pode ficar negativo) método depositar Agora acrescente ao projeto duas classes herdadas de ContaBancaria: ContaPoupança e ContaEspecial, com as seguintes características a mais: Classe ContaPoupança: atributo int dia de rendimento
método calcularnovosaldo, recebe a taxa de rendimento da poupança e atualiza o saldo. Classe ContaEspecial atributo float limite redefinição do método sacar, permitindo saldo negativo até o valor do limite. Após a implementação das classes acima, você deverá implementar uma classe Contas.Java, contendo o método main. Nesta classe, você deverá implementar: 1) Incluir dados relativos a(s) conta(s) de um cliente; 2) Sacar um determinado valor da(s) sua(s) conta(s); 3) Depositar um determinado valor na(s) sua(s) conta(s); 4) Mostrar o novo saldo do cliente, a partir da taxa de rendimento, daqueles que possuem conta poupança; 5) Mostrar os dados da(s) conta(s) de um cliente Exercício 2: Criar uma classe Conta, que possua um saldo os métodos para pegar saldo, depositar e sacar. Adicionar um método na classe Conta, que atualiza essa conta de acordo com uma taxa percentual fornecida. Criar duas subclasses da classe Conta: ContaCorrente e ContaPoupanca. Ambas terão o método atualiza reescrito: A ContaCorrente deve atualizar-se com o dobro da taxa e a ContaPoupanca deve atualizarse com o triplo da taxa. Além disso, a ContaCorrente deve reescrever o método deposita, a fim de retirar uma taxa bancária de dez centavos de cada depósito. 5 Interface e Polimorfismo Imagine que dois desenvolvedores estejam projetando o software e dividindo as tarefas. Cara desenvolvedor irá trabalhar com partes diferentes do software mas que usam classes e métodos de ambas as partes. Como então um desenvolvedor pode fazer sua parte sem conhecer ou depender da implementação das classes e métodos do outro desenvolvedor?.neste caso, é necessário que haja um tipo de contrato que especifica
exatamente como será o nome das classes, métodos, parâmetros e saídas destes métodos. Em POO esse contrato pode ser auxiliado pelo recurso interface. Uma interface não implementa método algum, mas especifica a assinatura de todos os métodos que precisam ser implementados. Veja o exemplo da figura 3. figura 3: Exemplo de interface Já o polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma identificação (assinatura) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. 5.1 Exercício 1) Implemente, em Java, uma classe abstrata de nome Quadrilatero onde são declarados dois métodos abstratos: float calculararea(); float calcularperimetro(); 2) Crie, como subclasse de Quadrilatero, uma classe de nome Retangulo cujas instâncias são caracterizadas pelos atributos lado e altura ambos do tipo float. Implemente na classe Retangulo os métodos herdados de Quadrilatero e outros que ache necessários. 6 Encapsulamento de Dados Quando uma classe é criada, existem características que são interessantes que sejam públicas, ou seja, que possam ser acessadas por qualquer outra classe. E neste mesmo raciocínio, existem características que são interessantes que sejam acessíveis por classes descendentes, neste caso chamaremos de elementos protegidos. E existem características que queremos manter privadas, que nenhuma outra classe possa acessar. Este conceito que seleciona a acessibilidade dos elementos que constituem uma
classe é chamado encapsulamento. Veja o exemplo da figura 4. figura 4: Exemplo de encapsulamento 6.1 Exercício 1) Quando criamos uma classe, é de costume e indicado ter todos os seus atributos como private e não como public. Porque? 2) Reescreva getsalario da figura 4 para retornar o valor com apenas duas casas decimais de precisão.
7 Bibliografia KENDAL, S. Object Oriented Programming using Java Kendal S. digital library bookzz. [S.l: s.n.], 2009. Disponível em: <http://bookzz.org/book/565857/0f1c71>. Acesso em: 15 fev. 2016. POO, D. C. C.; KIONG, D. B. K.; ASHOK, S. Object-oriented programming and Java. 2nd ed ed. London: Springer, 2008. WEISFELD, M. A. The object-oriented thought process. 2nd ed ed. Indianapolis, Ind: Sams Pub, 2004. (Developer s library).