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.