Fala aí galera, sou membro novo da equipe e esse aqui é o meu primeiro post no Blog da Lambda3. 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, func
. E executa a função func
com os argumentos int int
.
Se ainda faltam alguns conceitos de paradigma funcional, dê uma lida nos meus posts anteriores do meu blog Hackeando, sempre estou com esse tema em pauta. Vamos a prática:
- Crie um projeto novo no seu Visual Studio e dê um nome bacana. Dei o nome de AprendendoFunc, na minha opinião, objetivo.
- Segundo passo, vamos criar os Testes. Crie 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;
Parece muito aquela notação matemática de funções : f(x,y) = x + y.
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, ou boas, línguas que o F# tem um pézinho aí!
Agora vamos implementar nossa classe Calculadora, no Projeto Class library:
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. 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, é usado para verificações. 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. (Dica: Só usei comentários para ficar bem claro, evite isso no seu código)
Bom galera, por hoje é só, qualquer dúvida ou sugestão comente abaixo!
Abner Terribili
Sou programador estagiário na Lambda3. Curto muito desenvolvimento, já trabalhei com Java, Delphi e tenho projetos pessoais que baseiam-se em aplicações para as plataformas Android, iOS e Web. Em tempo livre namoro muito, ando de longboard, faço trilhas, faço fotografias landscape, vou ao cinema, leio livros (na maior parte do tempo, técnicos) e toco guitarra. Atualmente estou estudando Desenvolvimento de Sistemas na FIAP.