[MÚSICA] Este é o curso de Orientação a Objetos com Java. Meu nome é Eduardo Guerra e hoje vamos falar de assunto extremamente importante que é como você pensar nos métodos orientados ao objeto, tá? Na última aula a gente falou aà sobre métodos estáticos, sobre aquela ideia da programação estruturada, né, e hoje o objetivo dessa aula é mostrar como que você pensa nos métodos, como que você cria os métodos segundo uma modelagem orientada a objetos. Então eu vou voltar aqui slide que a gente colocou na última aula, que é a gente pensando aà estruturado, né,? A gente pensa estar passando tudo como parâmetro e enquanto a gente está pensando orientado a objeto, a gente pensa invocar o método no objeto, né? E aà esse método, ele vai estar trabalhando com a estrutura de dados interna do objeto, tá? Então vamos partir daqui e ver como que a gente cria métodos orientados a objeto. Então vamos começar aà com o que talvez a maioria esteja acostumada, que é com a programação estruturada, tá? Então na programação estruturada a gente tem funções que ela basicamente recebe parâmetro e vai estar retornando valor com base naquilo que recebeu. Então, por exemplo, se eu tenho que ordenar uma lista, essa lista, ela vai ser recebida como parâmetro e a função, ela vai trabalhar cima daquilo que ela recebeu. Na programação estruturada, a gente pode também ter variáveis globais ou variáveis que são acessÃveis dentro de determinado escopo, certo? Que a função também pode acessar, então, por exemplo, ao invés dessa lista ser passada como parâmetro, eu posso colocar essa lista, por exemplo numa determinada posição de memória e numa variável global ou de alguma outra forma e a função, ela ir nessa posição de memória para poder recuperar aquelas informações e estar trabalhando com elas. Já na programação orientada a objetos, como a gente viu, a gente tem uma classe, a partir dessa classe criamos objetos, já vimos aà os construtores, que a gente pode estar utilizando para passar parâmetros e parametrizar os objetos, tá? Isso significa que cada objeto pode ter as suas próprias informações. Então se eu tenho carro, ele pode ter a cor, ele pode ter a potência do motor, ele pode ter informações que vão influenciar no seu comportamento. Então não significa que todos os objetos de uma classe, eles vão funcionar exatamente da mesma forma. Porquê? Porque os dados desses objetos podem estar influenciando nesse comportamento, tá? E é pouquinho disso que a gente vai ver. O objeto, como a gente viu, ele tem as variáveis de instância dele, ele tem dados dentro dele. Como eu falei, o carro, ele pode ter ali a potência e ele pode ter, por exemplo, a eficiência de freio, pode ter, sei lá, o atrito do pneu, então ele pode ter uma série de fatores que vão estar influenciando no comportamento, por exemplo, da aceleração e da frenagem. De repente o peso do carro, a carga que ele está levando. Tudo isso pode ter influência nesses métodos. E aà o que é que acontece? Quando a gente pode chamar método, esse método pode receber parâmetro. Vamos supor que método de acelerar no carro, ele pode por exemplo, estar recebendo ali, por exemplo, o tempo que o cara pisou no acelerador ou pode, sei lá, o quanto ele pisou no acelerador, né? Então não precisa ser simplesmente acelerar. Ele pode também estar recebendo parâmetro de fora, tá? E o que é que ele vai fazer? Ele vai pegar esses parâmetros. Ele vai pegar informações internas para poder fazer aquele processamento, tá? Então o objeto, ele não é igual ali na função, que era a função, ela tinha o que ela estava recebendo como parâmetro e podia acessar aqueles dados globais. O objeto, ele tem estado interno e normalmente ele vai utilizar informações desse estado interno para poder realizar o seu processamento. Vamos ver exemplo aqui para ficar bem claro isso daÃ? Imagina, por exemplo, uma classe carrinho, que esteja aÃ, que represente aà carrinho de compras, por exemplo de e-commerce, alguma coisa desse tipo e aà eu vou perguntar, por exemplo, para esse carrinho qual que é o valor total dele. Como que ele vai me responder isso? Ele vai me responder com base nas informações internas dele, que é, por exemplo, uma lista de produtos que ele vai ter ali dentro dele, tá? Então ele, por exemplo, vai lá cada produto, vai ver a quantidade, vai ver o preço individual e vai realizar as contas para somar isso daà e me retornar o total. Agora imagina, por exemplo, que eu vou para o meu carrinho e pergunto qual que é o valor do frete. E de repente ele fala assim: "mas espera aÃ, esse carrinho aÃ, ele não tem a informação do endereço. como é que eu vou saber calcular o frete se eu não tenho o endereço?" O endereço, ele não faz, ele faz parte do escopo, sei lá, da compra que o cara está fazendo, mas ele não faz parte do carrinho, que é onde eu estou simplesmente colocando meus produtos. Como que eu faço para o carrinho calcular o frete, então, se ele não tem o endereço? Eu posso passar o endereço como parâmetro. Então eu posso pensar no meu objeto da seguinte forma: olha, para realizar determinado processamento, aquelas informações que ele tem internas, ele vai utilizar aquelas informações, no caso, por exemplo, para calcular o frete, ele precisa saber o volume, ele precisa saber o peso das coisas que estão no carrinho, mas ele precisa também saber o endereço. E aà ele pode, por exemplo, estar recebendo aquele endereço como parâmetro e aà se a gente pensar termos de sistema, a gente pode, por exemplo, ter uma classe compra. Essa classe compra, dentro dela, ela tem o carrinho que fez parte da compra, ela tem o endereço do comprador, e aÃ, para essa classe compra, eu posso ter método para o cálculo do frete, para saber o valor do frete, sem passar parâmetro nenhum, porque ela pode ir lá, pegar o seu endereço. Ela vai lá, pega o seu carrinho e aà passa o endereço para o carrinho perguntando qual que vai ser o frete. Então eu posso ter, digamos assim, não seria o mesmo método, mas seria o método de cálculo de frete, ele pode estar diferentes classes, com escopos diferentes. Enquanto, por exemplo, na classe compra ela tem todas as informações, eu posso simplesmente perguntar qual é o frete? Na classe do carrinho eu posso perguntar para ela qual que é o frete, mas eu preciso passar o endereço para ela, porque o endereço não faz parte do escopo daquela classe, certo? Então sempre que você pensar métodos de objeto, você tem que pensar que informações fazem parte do escopo daquele objeto e que informações não fazem e que são necessárias para que eu possa passar essas informações como parâmetro. Então, toda vez que você pensar num método, você tem que avaliar quais os dados que fazem parte do escopo daquela classe. Se de repente você falar assim: "bom, o endereço, ele não faz parte do meu carrinho, tá?" Então, siga com isso, tá? Não force colocar uma informação dentro da classe ou objeto porque você vai precisar para cálculo. O que for de fora, você passa como parâmetro. De repente, pode ser que num escopo maior, como no caso do nosso exemplo foi o caso da classe compra, eu tenha todas essas informações e tenha, digamos assim, uma outra versão desse método onde eu não preciso passar as informações. Onde elas já estão todas dentro da classe. Mas aÃ, por exemplo, a gente observa que por exemplo, a classe compra ela não vai implementar aquele método de novo. Ela simplesmente vai pegar as informações que ela tem e vai delegar parte daquela execução para o objeto carrinho que está dentro dela, tá? Mais uma vez a gente volta naquela questão da colaboração das classes para criar as funcionalidades. Olha, a minha experiência é que muitas vezes é difÃcil você acertar nas primeiras vezes, mas com essas dicas aÃ, eu tenho certeza que vocês, aos pouquinhos, vão pegando o jeito de como criar e dividir, criar esses métodos e dividir a funcionalidade entre as classes. Com isso daÃ, eu espero que vocês já consigam pensar melhor métodos orientados a objetos e consigam pensar melhor quais informações estão dentro da classe, quais vão vir de parâmetros para poder criar sistema orientado a objetos. Muito obrigado por assistir à aula. [MÚSICA]