Introdução ao Paradigma de Programação Orientada a Objetos Prof. Antonio Mendes da Silva Filho Orientação a Objetos Introdução Propósito da Programação OO Características das Linguagens OO Sugestões de leitura Introdução a OO POO é uma das principais inovações no desenvolvimento de software da última década. Complexidade: Principal problema na elaboração de programas. – Quão maior a complexidade, maior a possibilidade de haver erros. Erros de software têm elevado custo de correção – Podem causar situações de falhas operacionais; – Podem colocar vidas em perigo. Introdução a OO (cont.) POO compreende uma nova abordagem de conceber e construir programas. POO permite lidar com a complexidade. POO facilita a manutenção. POO possibilita a obtenção de programas mais confiáveis. Propósito da POO POO foi desenvolvida devido às limitações existentes nas abordagens anteriores. – Projeto e programação estruturada. Para programas pequenos, não há necessidade de princípio organizacional. À medida que cresce o tamanho dos programas, torna-se difícil compreender programas que excedam a centenas de linhas de código. – Questão da complexidade Linguagens Procedimentais Exemplos de linguagens procedimentais: – Fortran, Pascal e C Um programa numa linguagem procedimental é uma lista de instruções. O programador cria um conjunto de instruções e o computador as executa. Funções, em linguagens procedimentais, servem para ‘modularizar’ os programas. Módulos consiste de um grupo de funções. Programação Estruturada Divisão de um programa em funções e módulos constitui um dos fundamentos da programação estruturada. Função: mecanismo usado para `quebrar’ (i.e. dividir) o programa em unidades menores. – Tornar os programas mais compreensíveis Disciplina de programação que tem influenciado a organização de programas há vários anos. Problemas na Programação Estruturada As linguagens procedimentais colocam ênfase na função – Ler dados, processar, checar existência de erros, mostrar resultados, ... Parte importante na solução de problemas computacionais: DADOS Problemas na Programação Estruturada Em linguagens procedimentais: – Variáveis locais são usadas apenas dentro do escopo da função onde são declaradas. – Variáveis locais não são úteis para dados que devem ser acessados por muitas e diferentes funções. – Vide slide 10. Em outro contexto – Se muitas funções tem acesso a um conjunto de dados, então qualquer modificação nos dados requer modificações em todas as funções. Vide slide 11. – Tornar-se-á difícil fazer a manutenção correta de tais funções. Relação entre variáveis globais e locais Relação entre funções e dados em programas procedimentais Problemas na Programação Estruturada Programas em linguagens procedimentais são mais difíceis de serem projetados – Funções e estruturas de dados não modelam o mundo real muito bem. Mais difícil oferecer extensibilidade a linguagem procedimental, i.e.: – Adicionar, manipular e fazer a manutenção de novos tipos de dados. O que é necessário? Uma forma de restringir o acesso aos dados Esconder os dados de todas, exceto algumas poucas funções `críticas’ Benefícios resultantes: – Proteção aos dados – Simplificará a manutenção Abordagem orientada a objetos Introdução da POO Linguagens OO combinam numa única entidade (objeto) dados e funções que atuam sobre esses dados. Funções de um objeto oferecem uma única forma de acesso a seus dados. – Em C++, funções membro – Em Java, métodos Abordagem OO (2) Num programa OO, se você precisar ler os dados de um objeto, então: – Você chama a função daquele objeto – A função ler os dados e retorna os valores a você Os dados ficam `escondidos’, i.e.: – POO oferece suporte a ocultação de dados ou data hiding; – Os dados ficam seguros de qualquer alteração `acidental’; Dados e funções ficam `encapsulados’ em uma única entidade, denominada de objeto. Abordagem OO (3) Para acesar os dados de um objeto, você precisa saber quais métodos/funções interage com ele. – Isto simplifica escrita, depuração e manutenção de programas. Um programa numa linguagem OO consiste de vários objetos, comunicando-se entre si, i.e.: – Através de trocas de mensagens (Java) – Através da chamada de funções membro de outro objeto (C++) – Vide slide 17. Abordagem OO (4) Objeto dados função membro função membro Objeto Objeto dados dados função membro função membro função membro função membro Características das Linguagens OO Modelagem em termos de objetos Exemplos de objetos – Componentes elétricos, automóveis numa simulação de fluxo de tráfego – Janelas, menus, objetos gráficos, ... – Pontos no plano, tempo, ... Classes Objetos são membros de classes Classe ser como um padrão, modelo ou template Classe especifica quais dados e funções pertencerão aquela classe. Definir uma classe não cria qualquer objeto, assim como a simples existência de um tipo de dado não cria quaisquer variáveis. Classes (2) Coleção de objetos similares Classe de jogadores de futebol: – Pelé – Ronaldinho – Romário Note que não existe uma pessoa chamada `jogador de futebol’ Todavia, pessoas com nomes específicos são membros desta classe SE possuem determinadas características. Herança Classes podem ser divididas em subclasses como, por exemplo: – A classe dos animais é dividida em mamíferos, anfíbios, insetos, aves, ... – A classe dos veículos é dividida em carros de passeio, caminhões, ônibus, motocicletas, ... Princípio da herança – Classes derivadas compartilham características comuns com a classe da qual ela é derivada. Vide slide 22. – Reduz o tamanho do programa e aumenta a clareza do programa. Noção de herança A classe base B A A B C classes derivadas B D E Reusabilidade Depois que uma classe tenha sido criada, escrita e testada, ela pode ser distribuída para vários programadores e reutilizada. – Similar a forma na qual uma biblioteca de funções numa linguagem procedimental pode ser incorporada em diferentes programas. – Conceito de extensão de classe (reusabilidade da classe), i.e., adicionar novas características à classe já existente. Criação de novos tipos Exemplo: posição2 = posição + origem – As variáveis acima representam coordenadas – Representam entidades reais de modo mais claro e direto, i.e. suporte a compreensibilidade. Polimorfismo No exemplo anterior: posição2 = posição + origem – Os operadores = (igual) e + (soma) usados na expressão acima não atuam de maneira similar com os tipos predefinidos da linguagem OO como um `int’. – Usar operadores ou funções de formas diferentes, dependente sobre o que eles estão operando, é denominado de polimorfismo. Sugestões de leitura Vide artigo sobre POO no site da Revista Espaço Acadêmico em www.espacoacademico.com.br/035/35amsf.htm J. Rumbaugh et al, Modelagem e Projetos Baseados em Objetos com UML 2, Ed. Campus, 2002; Sugestões de leitura (2) K. Arnold and J. Gosling, The Java Programming Language, Addison-Wesley, 1996. H. M. Deitel and P. J. Deitel, Java – How to Program, Prentice Hall, 3rd Edition, 1999. http://java.sun.com