[MÚSICA] [MÚSICA] Olá! Bem vindo ao curso de Desenvolvimento Ágil com Padrões de Projeto. Eu sou o Clovis Fernandes e hoje iremos trabalhar com uma coisa muito interessante. Como é que a gente representa o nada, o nulo? Nós vamos mostrar, ao final desta aula, você aprenderá que ao usar o padrão "Null Object", Objeto Nulo, você estará produzindo código mais melhorado, código bem estruturado, fácil para manter, sem problemas, que usualmente ocorrem com o uso do nulo. No nosso exemplo, vamos mostrar carrinho de compras, muito usual sites, você tem carrinho e vai colocando itens. Você vai atribuir esse carrinho a determinado usuário, ele vai colocando os itens lá dentro, e no final vai ter total de quanto custa esse carrinho. Na parte de cima, nós estamos mostrando exemplo que eu estou de alguma maneira, algum momento, eu criei algum carrinho. Eu o coloquei, eventualmente, como nulo, que ainda não feito uma atribuição de carrinho real para algum determinado usuário, e aí eu estou testando o nulo. Eu estou testando o nulo porque eu estou querendo obter o total, se o carrinho é nulo o total é zero. Na parte de baixo, querendo verificar, por exemplo, quem é o usuário do carrinho. Eu recebi como parâmetro objeto carrinho, que ele pode ser nulo. Então, o que a gente chama de programação defensiva, eu vou testar, perguntar se esse carrinho é nulo, por que se for nulo, no caso do nome, eu vou querer que "Link" para ele fazer o "Login" e se inscrever no site, para que eu possa obter o nome dele. Caso contrário, o carrinho já foi criado, quando ele é criado é associado a usuário, então eu simplesmente devolvo esse usuário do carrinho. Nos dois, nós estamos fazendo esse teste do nulo. Neste outro exemplo, nós estamos querendo saber se o dado carrinho vai ter desconto ou não. Então eu faço o parâmetro carrinho, e aí eu pergunto se o carrinho é nulo, e se for nulo, eu vou voltar falso, não tem desconto nenhum. Caso contrário, eu vou examinar quantos itens tem no carrinho, e se for de zero a nove, também volta falso, não tem desconto algum. Se for maior ou igual a dez, aí começa a ter desconto. Nós estamos usando aqui, de novo, uma coisa que vai aparecer bastante, é como se fosse uma assombração que aparece no código inteiro, e isso não é uma coisa boa. Então surge a pergunta, como representar de uma maneira boa, que não cause problema, algo que não existe? Vamos notar, na maioria dos casos que é parecido com isso que a gente está mostrando aqui, que o carrinho, nós vamos criar carrinho nulo, esse carrinho nulo, ele é muito parecido com os carrinhos de promoção especial, carrinho digital, ou seja, ele vai ser carrinho especial. A ideia então é você criar uma subclasse, o carrinho promocional e o carrinho digital já são uma subclasse de carrinho, sempre o objeto nulo vai ser uma subclasse daquela classe que ele quer representar essa coisa nula. Então, o carrinho nulo, ele vai representar carrinho que não tem item nenhum ainda, cujo o valor é zero, a diferença do carrinho normal que já tem ou é associado a usuário, o carrinho aqui, não é associado a usuário mas ele vai ser associado a "link" para que a pessoa entre no site. Aqui eu estou mostrando isso "Java", isso que eu falei "Java". O carrinho nulo é subclasse de carrinho, se eu for obter os itens desse carrinho nulo, eu volto uma lista de itens vazia. eu crio uma lista de itens vazia, volto isso. Se eu vou obter quem é o usuário, aí eu volto o "Link" para ser clicado pelo o usuário. E o total eu volto zero, que é o equivalente a carrinho vazio, que é o que está mostrando aqui. Ou seja, o total volta zero. Vamos examinar agora aqueles três exemplos que eu mostrei, usando o nulo, e vamos fazer uma refatoração. Lembram da refatoração? Usamos sempre aqui. Mesmo que você tenha usado o nulo, é só refatorar e você elimina o nulo. O ideal é sabendo como proceder, nem vai depois precisar fazer essa refatoração, você já vai construir usando o padrão objeto nulo, o "Null Object". Então nesse exemplo, veja que eu tenho lá, eu estou perguntando se é nulo, se for nulo, volta falso. O que eu estou querendo é ver se eu vou dar desconto ou não. Está certo? O código embaixo, vocês percebam que eu não preciso mais testar o nulo, porque suponha que o parâmetro corresponda a carrinho nulo, quando eu obtenho o número de itens, vai voltar que é zero, está certo? O "size" da "Relist" que eu estava usando, ela vai voltar zero, então vai voltar falso. Se o número de itens, também, do carrinho for carrinho já real associado a usuário, for menor do que dez, também vai voltar falso. Se for igual a dez, pronto, vai voltar verdadeiro e o desconto pode ser aplicado, naquele exemplo que eu dei do total, está certo?! Se o total, ao invés de testar o nulo lá cima, eu estou voltando objeto nulo que ao responder o total, que era objeto nulo, ele volta com zero, pronto, satisfez, não tem problema algum, automaticamente, de uma maneira assim transparante, aconteceu. Nesse outro exemplo, eu estou voltando, o nulo está testando se for nulo, vai voltar "link' para o usuário clicar na parte debaixo. Refatorando, eu não preciso de nada disso se for objeto nulo que eu passei como parâmetro, que eu estou usando. Porque ele vai voltar ao pedir qual é o usuário e o objeto for carrinho nulo, ele vai voltar que é para clicar no "link" no qual o usuário vai ter que clicar, se não for, vai voltar qual é o usuário. Maneira limpa, o código fica muito mais limpo. Olha aí gente! Onde que tem nulo aqui? Nenhum lugar, normalmente você não vai mais precisar usar nulo nenhum lugar. Por quê? Você vai começar a evitar criar valores nulo, para começo de conversa, então vez de colocar carrinho inicialmente nulo, você já põe carrinho, "Carrinho Nulo", objeto carrinho nulo, pronto. Ou seja, você sempre vai instanciar o "Null Object", correspondente àquela classe. Tranquilo isso. Agora se você precisar, de alguma maneira, testar se o carrinho é nulo; pode acontecer uma determinada lógica que você precise testar se aquela classe nula, aquele objeto é nulo ou não, mas nulo como no nosso exemplo aqui, carrinho nulo; então você faz "Equals" daquele objeto "CR" com objeto Carrinho Nulo, pronto, está resolvido também. Mas isso vai ser raro aparecer. Com isso, vocês viram que nós não precisamos usar o nulo nenhum lugar. Nós conseguimos apresentar padrão que organiza isso, ele não faz parte da gangue dos quatro, que a gente chamou de "GOF", Gang of Four, não faz parte, ele está fora. Mas ele é padrão muito importante, tão importante que quando fez uma revisão vinte anos depois dos seus padrões, disseram que tinham se arrependido, que deveriam ter colocado o "Null Object", por isso que ele está aqui no nosso curso. Obrigado! [MÚSICA] [MÚSICA]