POO - Aula 003

1,387 views
1,181 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,387
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
33
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

POO - Aula 003

  1. 1. Aula 003 Professor Dal Prá
  2. 2. Objetivos das próximas aulas • Orientação a objetos – Conceitos – UML • Como criar modelos (diagramas) que representem o que iremos desenvolver em Java – Como aplicar este conceitos no Java Base para todo o restante do curso Professor Dal Prá
  3. 3. Orientação a Objetos • • • • criada em 1967 (Simula) SmallTalk (Anos 70 / Xerox ) C++ ( C com OO / AT&T) Atualmente – – – – Java Object Pascal (Delphi) .NET PHP • Usar linguagem OO híbrida não garante que o sistema seja OO; Professor Dal Prá
  4. 4. Orientação a Objetos • Novo paradigma, ou seja, nova forma de pensar • Abstração mais próxima do mundo real – Conta Bancária • Atributos: saldo, limite; • Funcionalidades: debitar, creditar, transferir; – Não significa que será totalmente intuitivo; • Desenvolver software não é fácil para todos; Professor Dal Prá
  5. 5. Orientação a Objetos • Padroniza o pensamento – Análise orientada a objetos; – Projeto orientado a objetos; – Programação orientada a objetos (POO – OOP); Professor Dal Prá
  6. 6. Orientação a Objetos • Melhor organização do sistema – cada objeto terá uma função específica: • Conta Bancária: controla a movimentações do correntista; • Correntista: guardar informações do cliente do banco; • Formulário: receber informações digitadas pelo usuário; • Botão: Executar uma ação após o clique do usuário; – Maior Produtividade (não precisa repetir uma lógica que é de responsabilidade de outro objeto); Professor Dal Prá
  7. 7. Orientação a Objetos Alta coesão • Objetos super especializados – Maior reusabilidade dos objetos – Menor impacto nas manutenções – Maior velocidade nas manutenções Não criar estruturas que “FAZEM TUDO” Professor Dal Prá
  8. 8. Orientação a Objetos • Um sistema orientado a objetos é um grande diálogo entre objetos (cooperação); Interface com o Usuário 1 - Você pode me passar o extrato do Correntista Junior durante o período X? 4 – Segue o extrato do correntista. 3 - Ok. Ai está a lista de movimentações. Acesso ao Banco de Dados Professor Dal Prá Lógica de Negócios da Conta Bancaria 2 - Você pode me passar o meu histórico de movimentações durante o período X ?
  9. 9. Conceitos Básicos OO • Abstração • Classes – Atributos • Tipos • Valores padrão – Métodos • Assinaturas • Repostas • Objetos – Referência Professor Dal Prá
  10. 10. Conceitos Avançados OO • Relacionamentos – Dependência – Herança • Conversões – Associação • Encapsulamento – Modificadores de acessos • Classes • Atributos • Métodos – Padrão de codificação de classes no Java Professor Dal Prá
  11. 11. Conceitos Avançados • Polimorfismo – Classes abstratas – Interfaces • Diminuir o acoplamento entre classes Professor Dal Prá
  12. 12. Como representar estes conceitos antes mesmo de implementá-los? Professor Dal Prá
  13. 13. Unified Modeling Language - UML • Linguagem de Modelagem Unificada – Linguagem: o que for “escrito” em UML deve ser entendido; – Modelagem: imagens valem mais do que mil palavras; – Unificada: melhores idéias entre várias técnicas (Booch, OOSE, OMT); • Não é padrão, mas é muito utilizada; • Pré-requisito em muitas oportunidades; Professor Dal Prá
  14. 14. Unified Modeling Language - UML • Modelos expressam – Aspectos estáticos: informações a serem manipuladas ou armazenadas; – Aspectos dinâmicos: perguntas e respostas entre objetos e mudança de estados (mudança nos valores armazenados nos objetos); Professor Dal Prá
  15. 15. Mas para que vamos usar isso ? • Modelar – – – – Compreender o que vamos fazer; Projetar antes de codificar; Documentar Facilitar a comunicação entre os membros da equipe e também o cliente; • $ em manutenção > $ desenvolvimento; Professor Dal Prá
  16. 16. Para simplificar ... Não vamos usar 100% da UML Professor Dal Prá
  17. 17. Abstração • Não é um conceito exclusivo da OO; • Problemas do mundo real  Conceitos de programação  linguagem de programação; • Linguagem OO a torna mais fácil; • Nomes dos objetos do mundo real serão utilizados nos objetos que estarão dentro do programa; Professor Dal Prá
  18. 18. Abstração • Nosso cliente pedirá: “ Preciso controlar os saques, depósitos e dados das contas bancárias dos meus clientes. Preciso saber o número da conta, o nome do cliente, qual o saldo e o limite ” Professor Dal Prá
  19. 19. Abstração • O analista/arquiteto vai converter isso em um modelo – UML, no caso de OO • O Programador vai pegar o modelo definido e vai materializar ele nas linhas de códigos – Linguagens de programação; • Java, no nosso caso – Ferramentas; – Bancos de dados; – Comunicação com periféricos; Professor Dal Prá
  20. 20. Vamos abstrair o problema de nosso cliente Professor Dal Prá
  21. 21. Sistema OO é composto por vários objetos cooperantes, mas como eu defino um objeto? Professor Dal Prá
  22. 22. Classes • Representa um novo tipo de dado – Características de um objeto UML ContaBancaria Professor Dal Prá
  23. 23. Podemos dizer que ... • É o projeto que definirá como será um objeto dentro do sistema – Podemos fazer uma analogia ao projeto de uma casa • Mostra como será a casa, porém não é a casa construída! Professor Dal Prá
  24. 24. Assim se que se “declara” uma clase no Java class NomeDaClasse { // corpo da classe } Arquivo: NomeDaClasse.java Professor Dal Prá
  25. 25. Classes class ContaBancaria { } Arquivo: ContaBancaria.java Professor Dal Prá
  26. 26. Temos a classe, mas como vamos guardar os dados dentro desta classe? Professor Dal Prá
  27. 27. Classes - Atributos • Definem os possíveis estados do objeto – Atributos • Nome • Tipo – Valor padrão – Valor inicial Professor Dal Prá
  28. 28. Classes – Atributos UML ContaBancaria numero: int nomeCliente : String saldo : double limiteCredito : double = 100.0 Professor Dal Prá
  29. 29. Classes – Atributos Java // virá com o valor padrão TipoDoAtributo nomeDoAtributo; // definido um valor inicial TipoDoAtributo nomeDoAtributo = valorInicial; Professor Dal Prá
  30. 30. Classes – Atributos class ContaBancaria{ int numero; String nomeCliente; double saldo; double limiteCredito = 100.0; } Professor Dal Prá
  31. 31. Classes – Atributos • Valores default –numéricos : 0 –boolean : false Professor Dal Prá
  32. 32. Agora temos • novo tipo de dado chamado ContaBancaria – Poderá armazenar • • • • numero nomeCliente saldo limiteCredito • Mas e o que ele irá fazer? Qual será a contribuição dele para o sistema? Ele apenas armazenará informações? Professor Dal Prá
  33. 33. Classes – Métodos • Define quais ações poderão ser executadas – Habilidades que estarão definidas em uma classe – Método • Assinatura ( regra para formular uma pergunta ) – Argumentos » Nome » Tipo • Retorno ( resposta à pergunta ) – Sem resposta – Tipo Professor Dal Prá
  34. 34. Classes – Métodos UML ContaBancaria numero: int nomeCliente : String saldo : double limiteCredito : double = 100.0 saca ( valor : double ) : boolean; deposita ( valor : double ) : void; Professor Dal Prá
  35. 35. Classes – Métodos Java retorno nomeMetodo(tipoArgumento nomeArgumento){ // corpo do método } retorno nomeMetodo(tipoArgumento1 nomeArgumento1,..., tipoArgumentoN nomeArgumentoN){ // corpo do método } Professor Dal Prá
  36. 36. Classes – Métodos Java retorno nomeMetodo(tipoArgumento nomeArgumento){ // corpo do método } 1. 2. Sempre será necessário definir um retorno, mesmo que seja NADA O nome do método dos argumentos deverá ser intuitivo, para facilitar a comunicação entre os desenvolvedores Professor Dal Prá
  37. 37. Classe – Métodos class ContaBancaria { int numero; String nomeCliente; double saldo; double limiteCredito = 100.0; boolean saca(double valor) { saldo -= valor; return true; } void deposita(double valor){ saldo += valor; } } Professor Dal Prá
  38. 38. Classes – Métodos 1 3 2 boolean saca(double valor) { saldo -= valor; 4 return true; } 5 1. Tipo de retorno (resposta) 2. Nome do método (v. imperativo) 3. Argumento esperado (para formular a pergunta) 4. Executando a ação 5. Retornando o valor esperado (tipo do return tem que ser igual ao definido no método) Professor Dal Prá
  39. 39. Classes – Métodos 1 2 3 void deposita(double valor){ saldo += valor; 4 } 1. void == sem nada ( não vai retornar nenhum valor ) 2. Nome do método 3. Argumentos 4. Executando a ação 5. Aonde está o return? Professor Dal Prá
  40. 40. Classes Definido um novo tipo de dado, como faço para executar ele, ou seja, como faço para dar vida a esta nova estrutura dentro do sistema ? Professor Dal Prá
  41. 41. Objeto • É uma execução de uma determinada classe – instância Professor Dal Prá
  42. 42. Podemos dizer que ... • É o projeto posto em prática – É casa construída segundo o que foi definido no projeto Professor Dal Prá
  43. 43. Objeto public class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); contaJunior.numero = 1143166; contaJunior.nomeCliente = "José Dal Prá Junior"; contaJunior.saldo = 100.0; contaJunior.limiteCredito = 10.0; contaJunior.deposita(10); System.out.println(contaJunior.saldo); } } Professor Dal Prá
  44. 44. Objeto contaJunior é uma variável do tipo ContaBancaria, certo? Professor Dal Prá
  45. 45. Objeto • contaJunior é uma variável que guarda o ponto da memória (um número) aonde um objeto do tipo ContaBancaria foi criado – Pense em um copo (variável) com um controle remoto • Chamasse variável de referência para um objeto – Objeto, para simplificar Professor Dal Prá
  46. 46. Objeto public class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); contaJunior.numero = 1143166; contaJunior.nomeCliente = "José Dal Prá Junior"; contaJunior.saldo = 100.0; Pede para o Java reservar um contaJunior.limiteCredito = 10.0; espaço na memória e criar um contaJunior.deposita(10); System.out.println(contaJunior.saldo); } } Professor Dal Prá novo objeto do tipo ContaBancaria
  47. 47. Objeto public class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); contaJunior.numero = 1143166; contaJunior.nomeCliente = "José Dal Prá Junior"; contaJunior.saldo = 100.0; contaJunior.limiteCredito = 10.0; Guarda o endereço da memória aonde está o OBJETO contaJunior.deposita(10); System.out.println(contaJunior.saldo); } } Professor Dal Prá
  48. 48. Objeto public class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); contaJunior.numero = 1143166; contaJunior.nomeCliente = "José Dal Prá Junior"; contaJunior.saldo = 100.0; contaJunior.limiteCredito = 10.0; contaJunior.deposita(10); Navega pelo “endereço de memória” aonde nosso objeto System.out.println(contaJunior.saldo);está e joga valores para os atributos dele } } Professor Dal Prá
  49. 49. Objeto public class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); contaJunior.numero = 1143166; contaJunior.nomeCliente = "José Dal Prá Junior"; Utiliza a variável que guarda contaJunior.saldo = 100.0; o endereço da memória aonde contaJunior.limiteCredito = 10.0; contaJunior.deposita(10); System.out.println(contaJunior.saldo); } } Professor Dal Prá está nosso objeto para poder chamar um método, ou seja, acionar uma habilidade do nosso objeto
  50. 50. Objeto public class Programa { Se eu executar este código, o public static void main(String[] args) que acontece ? Por quê? { ContaBancaria contaJunior = new ContaBancaria(); ContaBancaria conta2 = contaJunior; conta2.numero = 1143166; conta2.nomeCliente = "José Dal Prá Junior"; conta2.saldo = 100.0; conta2.limiteCredito = 10.0; conta2.deposita(10); System.out.println(contaJunior.saldo); } } Professor Dal Prá
  51. 51. Objeto public class Programa { Estão apontando para o mesmo public static void main(String[] args) { endereço de memória! ContaBancaria contaJunior = new ContaBancaria(); ContaBancaria conta2 = contaJunior; conta2.numero = 1143166; conta2.nomeCliente = "José Dal Prá Junior"; conta2.saldo = 100.0; conta2.limiteCredito = 10.0; conta2.deposita(10); System.out.println(contaJunior.saldo); } } Professor Dal Prá
  52. 52. Objeto public class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); ContaBancaria conta2 = contaJunior; // ... System.out.println(contaJunior == conta2); } O que irá imprimir ? Por que imprimiu este valor ? } Professor Dal Prá
  53. 53. Objeto class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); contaJunior.numero = 1143166; contaJunior.nomeCliente = "José Dal Prá Junior"; contaJunior.saldo = 100.0; contaJunior.limiteCredito = 10.0; contaJunior.deposita(10); ContaBancaria mesmaConta = new ContaBancaria(); mesmaConta.numero = 1143166; mesmaConta.nomeCliente = "José Dal Prá Junior"; mesmaConta.saldo = 100.0; O que será impresso na tela? mesmaConta.limiteCredito = 10.0; Por que? mesmaConta.deposita(10); System.out.println(contaJunior == mesmaConta); } } Professor Dal Prá
  54. 54. Objeto contaJunior == mesmaConta Está comparando se as variáveis estão apontando para o mesmo lugar na memória! Professor Dal Prá
  55. 55. Objeto contaJunior.numero == mesmaConta.numero Para comparar se os objetos são iguais, eu preciso comparar os valores que estão armazenados nos atributos Isso vai mudar de CLASSE para CLASSE Professor Dal Prá
  56. 56. Objeto Imprima o valor da expressão: contaJunior.numero == mesmaConta.numero Qual o resultado ? Professor Dal Prá
  57. 57. Abstração • Nosso cliente pede: “Preciso que seja possível fazer transferência de valores entre contas” Professor Dal Prá
  58. 58. O que temos que fazer ? Professor Dal Prá
  59. 59. Como ficará nosso método ? transfere( numeroOrigem : int, numeroDestino : int, valor : double ) : boolean OU transfere( contaOrigem : ContaBancaria, contaDestino : ContaBancaria, valor : double) : boolean ?????? Professor Dal Prá
  60. 60. Ficará transfere( destino : ContaBancaria, valor : double ) : boolean; Isso por que vamos transferir valores da conta atual para a conta destino. Professor Dal Prá
  61. 61. Classes – Métodos UML ContaBancaria numero: int nomeCliente : String saldo : double limiteCredito : double = 100.0 saca ( valor : double ) : boolean; deposita ( valor : double ) : void; transfere( destino : ContaBancaria, valor : double ) : boolean; Professor Dal Prá
  62. 62. Classes – Métodos Java boolean transfere( ContaBancaria destino, double valor) { this.saldo -= valor; destino.saldo += valor; return true; } Professor Dal Prá
  63. 63. Classes – Métodos boolean transfere( ContaBancaria destino, double valor) { this.saldo -= valor; destino.saldo += valor; return true; } • O que é esse this ??? • Eu posso definir um objeto como argumento ? Professor Dal Prá
  64. 64. Classes – Métodos Mas Professor, parece que eu já vi esta lógica de diminuir um valor do saldo. Olha, posso estar enganado, mas eu fiz uma lógica parecida para somar um valor no saldo! Professor Dal Prá
  65. 65. Classes – Métodos Aonde estão estas lógicas já existentes ? Professor Dal Prá
  66. 66. Classes – Métodos ContaBancaria numero: int nomeCliente : String saldo : double limiteCredito : double = 100.0 saca ( valor : double ) : boolean; deposita ( valor : double ) : void; transfere( destino : ContaBancaria, valor : double ) : boolean; Professor Dal Prá
  67. 67. Classes – Métodos boolean transfere( ContaBancaria destino, double valor) { this.saca(valor); destino.deposita(valor); return true; } Professor Dal Prá
  68. 68. Classes – Métodos Podemos melhorar a lógica implementada na nossa classe ContaBancaria ? Professor Dal Prá
  69. 69. Classes – Métodos boolean saca(double valor) { if (saldo < valor) { return false; } saldo -= valor; return true; } Professor Dal Prá
  70. 70. Classes – Métodos boolean transfere( ContaBancaria destino, double valor) { boolean sacou = this.saca(valor); if (!sacou) { return false; } destino.deposita(valor); return true; } Professor Dal Prá
  71. 71. Utilizando o novo método ContaBancaria contaJunior = new ContaBancaria(); // ... ContaBancaria contaDestino = new ContaBancaria(); boolean transferiu = contaJunior.transfere(contaDestino, 100); if (transferiu == true) { System.out.println("Transferiu"); } else { System.out.println("Erro na transferência"); } System.out.println(contaJunior.titular.nome); System.out.println(contaJunior.saldo); Professor Dal Prá
  72. 72. Abstração • Nosso cliente pede: “ Além do nome do cliente, preciso guardar o CPF e o sexo dele” Professor Dal Prá
  73. 73. Classes - Atributos ContaBancaria numero: int nomeCliente : String saldo : double limiteCredito : double = 100.0 CPFCliente : String sexoCliente : boolean saca ( valor : double ) : boolean; deposita ( valor : double ) : void; transfere( destino : ContaBancaria, valor : double ) : boolean; Professor Dal Prá
  74. 74. Classes - Atributos ContaBancaria Uma conta tem CPF ? numero: int nomeCliente : String saldo : double Tem sexo ? = 100.0 limiteCredito : double CPFCliente : String Não é muita responsabilidade para uma pobre ContaBancaria ? saca ( valor : double ) : boolean; sexoCliente : boolean deposita ( valor : double ) : void; O que fazer? transfere( destino : ContaBancaria, valor : double ) : boolean; Professor Dal Prá
  75. 75. Usando a UML Professor Dal Prá
  76. 76. e fazendo isso com Java class Cliente { String nome; String CPF; boolean sexo; } Professor Dal Prá
  77. 77. Aonde vou colocar as duas classes? • Diagrama de classes – Vai mostrar as classes que fazem parte do sistema • Atributos • Métodos – Relacionamento entre elas Professor Dal Prá
  78. 78. Classes - Relacionamentos Como posso representar a ligação entre as classes ? Professor Dal Prá
  79. 79. Classes - Associação Este é um relacionamento de ASSOCIAÇÃO Está IMPLÍCITO que existirá um atributo do tipo Cliente dentro de ContaBancaria e também que terá um atributo do tipo ContaBancaria dentro de Cliente Professor Dal Prá
  80. 80. Classes - Associação Mas e se eu quiser mudar o nome dos atributos ? Professor Dal Prá
  81. 81. Classes – Associação ContaBancaria terá um atributo titular do tipo Cliente. E Cliente terá um atributo conta do tipo ContaBancaria. Professor Dal Prá
  82. 82. Classes – Associação class ContaBancaria { int numero; double saldo; double limiteCredito = 100; Cliente titular; } Professor Dal Prá
  83. 83. Classes – Associação class Cliente { String nome; String CPF; boolean sexo; ContaBancaria conta; } Professor Dal Prá
  84. 84. Mudando nosso código class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); contaJunior.numero = 1143166; contaJunior.titular = new Cliente(); contaJunior.titular.nome = "José Dal Prá Junior"; contaJunior.saldo = 100.0; contaJunior.limiteCredito = 10.0; contaJunior.deposita(10); System.out.println(contaJunior.titular.nome); System.out.println(contaJunior.saldo); } } Professor Dal Prá
  85. 85. E se eu não criar um Cliente para a contaJunior? class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); contaJunior.numero = 1143166; // contaJunior.titular = new Cliente(); contaJunior.titular.nome = "José Dal Prá Junior"; contaJunior.saldo = 100.0; contaJunior.limiteCredito = 10.0; contaJunior.deposita(10); System.out.println(contaJunior.titular.nome); System.out.println(contaJunior.saldo); } } Professor Dal Prá
  86. 86. Classes – Atributos • Atributos do tipo “variável de referência” tem como valor default null – não está apontando para nenhum ponto da memória Professor Dal Prá
  87. 87. Classes – Associação class ContaBancaria { int numero; double saldo; double limiteCredito = 100; Cliente titular = new Cliente(); } Professor Dal Prá
  88. 88. Mudando nosso código class Programa { public static void main(String[] args) { ContaBancaria contaJunior = new ContaBancaria(); contaJunior.numero = 1143166; contaJunior.titular.nome = "José Dal Prá Junior"; contaJunior.saldo = 100.0; contaJunior.limiteCredito = 10.0; contaJunior.deposita(10); System.out.println(contaJunior.titular.nome); System.out.println(contaJunior.saldo); } } Professor Dal Prá
  89. 89. Comentários no código fonte • Lembre-se: o melhor comentário é o seu próprio código fonte – Se você precisar de comentários em quantidade exagerada, deve existir algum problema na implementação (código confuso) Professor Dal Prá
  90. 90. Comentários no código fonte // cometário de linha /* comentário de bloco */ /** Comentário de método, que pode gerar HTML com a documentação das classes */ Professor Dal Prá
  91. 91. Alguns exemplos de javadocs de frameworks http://docs.oracle.com/javase/6/docs/api/ http://docs.jboss.org/hibernate/orm/3.5/api/ http://static.springsource.org/spring/docs/3.0.x/javadoc-api/ http://joda-time.sourceforge.net/apidocs/index.html http://hc.apache.org/httpclient-3.x/apidocs/ Professor Dal Prá
  92. 92. Vamos documentar nosso código • Digitar documentação nos métodos feitos • Ver que o Eclipse mostrar esta documentação • Exportar documentação Professor Dal Prá
  93. 93. Ferramente UML • Jude Community • Instalar • Construir o Diagrama de Classes das classes que já abstraímos Professor Dal Prá
  94. 94. Exercícios 1. Modele um funcionário. Ele deve ter pelo menos o nome do funcionário, o departamento onde trabalha (String), seu salário (double), a data de entrada no banco (String), seu RG (String) e um valor booleano que indique se o funcionário está na empresa no momento ou se já foi embora. Você deve criar alguns métodos de acordo com sua necessidade. Além deles, crie um método bonifica que aumenta o salario do funcionário de acordo com o parâmetro passado como argumento. Crie, também, um método demite, que não recebe parâmetro algum, só modifica o valor booleano indicando que o funcionário não trabalha mais aqui. A idéia aqui é apenas modelar, isto é, só identifique que informações são importantes e o que um funcionário faz. Desenhe no Jude Community tudo o que um Funcionario tem e tudo que ele faz. Professor Dal Prá
  95. 95. Exercícios 2. Implemente o que foi definido no diagrama Dica: – – – – Crie a classe, compile Crie os atributos, compile Crie um método, compile Crie outro método, compile Professor Dal Prá
  96. 96. Exercícios 3. Crie uma classe TestaFuncionario, com um método main, para que possamos criar um objeto do tipo funcionário e testa-lo; Professor Dal Prá
  97. 97. Exercícios 4. Crie um método “mostra” para a classe Funcionario. Este método deverá imprimir uma mensagem de apresentação do funcionário com todas as informações que a classe armazena. Não será passado nenhum parâmetro para o método e não será necessário retornar nenhum valor. Professor Dal Prá
  98. 98. Exercícios 5. Dentro da classe para teste, crie pelo menos 3 funcionários, atribua valores para eles e execute pelo menos uma vez cada método. Professor Dal Prá
  99. 99. Bibliografia • Apostila – Capitulo 2 Professor Dal Prá
  100. 100. Mão na massa! https://gist.github.com/1391412

×