Programação Orientada por Objectos - Aula 1

5.690 visualizações

Publicada em

Aula teórica 1 da unidade (disciplina) de Programação Orientada por Objectos dos cursos de LIGE, LEI e LETI no ISCTE-IUL no 2.º semestre do ano lectivo de 2009/2010.

Publicada em: Educação, Tecnologia
  • Seja o primeiro a comentar

Programação Orientada por Objectos - Aula 1

  1. 1. Aula 1<br />Introdução à programação orientada por objectos<br />Classes, objectos e referências (revisão)<br />Modularização em pacotes<br />Organização em ficheiros e directórios<br />
  2. 2. Programação estruturada<br />Forma<br />Instâncias de tipos escalares ou matriciais<br />Instruções organizadas em estruturas de controlo<br />Sem modularização<br />Melhorias<br />Melhora estruturação do fluxo de controlo dos programas<br />Possibilita raciocínio formal acerca de programas<br />Aumenta legibilidade dos programas face ao passado (programação “esparguete”)<br />2008/2009<br />Programação Orientada por Objectos<br />2<br />Organização do código em módulos, i.e., “cápsulas” com objectivos bem definidos contendo uma implementação oculta e expondo ao exterior uma interface. A modularização favorece a abstracção.<br />
  3. 3. Programação procedimental<br />Forma<br />Instâncias de tipos escalares ou vectoriais<br />Instruções organizadas em estruturas de controlo<br />Instruções e estruturas de controlo organizadas em rotinas<br />Modularização em rotinas<br />Funções – Devolvem resultado de um cálculo<br />Procedimentos – Agem sobre dados, modificando-os<br />Melhorias<br />Possibilita encapsulamento<br />Facilita reutilização<br />Melhora localização de erros e facilita manutenção<br />Possibilita maximização da coesão e minimização das ligações<br />2010-03-30<br />Programação Orientada para Objectos<br />3<br />
  4. 4. Programação baseada em objectos ou centrada nos dados<br />Forma<br />Instâncias de tipos escalares ou vectoriais, ou de TAD (tipos abstractos de dados)<br />Instruções organizadas em estruturas de controlo<br />Instruções e estruturas de controlo organizadas em rotinas<br />Rotinas relacionadas organizadas em TAD<br />Modularização<br />TAD – Conjunto de dados e operações<br />Operações – Rotinas que operam sobre instâncias de TAD<br />Melhorias<br />Melhora encapsulamento (dados e operações relacionadas)<br />Possibilita ocultação dos dados<br />Muda perspectiva sobre os problemas<br />2008/2009<br />Programação Orientada por Objectos<br />4<br />
  5. 5. Programação orientada por objectos<br />Forma<br />Instâncias de classes (objectos), de tipos escalares ou vectoriais, ou de TAD (tipos abstractos de dados)<br />Instruções organizadas em estruturas de controlo<br />Instruções e estruturas de controlo organizadas em rotinas<br />Rotinas relacionadas organizadas em TAD<br />Operações relacionadas organizadas em classes<br />Modularização<br />Classes – Modelos para objectos com um dado comportamento<br />TAD – Conjunto de dados e operações<br />Operações – Rotinas que operam sobre instâncias de TAD<br />Métodos – Implementação das operações<br />Melhorias<br />Introduz noções de extensão e especialização<br />Muda drasticamente perspectiva sobre os problemas<br />2008/2009<br />Programação Orientada por Objectos<br />5<br />
  6. 6. Programação orientada por objectos: classes<br />Paradigmas usados<br />Programação estruturada – Controlo de fluxo<br />Programação procedimental – Rotinas<br />Programação centrada nos dados – TAD e operações<br />Vantagens<br />Melhor modularização<br />Melhor encapsulamento<br />Maior possibilidade de reutilização<br />Possibilidade de extensão e especialização<br />Maior expressividade<br />Maior flexibilidade<br />Maior robustez<br />2008/2009<br />Programação Orientada por Objectos<br />6<br />
  7. 7. Programação orientada por objectos: encapsulamento<br />Interface:<br />Operações – Implementadas em um ou mais métodos<br />Propriedades – Podem ou não ser implementadas usando atributos<br />Implementação<br />Métodos – Implementação de operações<br />Atributos – Dados que fazem parte da implementação da classe<br />2008/2009<br />Programação Orientada por Objectos<br />7<br />
  8. 8. Programação orientada por objectos: abordagem<br />Tudo (ou quase) são objectos<br />Objectos têm responsabilidades, comportamentos e propriedades<br />Organização de programas reflecte realidade…<br />…mas os objectos são personalizados<br />2008/2009<br />Programação Orientada por Objectos<br />8<br />Na linguagem usada pelos programadores é muito comum e útil a prosopopeia. Por exemplo, “depois pede-se o nome ao aluno” corresponde a student.name() ou student.getName().<br />
  9. 9. Programação orientada por objectos: análise e desenho<br />Análise do problema<br />Que objectos existem?<br />Que responsabilidades têm?<br />Como colaboram?<br />Como classificar os objectos?<br />Desenho da solução<br />Que classes definir?<br />Que objectos construir?<br />Que responsabilidades lhes atribuir?<br />De que forma os fazer colaborar?<br />2008/2009<br />Programação Orientada por Objectos<br />9<br />
  10. 10. Classes e objectos<br />Classes<br />São tipos<br />São modelo ou projecto para construção de objectos com características comuns<br />Declaram-se ou definem-se<br />Definem conjunto de possíveis objectos<br />Exemplos: humano, carro<br />Objectos<br />São instâncias de classes<br />Constroem-se<br />Exemplos: Manuel Silva, o carro do Manuel Silva<br />2008/2009<br />Programação Orientada por Objectos<br />10<br />
  11. 11. Classes e objectos<br />Classes<br />Representam objectos com características comuns<br />Favorecem abstracção (consumidor só conhece interface)<br />Permitem encapsulamento (implementação oculta)<br />Possibilitam reutilização (por especialização ou instanciação)<br />Objectos<br />Modelam ou representam entidades reais (carro) ou virtuais (compra)<br />Têm identidade própria<br />Têm estado total ou parcialmente observável através da interface<br />2008/2009<br />Programação Orientada por Objectos<br />11<br />
  12. 12. Tipos de referência e tipos de valor<br />Tipos de referência<br />Identidade é relevante<br />Igualdade usualmente não é relevante<br />Tipos de valor<br />Igualdade é relevante<br />Identidade não é relevante<br />2008/2009<br />Programação Orientada por Objectos<br />12<br />Classes Java.<br />Tipos primitivos em Java.<br />
  13. 13. Classes em Java<br />Definem conjunto de características (propriedades e operações) comuns a todas as suas instâncias.<br />2010-03-30<br />Programação Orientada para Objectos<br />13<br />Car<br />- licenseNumber : String<br />- model : String<br />- yearBuilt : int<br />- lastInspectionDate : Date<br />implementação<br />interface<br />+ getLicenseNumber() : String<br />+ getModel() : String<br />+ getLastInspectionDate() : Date<br />+ getYearAge() : int<br />+ getNextInspectionDate() : Date<br />+ isInspected() : boolean<br />+ setInspectedToday()<br />Propriedades<br />Operação<br />
  14. 14. Objectos em Java<br />Instâncias de uma classe com valores específicos nos seus atributos e, por isso, com propriedades bem definidas.<br />2010-03-30<br />Programação Orientada para Objectos<br />14<br />johnsCar : Car<br />licenseNumber = 00-aa-00<br />model = VW-GTI-TDI-SLK<br />yearBuilt = 2005<br />lastInspectionDate = 2009-11-20<br />
  15. 15. Operações e métodos em Java<br />Operações<br />Parte da interface da classe <br />Invocam-se<br />Métodos<br />Parte da implementação da classe<br />Executados quando se invoca a operação correspondente<br />Uma única operação pode ser implementada por vários métodos<br />2008/2009<br />Programação Orientada por Objectos<br />15<br />Como? Usando polimorfismo de subtipos, que se verá mais tarde.<br />
  16. 16. Construtores em Java<br />Inicializam objectos quando estes são construídos<br />Colocam objectos num estado inicial válido (cumprindo o a condição invariante de instância)<br />2008/2009<br />Programação Orientada por Objectos<br />16<br />
  17. 17. Operações em Java<br />Modificadoras – Alteram o estado do objecto e possivelmente do resto do programa ou seu ambiente (são procedimentos)<br />Não modificadoras – Não alteram o estado do objecto<br />Inspectoras – Devolvem uma qualquer propriedade do objecto e não têm efeitos laterais (são funções)<br />“Alter-modificadoras” – Alteram o estado do programa ou do seu ambiente sem alterar o objecto (são procedimentos)<br />2008/2009<br />Programação Orientada por Objectos<br />17<br />
  18. 18. Operações em Java: boas práticas<br />Cada operação deve ter um objectivo (uma função) único e bem definido<br />Operações inspectoras – Nome reflecte aquilo que devolvem<br />Outras operações – Nome reflecte a acção que realizam<br />Uma operação não deve tentar ser simultaneamente inspectora e modificadora (função e procedimento)<br />2008/2009<br />Programação Orientada por Objectos<br />18<br />
  19. 19. Características de classe<br />Classes são “pseudo-objectos” fábrica das suas instâncias<br />“Pseudo-objectos” fábricas têm características de classe<br />Em Java declaração de atributos e métodos de classe precede-se do qualificador static<br />Boas práticas<br />Evitar características de classe!<br />Usar apenas para definir constantes!<br />Exemplo<br />Math.PI<br />2008/2009<br />Programação Orientada por Objectos<br />19<br />Por oposição às características de instância.<br />
  20. 20. Referências e objectos<br />CarjohnsCar = newCar("00-aa-00", …);<br />CarjanesCar = johnsCar;<br />CarfredsCar = newCar(johnsCar);<br />2010-03-30<br />Programação Orientada para Objectos<br />20<br />Construtor por cópia!<br />johnsCar, janesCar : Car<br />fredsCar : Car<br />licenseNumber = 00-aa-00<br />…<br />licenseNumber = 00-aa-00<br />…<br />Hmmm…. Mesma matrícula??<br />
  21. 21. Referências e objectos<br />CarjohnsCar = newCar("00-aa-00", …);<br />CarjanesCar = johnsCar;<br />CarfredsCar = newCar(johnsCar);<br />2010-03-30<br />Programação Orientada para Objectos<br />21<br />Referências:<br />Objectos:<br />johnsCar : «ref» Car<br />: Car<br />: Car<br />janesCar : «ref» Car<br />fredsCar : «ref» Car<br />licenseNumber = 00-aa-00<br />…<br />licenseNumber = 00-aa-00<br />…<br />
  22. 22. UML = UnifiedModellingLanguage<br />2010-03-30<br />Programação Orientada para Objectos<br />22<br />Nome<br />Acesso<br />Nome do objecto<br />Atributos<br />Atributos<br />Operações<br />johnsCar : Car<br />Car<br />licenseNumber = 00-aa-00<br />model = VW-GTI-TDI-SLK<br />yearBuilt = 2005<br />lastInspectionDate = 2009-11-20<br />- licenseNumber : String<br />…<br />Valores dos atributos<br />+ getLicenseNumber() : String<br />…<br />
  23. 23. Referências e objectos: declaração e construção<br />Classevariável;<br />variável = null;<br />Classe outraVariável = null;<br />ClasseaindaOutraVariável =<br />newClasse(…);<br />2008/2009<br />Programação Orientada por Objectos<br />23<br />Declaração da referência variável, não inicializada, capaz de referenciar objectos da classe Classe.<br />Construção do novo objecto<br />Construção da referência<br />Construção da referência<br />Atenção! Os tipos primitivos do Java (int, float, char, etc.) são tipos de valor. Não há referências para eles. As variáveis declaradas são uma instância do tipo primitivo. Por exemplo:<br />intanInteger;<br />anInteger = 10;<br />intanotherInteger = 20;<br />Inicialização da referência com o valor especial null, que indica que referência não referencia qualquer objecto.<br />Construção de uma referência com valor inicial nulo.<br />Construção de um novo objecto e de uma referência que o referencia.<br />
  24. 24. Acesso a características (ou membros)<br />Usa-se operador . (ponto)<br />Objecto (característica de instância)<br />referênciaParaObjecto.característica<br />Classe (característica de classe)<br />Classe.característica<br />2008/2009<br />Programação Orientada por Objectos<br />24<br />Se a referência for nula (null), é lançada a excepção NullPointerException.<br />
  25. 25. Princípio do encapsulamento<br />Tudo o que pode ser privado, deve ser privado!<br />Regras gerais<br />Todos os atributos devem ser privados<br />Os construtores são usualmente públicos<br />2008/2009<br />Programação Orientada por Objectos<br />25<br />As constantes, pelo contrário, podem e muitas vezes devem ser públicas.<br />
  26. 26. Classe é um módulo<br />Interface<br />Operações e métodos não privados<br />Constantes não privadas<br />Implementação<br />Operações e métodos privados<br />Atributos privados<br />Corpos dos métodos<br />Contrato<br />Pré e pós-condições das operações e métodos<br />Manual de utilização<br />Comentários de documentação da classe<br />Comentários de documentação de cada característica pública<br />2008/2009<br />Programação Orientada por Objectos<br />26<br />não privado ≠ público<br />etc.<br />
  27. 27. Categorias de acesso<br />Características ou membros podem ser<br />private – acesso apenas por outros membros da mesma classe<br />package-private (sem qualificador) – adicionalmente, acesso por membros de classes do mesmo pacote<br />protected – adicionalmente, acesso por membros de classes derivadas (a ver nas próximas aulas) <br />public – acesso universal<br />2008/2009<br />Programação Orientada por Objectos<br />27<br />Acessibilidade crescente<br />Há promiscuidade entre objectos da mesma classe! Cuidado!<br />Que é isto? Próximo diapositivo…<br />
  28. 28. Pacote<br />Pacote<br />Unidades de modularização em Java<br />2010-03-30<br />Programação OrientadaparaObjectos<br />28<br />Classe<br />Classe<br />Rotina<br />Rotina<br />Rotina<br />Rotina<br />Classe<br />Rotina<br />Rotina<br />Classe<br />Rotina<br />Rotina<br />Rotina<br />Rotina<br />Classe<br />Rotina<br />Rotina<br />Rotina<br />Rotina<br />Rotina<br />Rotina<br />
  29. 29. Pacotes<br />Conjuntos de classes com relação lógica forte entre si<br />Exemplos<br />java.util<br />org.junit<br />Convenções de nomes<br />Só minúsculas<br />Sem separação entre palavras<br />Abreviaturas e siglas aceitáveis<br />Primeiros elementos são nome DNS invertido (e.g., pt.iscte)<br />Restantes elementos podem designar unidades organizacionais (e.g., pt.iscte.dcti.poo)<br />2008/2009<br />Programação Orientada por Objectos<br />29<br />
  30. 30. Pacotes como módulos<br />Interface<br />Classes públicas<br />Membros não privados de classes públicas<br />Implementação<br />Para além da implementação das classes…<br />… todas as classes privadas de pacote (package-private)<br />2008/2009<br />Programação Orientada por Objectos<br />30<br />
  31. 31. Pacotes: organização hierárquica<br />java<br />lang<br />util<br />org<br />junit<br />omg<br />pt<br />iscte<br />dcti<br />ip<br />games<br />poo<br />Hierarquia aberta<br />Não têm declaração isolada<br />Cada ficheiro .java declara o pacote a que pertence<br />2008/2009<br />Programação Orientada por Objectos<br />31<br />Game.java<br />Player.java<br />packagept.iscte.dcti.poo<br />class Game {<br /> …<br />}<br />packagept.iscte.dcti.poo<br />classPlayer {<br /> …<br />}<br />
  32. 32. Pacotes: organização hierárquica<br />Relevante quanto a nomes<br />Organização lógica (como directórios)<br />Menor colisão de nomes<br />Irrelevante quanto a categorias acesso<br />Pacote e subpacote são independentes<br />Membros do subpacote não o são do pacote<br />Membros do pacote não o são do subpacote<br />2008/2009<br />Programação Orientada por Objectos<br />32<br />
  33. 33. Pacotes: organização hierárquica<br />2010-03-30<br />Programação Orientada para Objectos<br />33<br />The type top.AtTop is not visible<br />The type top.bottom.AtBottom is not visible<br />
  34. 34. Ficheiros<br />Uma só classe pública por ficheiro<br />Classe pública e seu ficheiro têm de ter o mesmo nome<br />Número arbitrário de classes privadas de pacote (package-private) por ficheiro, mas…<br />Boa prática: Uma só classe por ficheiro!<br />2008/2009<br />Programação Orientada por Objectos<br />34<br />
  35. 35. Directórios<br />Usualmente, à hierarquia de pacotes corresponde uma hierarquia de directórios com os ficheiros correspondentes<br />2008/2009<br />Programação Orientada por Objectos<br />35<br />Depende da implementação do Java.<br />No Explorer do Windows<br />(directórios)<br />No Eclipse<br />(pacotes)<br />
  36. 36. A reter<br />Uma classe é um modelo<br />Um objecto é uma instância de uma classe<br />Em Java não é possível declarar variáveis cujo tipo é uma classe: variáveis declaradas dessa forma são referências para objectos da classe<br />Tudo o que pode ser privado, deve ser privado<br />As classes devem ser organizadas em pacotes<br />2010-03-30<br />Programação Orientada para Objectos<br />36<br />
  37. 37. A ler para as próximas aulas ...<br />Capítulo 8 do livro:<br />Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice-Hall, 2008.ISBN: 978-0-13-605966-0<br />2010-03-30<br />Programação Orientada para Objectos<br />37<br />
  38. 38. Sumário<br />Introdução à programação orientada por objectos<br />Classes, objectos e referências (revisão)<br />Modularização em pacotes<br />Organização em ficheiros e directórios<br />2010-03-30<br />Programação Orientada para Objectos<br />38<br />

×