Olá. Meu nome é Leonardo Leite, eu sou desenvolvedor de software no Serpro, que é a empresa estatal que desenvolve sistemas de software para o Governo Federal, e eu estou também concluindo o meu doutorado Ciências da Computação na Universidade Federal de São Paulo. E nesse próximo vÃdeo eu vou mostrar alguns exemplos de padrões de projeto, os design patterns, sistemas do Serpro; isso para mostrar que os design patterns também existem no mundo real e que são bem úteis e importantes. Então vamos lá. O primeiro exemplo vai utilizar o padrão template method, isso uma biblioteca chamada fatiador. Então primeiro, brevemente, o contexto para entender o que é o fatiador. O Serpro tem parque tecnológico bem heterogêneo, então nós temos sistemas de Java e tem sistemas com tecnologias mais antigas, como o Mainframe. E o que acontece? Hoje dia, quando os sistemas máquinas diferentes vão trocar informações, vão trocar dados, o comum é utilizar formatos de dados como o XML ou o JSON. Então eu tenho aqui exemplo de JSON. O que acontece? A gente tem aqui sendo transmitidos dados sobre livro, então tem aqui o tÃtulo, temos aqui campo, e aà no campo você tem o nome do campo e o valor do campo, então o nome do campo é "tÃtulo" e o valor é "War and Peace". Aà você tem outro campo cujo nome é "autor", ou inglês "author", e o valor é o autor do livro, que é o Leo Tolstoy. Os sistemas Mainframe não sabem lidar bem com esse tipo de dado estruturado que é com a JSON e nem o XML; eles usam outro esquema que são as strings posicionais, ou inglês flat string. Então esse aqui é exemplo. Nesse caso, os nomes dos campos são implÃcitos, então tem uma convenção que é a seguinte nesse exemplo: as 15 primeiras posições são o tÃtulo do livro, e as dez posições seguintes é o autor do livro; então tanto o transmissor quanto o receptor têm que estar cientes dessa estrutura que é pré-combinada. E aà onde que entra o fatiador? As bibliotecas Java, os arcabouços, os frameworks Java, eles sabem lidar bem com o JSON e com o XML, mas o mundo Java não conhece tão bem essas strings posicionais, e a gente tem casos bem complexos delas, com listas cujo conteúdo é estruturado, então o fatiador, a biblioteca, foi criada para ajudar o sistema Java a entender as strings posicionais. Então, bem objetivamente, o fatiador é capaz de converter as strings posicionais objetos Java e vice-versa, objetos Java strings posicionais. O sistema Java quer ouvir, receber uma mensagem do Mainframe, vai converter a string posicional objeto Java. O sistema Java quer conversar, quer falar algo com o Mainframe, então vai usar o fatiador para converter o objeto Java string posicional, e aà o sistema Java transmite essa string posicional para o Mainframe. Aqui é o ponto de vista do usuário da biblioteca que está lá fazendo o programador Java; nesse exemplo aqui a gente está mexendo com strings posicionais que representam livros, que têm tÃtulo e autor. Então o usuário aqui, o programador, definiu uma string posicional, que é a mesma do exemplo, e ele vai usar uma classe, que é da biblioteca, que é o FlatParser; e quando ele cria FlatParser, que é capaz de fazer a conversão de string posicional objeto Java, o programador tem que contar qual que é a estrutura do livro, aquela convenção, então nessa estrutura está falando aqui que você tem dois campos, as 15 primeiras posições é campo que é o tÃtulo e as outras 15 posições são o autor. Beleza? Definiu o parser, que está atrelado a uma determinada estrutura, que no caso é uma estrutura de livro, agora é hora da ação. Então o programador chama o método parse, fornecendo string posicional, e aà a biblioteca faz a conversão e devolve objeto do tipo livro, que foi a classe especificada criada pelo programador. Dependendo do caso de uso, pode ser que vez de o programador definir tipo que ele mesmo criou, como book ou, por exemplo, a classe veÃculo, e por aà vai, pode ser que seja o suficiente receber mapa do Java, map que é uma coleção de chaves e valores. Então aqui ele vai usar uma outra classe do fatiador, que é o MapFlatParser, vai chamar o método parse, vez de ganhar objeto book, aqui ele está ganhando mapa, que vai ter no caso aqui dois pares de chave e valor: o primeiro par a chave é "title" e o valor é, por exemplo, "War and Peace", e o segundo par de chave e valor tem a chave "author" e o valor "Leo Tolstoy", que é o autor do livro. E agora então como implementar isso? Qual que é a questão? A questão é que a gente precisa de dois algoritmos: algoritmo que converte a string posicional objeto customizado, como o book; e outro algoritmo que converte a string posicional mapa do Java. Então esses dois algoritmos têm coisas diferentes, mas têm muito comum; toda a parte de pegar string posicional, pegar a estrutura que foi definida, a estrutura do livro, fatiar, analisar esse string para saber qual parte da string e qual valor tem que ir para onde, tudo isso é igual. E a gente não quer copiar, a gente não quer duplicar esse código, então para evitar essa duplicação a gente vai estar usando aqui design pattern que é o template method, que basicamente é o seguinte: todo código comum, a lógica comum, que é a do fatiamento, fica uma classe abstrata; e o que é especÃfico fica classes concretas diferentes, onde cada uma dessas classes concretas implementam a classe abstrata. Então vamos mostrar para ficar mais claro. Começando com a classe abstrata. A classe abstrata, como ela tem que fatiar a string posicional, ela recebe aqui a estrutura da string, o flat structure, e vai fatiar aqui com o método público, que é o método parse. Aqui é a implementação do método parse. E conforme ele vai fazendo aqui a lógica de fatiamento, determinados momentos ele vai ter que tomar certas atitudes que são especÃficas. Esse initializeBean é para inicializar o objeto que vai ser retornado; se for mapa vai ser de jeito, se for uma classe customizada como o book, vai ser de outro. Descobri aqui que o nome do livro é War and Peace, então eu preciso atribuir esse valor no objeto de saÃda. Como que eu vou atribuir esse valor? Depende; se for mapa vai ser de jeito, se for uma classe especÃfica do usuário, uma classe customizada, vai ser de outro jeito. Então essas coisas que variam a lógica geral, a lógica abstrata aqui, que tem bastante código, chama métodos abstratos, que são definidos na classe abstrata, que é quando a lógica abstrata não sabe como é que faz. "Vou inicializar o Bean, não sei fazer", então eu chamo método abstrato, depois a classe concreta define. "Vou atribuir o valor", então vou chamar aqui o método setValue. "Não sei fazer isso", então vou chamar o método abstrato, depois a classe concreta define como é. Então agora a gente pode partir para as classes concretas. O primeiro exemplo aqui é a classe que vai gerar como saÃda map. Então na hora de inicializar o objeto de retorno, basta dar new uma classe concreta do Java, como a LinkedHashMap, que implementa a interface map. Chegou a hora de atribuir valor, descobrir que o autor do livro é o Leo Tolstoy, então a classe abstrata vai chamar esse método setValue, e o que esse método vai fazer? Vai pegar o mapa que foi instanciado aqui cima, vai chamar o método put, definindo novo par de chave e valor; então aqui na chave vai passar a string author, e aqui na string do valor vai passar o autor questão, por exemplo o Leo Tolstoy. Então essa aqui é uma especialização. Outra especialização da classe abstrata, outra implementação, é a que não devolve mapa, é a que devolve tipo T que é definido pelo usuário; então o usuário da biblioteca quando instancia esse parser, ele informa aqui qual que é a classe que vai ser gerada, por exemplo a classe book. E aà essa classe é pouco mais complicada, porque vai usar API de reflexão do Java para conseguir criar esse objeto, porque notem que o autor da biblioteca não sabe que a classe book existe, é uma classe que o usuário da biblioteca vai usar, então vai ter que usar recursos de reflexão, da API de reflexão do Java, como esse newInstance aqui, por exemplo também esse getDeclaredField, para ter acesso ao atributo e, na hora de atribuir o valor, poder acessar o atributo author e setar nesse atributo author como valor a string Leo Tolstoy, por exemplo. Então a moral da história desse padrão é que a gente quer evitar uma replicação, uma duplicação de código complexo. Claro que tem várias formas de fazer isso, mas o template method fornece uma estratégia. E o ponto importante, porque a orientação de objetos está aà para ajudar, é evitar cenário que você tenha código grande e complexo duplicado, e esse código vai evoluir no futuro para atender novas necessidades, e se a gente não tiver o código duplicado, vai evitar que o programador lá na frente mude lugar e esqueça de mexer no outro. Como é que ele vai mexer e de repente lembrar? Pode esquecer e aà o sistema não vai mais se comportar da maneira esperada. Então é isso, vamos lá para o próximo vÃdeo para ver outros exemplos de padrões de projeto. Vamos lá. Valeu.