Paradigma Orientado a Objeto

Embed Size (px)

DESCRIPTION

Paradigma Orientado a Objeto

Citation preview

  • 1. Paradigma Orientado a Objeto Prof. Tony Alexander Hild Paradigmas de Linguagem de Programao 3 CC Unicentro 2013

2. Sumrio IntroduoConceitos GeraisAbstraoEncapsulamentoHeranaPolimorfismoCoesoAcoplamentoMensagensModularizaoExemplos de Linguagens2 3. Linguagens Orientadas a Objeto A maioria das linguagens orientadas a objeto so linguagens de alto nvel; O foco das linguagens OO no na estrutura, mas na modelagem dos dados; Programadores codificam usando plantas de modelos de dados chamados classes; Exemplos de linguagens de programao OO incluem C++, Java, C#, Visual Basic. Net, Ruby, Smalltalk, etc. 3 4. Conceitos Gerais de Linguagens Orientadas a Objeto Objeto Entidade de programao que contm mtodos e atributos e pode reagir a eventos. Mtodo Coisas que o objeto pode fazer. So os verbos dos objetos. No cdigo, geralmente so identificados por uma palavra de ao, i.e. Show, Hide, Calculate, Delete, etc.4 5. Conceitos Gerais de Linguagens Orientadas a Objeto Atributos Coisas que descrevem um objeto. So os adjetivos dos objetos. No cdigo so geralmente identificados por uma palavra descritiva, i.e. Enabled, BackColor, etc. Eventos Foras externas a um objeto ao qual esse objeto pode reagir. No cdigo, geralmente so atrelados a um procedimento de evento.5 6. Conceitos Gerais de Linguagens Orientadas a Objeto Classe Fornece uma maneira para criar novos objetos com base em uma "meta definio" de um objeto: Exemplo: A classe AutomvelConstrutores Mtodos especiais utilizados para criar novas instncias de uma classe: Exemplo: um Honda Civic uma instncia da classe Automvel.6 7. public delegate void BuzinarHandler(T emissor, string som); public class Automovel { public string Modelo; public int Ano; public Color Cor; private bool EstaLigado = false; private int Velocidade = 0; public event BuzinarHandler Buzinar;AtributosEventopublic Automovel () { } public void Ligar () { EstaLigado = true; }ClasseConstrutorpublic void Desligar () { EstaLigado = false; } public void Acelerar () { Velocidade++; }Mtodospublic void Frear () { Velocidade--; } public void ApertarBuzina () { Buzinar(this, "Beep-Beep"); } }7 8. public class Automovel { public string Modelo; public int Ano; public Color Cor; private bool EstaLigado = false; private int Velocidade = 0;Atributospublic event BuzinarHandler Buzinar; EventoClassepublic Automovel () { } . . .Construtor}8 9. public class Automovel { . . . public void Ligar () { EstaLigado = true; } public void Desligar () { EstaLigado = false; }ClasseMtodospublic void Acelerar () { Velocidade++; } public void Frear () { Velocidade--; }}public void ApertarBuzina () { Buzinar(this, "Beep-Beep"); } 9 10. Objeto ou Instncia da classe Automovel var honda_civic = new Automovel () { Ano = 2013, Cor = Color.Black, Modelo = "Honda Civic" };10 11. Abstrao Abstrao significa ignorar caractersticas, propriedades ou funes irrelevantes e enfatizar as relevantes ... Relevantes qu?... relevantes para o projeto dado (antecipando futura reutilizao em projetos similares); Abstrao = gerenciar complexidade.11 12. Abstrao A abstrao algo que fazemos todos os dias; Abstramos as propriedades do objeto, e mantemos apenas o que precisamos; Olhando para um objeto, vemos as coisas sobre ele que tm significado para ns;Por exemplo, alunos tm "nome", mas no "cor dos olhos".Permite representar uma realidade complexa em termos de um modelo simplificado; Abstrao destaca as propriedades de uma entidade que precisamos e esconde os outros. 12 13. Encapsulamento Um mecanismo da linguagem para restringir o acesso a alguns dos componentes do objeto; Uma construo da linguagem que facilita o agrupamento de dados com mtodos (ou outras funes) que operam nesses dados; Ocultao de Informaes.13 14. Encapsulamento A representao interna de um objeto geralmente escondida da viso externa da definio do objeto (interface); Normalmente, apenas os mtodos do prprio objeto podem acessar ou modificar diretamente os seus campos; Algumas linguagens, como Smalltalk e Ruby s permitem o acesso ao estado (atributos/campos) atravs de mtodos; A maioria das outras (por exemplo, C++, C # ou Java) oferecem ao programador um grau de controle sobre as entidades que esto sendo escondidas, normalmente atravs de palavras-chave como public, private, friend, protected, etc. 14 15. Encapsulamento O ponto principal que, ao pensar o sistema como sendo composto de objetos independentes, mantenham-se as subpartes realmente independentes; Os objetos devem comunicar-se apenas por meio de troca de mensagens bem definidas; Diferentes grupos de programadores podem trabalhar em diferentes partes do projeto, apenas certificando-se de que estejam de acordo com uma interface; possvel construir sistemas maiores com menos esforo. 15 16. Encapsulamento Benefcios Garante que as mudanas estruturais permanecem locais: Alterando os membros internos de um classe no afeta qualquer cdigo fora da classe; Alterar a implementao dos mtodos no modifica a forma dos clientes us-los.Encapsulamento permite adicionar alguma lgica ao acessar os dados do cliente: Por exemplo: validao ao modificar o valor da propriedade.Ocultando detalhes de implementao reduz a complexidade: Manuteno mais fcil.16 17. Encapsulamento - Resumo Encapsulamento esconde os detalhes de implementao; A classe anuncia algumas operaes (mtodos) disponveis para seus clientes - a sua interface pblica; Todos os membros de dados (campos) de uma classe devem ser escondidos: Acessados via propriedades (somente leitura e de leitura e escrita);Nenhum membro da interface deve ser escondido.17 18. Exemplo de Encapsulamento - C# namespace Encapsulation { class Program { public class Account { private decimal accountBalance = 500.00m;}public decimal CheckBalance () { return accountBalance; }static void Main () { Account myAccount = new Account (); decimal myBalance = myAccount.CheckBalance ();}}}/* This Main method can check the balance via the public * "CheckBalance" method provided by the "Account" class * but it cannot manipulate the value of "accountBalance" */18 19. public class Automovel { private bool estaLigado = false; private int velocidade = 0; . . . public void Ligar () { estaLigado = true; } public void Desligar () { estaLigado = false; } public void Acelerar () { velocidade++; } public void Frear () { velocidade--; } public bool EstaLigado() { return estaLigado; }}public bool Velocidade() { return velocidade; }19 20. Herana O conceito de herana foi criado em 1968 para a linguagem Simula; Herana o tema central da programao orientada a a objetos e das linguagens que a suportam;Permite aos programadores criar novas classes com base em uma classe existente; um relacionamento IS-A (-UM);A classe pai tambm chamada de classe base ou superclasse;A classe filha tambm chamada de classe derivada ou subclasse;A herana permite que subclasses herdem as caractersticas da classe pai existente: Atributos (campos e propriedades);Operaes (mtodos).20 21. Herana Novos mtodos e atributos podem ser criados na subclasse, sem afetar a definio da classe pai. Por exemplo: Adicionar novos campos e/ou mtodos;Redefinir mtodos, ou seja, modificar o comportamento existente: O novo mtodo sobrescreve o mtodo herdado e passa a ser chamado de mtodo sobrescrito.Redefinir mtodos da superclasse somente para os clientes e para a subclasse: Modificador new em C#.21 22. Herana Mtodos ou funes virtuais so mtodos ou funes que podem ter seu comportamento sobrescrito por uma subclasse com um mtodo ou funo com a mesma assinatura; Tambm um conceito de polimorfismo;Despacho dinmico.22 23. Herana Herana mltipla: Herana mltipla permite uma nova classe herdar de duas ou mais classes;Algumas linguagens permitem herana mltipla de classes concretas, e outras somente de interfaces: C++, Common Lisp, Eiffel, Scala, OCaml, Pearl, Python permitem herana mltipla de classes concretas; C#, D, Java, Nemerle, Object Pascal (Delphi), Objective-C permitem herana mltipla somente de interfaces; Smalltalk permite apenas herana simples; Em Ruby as classes possuem apenas um pai (superclasse), mas podem herdar de diferentes mdulos.23 24. Herana Herana mltipla: Problema do diamante: Se a classe D sobrescrever o mtodo ToString(), de qual classe deve ser sobrescrito?24 25. Herana Herana mltipla: Desvantagens: Complexidade da linguagem e implementao; Potencial ineficincia.Vantagens: s vezes, bastante conveniente. Quando?25 26. Herana Herana vs. Subtipos: Princpio de substituio de Liskov;Problema Crculo-Elipse ou Quadrado-Retngulo; Subtipos so relacionamentos do tipo -UM, onde herdado o comportamento, e no somente uma implementao, como o caso dos relacionamentos do tipo TEM-UM.Herana de interfaces a ser visto em polimorfismo.Exemplo de cdigo...26 27. Herana Restries: Dependendo da linguagem possvel: Definir classes que no podem ser herdadas; Definir classes abstratas que no podem ser instanciadas, a no ser quando herdadas por outra classe; Criar entidades que no podem ser sobrescritas; Ocultar entidades de seus clientes, mas permitir s suas subclasses vlos; Esconder entidades de suas subclasses; Final/Sealed/Abstract/Protected.27 28. Herana Benefcios Herana tem uma srie de benefcios;Extensibilidade;Aumento de produtividade pode ocorrer com o reso: Tipos de dados abstratos so difceis de reusar sempre precisam de mudanas; Definies de tipos de dados abstratos so todas independentes e no mesmo nvel. Abstrao; Elimina cdigo redundante;Use herana para criar relacionamentos -UM (IS-A) Por exemplo co -um animal (ces so uma espcie de animais)No usar para criar relacionamentos TEM-UM (HAS-A) Por exemplo co tem-um nome (co no o tipo nome)28 29. Herana Desvantagens: Cria dependncias entre classes em uma hierarquia;Pode se tornar extramamente complexa com a adio de diversos nveis;Diminui a flexibilidade do cdigo.29 30. Exemplo de Cdigo Herana30 31. //C# abstract class Animal { public string Name; public void Drink() { } public virtual void Eat() { } public void Go() { } } class Cat : Animal { // warning: Esconde o Drink() herdado. Usar new. public void Drink() { } // Sobrescreve o Eat() herdado. public override void Eat() { } // Esconde o Go() herdado. public new void Go() { } }31 32. // C++ class animal { void /*nonvirtual*/ move() { cout