[MÚSICA] [MÚSICA] Olá a todos. Eu sou Eduardo Guerra. Esse é o curso de Desenvolvimento Ágil com Padrões de Projetos e neste 'handzone' nós vamos mostrar o padrão 'Builder'. Mas não é só o Builder, é o Builder com monte de outros padrões juntos. Então a ideia é que a gente mostre aqui como o Builder pode encapsular essa ideia de você utilizar esse monte de padrões. Se você começa a usar proxies, strategies, template methods e etc., pode ficar uma estrutura muito complicada para a pessoa ter que conhecer todas estas classes e criar na mão. Então o Builder ajuda muito a encapsular a lógica de construção dessa estrutura. Então a gente vai ver aqui- obviamente o nosso exemplo é sempre simples, né e vai ser assim- geração de nome. Como é que vai ser a geração do nome? Então a ideia é a seguinte. Eu vou criar aqui objeto, vou criar aqui o meu objeto base, eu vou começar criando ele mesmo e depois a gente já cria os testes. Vai ser o 'GeradorNome', certo? Então eu vou vir aqui, 'public void', gerarNome, certo? E eu vou passar uma 'string' aqui, 'nomeBase', e ele vai simplesmente retornar esse 'nomeBase'. Esse aqui é a minha funcionalidade básica e aí a gente vai incrementando isso daqui. Opa, aqui tem que ser 'string'. Aí eu vou criar aqui agora o meu pacote de testes, é, opa. Eu tenho que criar primeiro o pacote de teste. Espera aí. Eu vou criar aqui o meu, cadê? Aqui. Meu Source Folder, vou chamar de 'Teste', okay, e vou criar aqui o TesteGeradorNome. É, cadê? TesteGeradorNome. Vou adicionar aqui o JUnit, que está pedindo. Então, eu vou colocar aqui primeiro o nome base. O que eu quero? Aqui eu vou estar usando Builder. Então eu vou vir aqui, quer ver, Gerador Nome, gn, é igual a GeradorNome Builder, vou dar 'new' aqui, GeradorNomeBuilder, ponto, gerar. Certo? Aí aqui eu vou dar gn.gerarNome, vou colocar aqui o meu primeiro nome, Eduardo e o resultado tem que ser Eduardo. É, vamos lá. [SEM SOM] Eu acho que eu vou colocar aqui, vou botar aqui primeiro aqui ponto, criarPessoa, ponto, gerar, certo? Então eu vou mandar gerarNome, né, e aí vou fazer o 'assert' aqui baixo. Então eu vou fazer aqui assertEquals, vou colocar aqui Eduardo, que é o que eu espero que ele retorne neste teste base aqui. Nome, okay. Então está faltando o Builder aqui, eu vou criar essa classe, ela vai ficar aqui no meu pacote de Source e eu tenho que criar aqui os métodos dela agora. Aqui, vou criarPessoa, ele vai retornar GeradorNomeBuilder, certo? Usando aí a ideia de interface fluente. E o gerar, ele, isso ele vai retornar GeradorNome. Muito bom. Então, vou salvar aqui, meu teste agora roda, só que a princípio ele deve dar NullPointerException. Vamos ver se confirma aqui. Isto, NullPointerException. Isso mesmo. Bom, vou fazer ele agora funcionar aqui para minha pessoa base. Então vou ter aqui GeradorNome, gn. Então, quando eu der criarPessoa, eu vou vir aqui e vou dar 'new', vou botar aqui, 'return this', que é ele mesmo. Eu vou fazer aqui 'gn', ele é igual a new, GeradorNome. Isso, muito bom. E aqui no meu 'gerar' eu vou retornar aquele 'gn' ali. Muito bom. Então, salvo aqui. Agora é para passar o teste. Agora funcionou. Vamos lá. Eu quero ao invés de criar uma pessoa, eu vou criar mestre e vou criar doutor. E para isso eu vou usar herança. Então 'criarMestre', Então ele tem que colocar aqui 'MestreEduardo", certo? E, vou colocar aqui 'mestre', e eu tenho que ter aqui também o 'criarDoutor'. [SEM SOM] Então vou salvar aqui. Eu preciso destes dois métodos lá. 'criarMestre', opa, e 'criarDoutor'. Muito bem. Bom, aqui o quê que eu vou usar? Eu vou criar aqui, e aí aqui ele tem colocar o 'Doutor'. O quê que eu vou fazer? Aqui no meu GeradorNome eu vou criar método, eu vou dar aqui 'get'Tratamento', certo? Vou colocar aqui espacinho e esse 'getTratamento' vai ser método que eu vou usar como 'hook'. A princípio- hum, eu não vou botar este espaço aqui não. Vou botar este espaço no retorno do 'Tratamento'. Então esse cara aqui, a princípio, vai ser Book Method. Aí, aqui no meu GeradorNome, eu vou ter aqui New, Class, eu vou chamar de GeradorMestre. Ele vai ter a superclasse dele, vai ser o GeradorNome, certo? Eu vou vir aqui, vou pedir para ele implementar o Hook Method. Então, Source, Override/Implement Methods, eu quero não é o gerador não. Será que está como privado? Está como privado, vou colocar como 'protected'. Sim. Agora eu consigo. Source, Override/Implement Methods, agora sim. 'getTratamento', eu vou retornar aqui o 'Mestre'. Então 'Mestre' com espacinho, certo? Salvo aqui. Qual o problema aqui? Tem que salvar tudo. Agora foi. E aí eu vou botar aqui o 'geradorDoutor'. New, Class, 'GeradorDoutor', Vou colocar aqui a superclasse vai ser o gerador nome, Finish. A mesma coisa eu vou fazer lá, Source. Generate. Override/Implement Methods. GetTratamento, aqui eu vou dar Return Doutor. [SEM_ÁUDIO] Então o que eu vou fazer? Lá no meu builder eu vou, na hora que eu for criar o mestre é sempre o Return This para eu poder chamar vários métodos sequência. Então aqui eu vou colocar o gn igual a new doutor, aqui é o mestre, né? Então, eu vou criar aqui o new gerador mestre. Certo? E aqui, olha, vou criar doutor, vai ser o new Gerador doutor. Será que vai funcionar lá o teste? Note que aqui eu já estou usando herança, olha. E aqui no teste, que seria quem está utilizando, ele só tem ciência aqui do buider. Então eu rodo aqui, olha. Muito bom. Excelente. Bom, o que eu vou fazer agora? Eu vou ter aqui tratamento também, né? Para falar magnifico, excelentíssimo, uma coisa assim. Então eu vou colocar aqui, olha. [SEM_ÁUDIO] Vou chamar aqui de excelentíssimoDoutor. Eu vou botar aqui, criarDoutor excelentíssimo, gerar. Eu quero que aqui ele vai imprimir excelentíssimo, Doutor Eduardo. Então vamos ver como é que seria isso aqui. Esse cara aqui eu quero criar como strapped dentro aqui do meu GeradorNome. Então eu vou ter aqui botar aqui, olha. Private, Tratamento. Tratamento. Botar aqui, vai ser tratamento, tudo tratamento. Esse cara vai ser strapped, né? E eu vou poder aqui, olha. Vou ter aqui Source, Generate Getters and Setters para o Tratamento. Muito bom. Bom, esse cara aqui, olha. Vou clicar aqui e vou criar uma interface para ele. Então esse cara aqui vai ter public, string, tratar. Está bom, né? Nada a ver tratar, mas vai ser assim mesmo Está certo. Então aqui, o que vai acontecer? No meu... estou até meio perdido aqui. Gerador Nome, né? Antes aqui do getTratamento, que é hook method, eu vou chamar tratamento.tratar. Certo? E vou dar o mais ali. Ok? Então eu vou ter aqui, olha, uma classe aqui. Que eu vou implementar, então aqui ilustrando excelentíssimo, ele vai ter a interface tratamento, certo? Aí o tratar dele vai retornar aqui o excelentíssimo. [SEM_ÁUDIO] Ok? Então aqui no meu builder, olha. Cadê o builder? Eu vou quando eu botar o excelentíssimo, eu vou vir aqui,e vou fazer o seguinte, olha. Gn.setTratamento, new Excelentíssimo, Muito bom. E aqui o return this. Certo. Será que vai dar certo? Bom, eu vou rodar aqui o teste. O excelentíssimo deu certo, mas os outros deram errado. Por quê? Está dando Null Pointer onde? Aqui, no meu tratar aqui, esse cara está null. O que eu posso utilizar ali? Fazer if null? De forma nenhuma. Vamos criar new object aqui, olha. Então vamos fazer aqui NullTratamento. Ok. Vamos... não. New NullTratamento. Agora sim. Criar essa classe. Olha, ele já sabe ali que tem que ter a interface. E aqui no método tratar eu simplesmente retorno nada. Será que agora vai dar certo? Nada que new object não resolva, sem precisar botar if. Olha, que maravilha. Será que eu consigo criar uma outra composição aqui? Cadê o meu teste? Aqui, olha. Vamos colocar aqui o magnífico mestre, magnífico, mestre. Então aqui vai ser criarMestre. Certo? Aqui vai ser, olha. Magnifico.gerar. Então vai ser o magnifico mestre Eduardo. Magnifico mestre. Quem vir essa aula deve achar que eu estou me achando aqui, né? Botando esse monte de nome. Certo? Então vou vir aqui, olha. [INCOMPREENSÍVEL] o tratamento, né? New Magnifico ficou "megnífico". Magnífico, não existe essa classe ainda. Eu vou clicar aqui, e vou criar a classe Magnifico. A gente já sabe que é do tipo tratamento. Eu vou colocar aqui, olha. Magnifico, e o espaço. Salvo aqui. Vamos ver se vai rolar. Pausa aqui, olha, funcionou beleza. Bom, vou fazer uma pausa aqui. Certo? E no segundo vídeo, eu termino aqui e vamos colocar aqui composite, proxy, para a gente ver como fica essa história aí. Certo? Até a segunda parte do vídeo. [MÚSICA]