Programação Orientada a Objetos Atualização material aula 01 História Se tornou muito conhecida no início da década de 1990 porém surgiu em 1960. Até hoje é uma pratica não muito compreendida entre os desenvolvedores de software. O paradigma de POO surgiu a partir da necessidade de desenvolver programas com mais qualidade, ter reaproveitamento de código e diminuir o tempo de desenvolvimento. A programação estruturada e a base da POO Um dos motivadores foi o avanço do hardware que não acompanhava o avanço do software. Em 1967 surge a linguagem de programação SIMULA 67 que introduz o conceito de classe. Na década de 1970 surge o Smalltalk uma linguagem de programação orientada a objetos que popularizou esse conceito. Logo depois novas linguagem como Java, Object Pascal, Ada, C++ implementam de POO. A base da POO é a abstração, não sendo uma ferramenta em si, mas sim uma forma de programação utilizada ar solucionar problemas do mundo real. Programação Orientada a Objetos É uma forma de solução de problemas baseado na cooperação de elementos que prestam serviços a outros elementos, esse elementos são os objetos. “Suponha que eu precise consultar a disponibilidade de um livro para reserva em uma biblioteca quando eu solicitar essa informação ao bibliotecário, eu não preciso saber os detalhes de como o bibliotecário irá fazer a consulta e nem mesmo preciso interferir nessa consulta, eu apenas preciso saber o resultado. Nesse caso eu apenas faço a comunicação com o responsável e espero o resultado”. O aumento da complexidade fez com que surgisse a necessidade de dividir a solução dos problemas em partes, distribuindo as responsabilidade em unidade independentes com a ocultando informações e a colaboração entre as unidades. Sob o ponto de vista de informações temos objetos, que provem serviços, esse objetos tem estados, que dão soluções próprias ao serviços requisitados. Na POO temos o objeto que deve ser criado, ele guarda um conjunto de dados, os atributos, e provem serviços através dos métodos. Tipo de dados abstrato em POO é o que chamado de classe, na programação estrutura temos os tipos de dados primitivos e os tipos de dados derivados (record). Fundamentos de Programação Orientada a Objetos Classes É um modelo utilizado para formatar a estrutura de um objeto, esse estrutura é utilizada para instanciar um objeto. A classe estabelece um conjunto de atributos e métodos comuns a um determinado objeto. Classes abstratas Possuem objetos que não estão relacionados a classe(ela mesmo), quando definimos uma classe abstrata para ela fazer sentido deve ter um ou mais métodos abstratos, ou seja métodos que não tem implementação. Classes abstratas não podem ser instanciadas. Classes Classes concretas Possuem objetos relacionados a classe (ela mesma), e todos os métodos devem ter implementações. Exemplos de classes Exemplos de declaração de classes Ruby Python Object Pascal C++ PHP Java Objetos O objeto é um módulo que possui rotinas e estrutura de dados e consegue interagir com outros objetos através da troca de mensagens que é o mecanismo de comunicação entre objetos. Troca de mensagem é a execução de um pedido de informação ou uma requisição feita por meio de parâmetros. Os objetos são instanciados através de classes e possuem um estado. Objetos Temos dois tipos de objetos Objetos persistentes: quando um objeto é gravado em memória persistente, ou seja a memoria secundaria. Exemplo de persistência é a gravação de um objeto em um DB e a serialização. Objetos transitórios: Utilizado em memória no computador. Atributos São as propriedade que definem os objetos, o atributo pode ser comparado a uma variável. Os atributos são divididos em duas categorias. Atributos de classe: Podem ser acessados por todos os objetos dessa classe, dessa forma o atributo é compartilhado dessa mesma classe. Em Java definimos esse tipo de atributo como utilizando a palavra reservada static. Semelhante a esse conceito temos os métodos de classe. Atributos de instancia: São atributos definidos no objeto e gerenciados pelo próprio objeto que tema a responsabilidade de manipular o seu valor. Semelhante a esse conceito temos os métodos de instância. Método É uma forma que permite alterar características de atributos, efetuar controles lógicos que refletirão em ações. Os métodos devem permitir manipular estados de variáveis através de funcionalidades. Exemplo: métodos que calcula o debito de uma conta. Os métodos são subprogramas que definem operações em objetos da classe. Herança Oferece a possibilidade de solução para um problema pois uma nova classe pode herdar dados e funcionalidades de uma classe já existente. A nova classe pode adicionar, modificar dados e funcionalidades. Uma classe herdada é chamada de classe derivada, subclasse, classe filha. Temos dois tipos de herança Herança simples: Quando uma nova classe é uma subclasse de uma única classe pai. Linguagem como Java, Delphi, C# permitem somente herança simples. Herança Herança múltipla: Quando uma nova classe é uma subclasse de mais de uma classe pai. Diferenças entre classe pai e classe filha. A classe pai pode ter métodos privados que não são visíveis a classe filha. A classe filha pode adicionar membros novo a ela. A classe filha pode modificar comportamento de métodos herdados da classe pai. A herança também pode ser chamada de generalização pelo fato de dar a possibilidade de herdar as características da classe pai pela classe filha dando a capacidade de transmitir automaticamente as propriedades e características a classe herdada. Em Java utilizado a palavra reservada extends para fazer a herança. Encapsulamento É a forma como é definido o modo de visualização (escopo de visibilidade) de atributos e métodos de uma classe em relação a seus objetos. Dessa forma podemos ocultar recursos que não são de interesse da classe que usa esse recursos. Dessa forma temos recursos visíveis e invisíveis. Classificação do encapsulamento. Seção pública: acesso total aos atributos e métodos. Seção privada: acesso somente na própria classe dos atributos e métodos. Seção protegida: esta relacionada a herança e permite que os atributos e métodos estejam visíveis na própria classe e nas classes herdadas. Encapsulamento Tabela que mostra o escopo de visibilidade do Java Modificador Classe Pacote Subclasse Globalmente public sim sim sim sim protected sim sim sim não Sem Modificador (Padrão) sim sim não não private sim não não não Interfaces Uma interface é uma estrutura muito parecida com classes abstratas, porém na interface os métodos não tem implementação Uma interface não tem construtor e não pode ser declarado variáveis. Quando uma classe herda uma interface todos os métodos da interface devem ser implantados na classe. Interfaces são utilizadas para implementar herança múltipla em Java. Polimorfismo A palavra polimorfismo significa ter muitas formas, e isso em programação ser refere a possiblidade de um método ter varias implementações ou assinaturas. Métodos são polimórficos quando derivam de classes concretas, classe abstratas e interfaces. É de responsabilidade do compilador atribuir a assinatura adequada de um método polimórfico. Em Java utilizamos a anotação @Override para deixar explicito que um método é polimórfico. Exercícios e Prática