Seguindo os posts atuais sobre C#, em uma das minhas aulas com o Jonas, descobri uma das maravilhas de C# e seu "pequeno" suporte a programação funcional.
Hoje faremos algo bem prático. Vamos criar um exemplo genérico de um método que recebe três parametros, sendo eles: int, int, função.
Comecei hoje a leitura de um livro muito bacana: Código Limpo - Robert C. Martin. (Que já me proíbe a criação de uma função que recebe três parâmetros, mas vamos relevar isso rs) Parece muito bom, como o nome diz é um livro que através da pratica deliberada, nos "promete" o conhecimento para distinguir um bom código de um código ruim, digo isso como dica a todos vocês leitores, e que também é mais uma das minhas lições no desenvolvimento de software. (E o VIM galera, estão usando?)
Se ainda faltam alguns conceitos de paradigma funcional, dê uma lida nos meus posts anteriores, sempre estou com esse tema em pauta.
Vamos a prática.
Crie um projeto novo no seu Visual Studio e dê um nome bacana e objetivo.
Dei o nome de AprendendoFunc, na minha opinião, objetivo.
Segundo passo, vamos criar os Testes:
Cria uma nova Solution, dentro dela crie um projeto Class library e outro Projeto de Test Unit. Então a primeira coisa que vamos testar é uma possível soma entre dois números:
...
[TestMethod]
public void DeveSomarDoisNumeros()
{
Func<int, int, int> funcaoSoma = (x, y) => x + y;
Assert.AreEqual(120, new Calculadora().Calcula(60, 60, funcaoSoma));
}
Claro que nosso teste apresentará alguns erros, porém com ele já sabemos qual o nosso objetivo.
Nossa classe Calculadora, deve possuir um método que recebe 3 parâmetros. A função acima (funcaoSoma) é uma função que vem lá da matemática, entenda:
Func<parametro, parametro, tipoRetorno> nomeFuncao = (parametro, parametro) => funcao;
Ficou simples de entender, certo? Passamos dois números inteiros e recebemos o resultado da operação da função passada, isso é incrivel! Dizem as más linguas, ou boas, que o F# tem um pézinho aí!
Agora vamos implementar nossa classe Calculadora:
...
public class Calculadora()
{
public int Calcula(int primeiroNumero, int segundoNumero, Func<int, int, int> funcao)
{
return funcao(primeiroNumero, segundoNumero);
}
}
Pronto, nossa Calculadora está pronta para receber os parâmetros corretos. Agora rode seus testes e assegure-se do resultado estar correto.
Feito isso, crie mais um método de teste que deve executar a multiplicação de dois números. É muito fácil né?
Bom, e se precisarmos fazer algum tipo de comparação? Um exemplo prático, ao tentar dividir o primeiroNumero pelo segundoNumero, poderemos encontrar um problema caso segundoNumero = 0, para evitar isso, podemos criar mais um método:
public class Calculadora(){
...
public int VerificaECalcula(int primeiroNumero, int segundoNumero, Predicated<int> verificacao, Func<int, int, int> funcao)
{
if(verificacao(primeiroNumero, segundoNumero)
return funcao(primeiroNumero, segundoNumero);
return 0;
}
}
Entenda: Predicated recebe apenas um parâmetro e retorna um booleano, é amplamente usado para verificações, acredite. Temos também o Action, que é void, mas não é útil no nosso exemplo.
Vamos ao teste?
...
[TestMethod]
public void DeveCalcularDivisaoComVerificacao()
{
// Aqui podemos fazer as três etapas em uma só linha: Setup, Execução e Verificação
Assert.AreEqual(0, new Calculadora().VerificaECalcula(100, 0, (y) => y > 0, (x, y) => x / y));
}
Pronto, assim podemos passar a função de verificação e ainda a função de execução, isso sim é incrível.
Bom galera, por hoje é só, qualquer dúvida email-me: abner.terribili@lambda3.com.br ou comente abaixo!
Nenhum comentário:
Postar um comentário