Encontre milhões de e-books, audiobooks e muito mais com um período de teste gratuito

Apenas $11.99/mês após o término do seu período de teste gratuito. Cancele a qualquer momento.

Funcional C #
Funcional C #
Funcional C #
E-book631 páginas3 horas

Funcional C #

Nota: 0 de 5 estrelas

()

Ler a amostra

Sobre este e-book

Características principais Este livro enfoca o paradigma funcional do C#, que lhe dará um novo ângulo de codificação com C# Ele ilustra as vantagens que a programação funcional traz para a mesa e os benefícios de codificação associados Este guia prático cobre todos os aspectos da programação funcional e fornece soluções que podem ser aplicadas em cenários de negócios Descrição do livro A programação funcional torna seu aplicativo mais rápido, melhora o desempenho e aumenta sua produtividade. O código C# é escrito em um nível mais alto de abstração, de modo que o código esteja mais próximo dos requisitos de negócios, abstraindo muitos detalhes de implementação de baixo nível. Este livro preenche a lacuna de linguagem para desenvolvedores C#, mostrando como criar e consumir construções funcionais em C#. Também preenchemos a lacuna de domínio mostrando como as construções funcionais podem ser aplicadas em cenários de negócios. Vamos levá-lo através de expressões lambda e métodos de extensão e ajudá-lo a desenvolver uma compreensão profunda dos conceitos e práticas de LINQ e recursão em C#. Ao final do livro, você será capaz de escrever código usando a melhor abordagem e será capaz de realizar testes de unidade em programação funcional, mudando a forma como você escreve seus aplicativos e revolucionando seus projetos. O que você vai aprender Desenvolva um aplicativo usando a abordagem funcional Implemente o teste de unidade para programar o código funcionalmente Crie código eficiente usando programação funcional Trabalhe por meio de uma consulta LINQ para poder trabalhar com dados Compor programas assíncronos para criar um aplicativo responsivo Use recursão na programação de funções para simplificar o código Otimize o código do programa
IdiomaPortuguês
Data de lançamento12 de dez. de 2022
Funcional C #

Leia mais títulos de Jideon Francisco Marques

Relacionado a Funcional C #

Ebooks relacionados

Inteligência Artificial (IA) e Semântica para você

Visualizar mais

Artigos relacionados

Avaliações de Funcional C #

Nota: 0 de 5 estrelas
0 notas

0 avaliação0 avaliação

O que você achou?

Toque para dar uma nota

A avaliação deve ter pelo menos 10 palavras

    Pré-visualização do livro

    Funcional C # - Jideon Francisco Marques

    Funcional C #


    Descubra os segredos da programação funcional usando C# e mude para sempre a maneira como você aborda seus aplicativos

    Por Jideon F. Marques

    © Copyright 2022 Jideon Marques - Todos os direitos reservados.

    O conteúdo deste ebook não pode ser reproduzido, duplicado ou transmitido sem permissão direta por escrito do autor ou do editor.

    Sob nenhuma circunstância qualquer culpa ou responsabilidade legal será imputada ao editor, ou autor, por quaisquer danos, reparações ou perdas monetárias devido às informações contidas neste ebook, direta ou indiretamente.

    Notícia legal:

    Este ebook é protegido por direitos autorais. É apenas para uso pessoal. Você não pode alterar, distribuir, vender, usar, citar ou parafrasear qualquer parte ou o conteúdo deste ebook sem o consentimento do autor ou editor.

    Aviso de isenção de responsabilidade:

    Observe que as informações contidas neste documento são apenas para fins educacionais e de entretenimento. Todo esforço foi feito para apresentar informações precisas, atualizadas, confiáveis e completas. Nenhuma garantia de qualquer tipo é declarada ou implícita. Os leitores reconhecem que o autor não está envolvido na prestação de aconselhamento jurídico, financeiro, médico ou profissional. O conteúdo deste ebook foi derivado de várias fontes. Consulte um profissional médico licenciado antes de tentar este programa ou qualquer técnica descrita neste ebook.

    Ao ler este documento, o leitor concorda que em nenhuma circunstância o autor é responsável por quaisquer lesões, morte, perdas, diretas ou indiretas, que sejam incorridas como resultado do uso das informações contidas neste documento, incluindo, mas não limitado a a, erros, omissões ou imprecisões.

    Índice

    Funcional C #

    Prefácio

    1. Experimentando o Estilo Funcional em C#

    Introdução à programação funcional

    Noções básicas sobre definições, scripts e sessões

    Usando substituição e simplificação para calcular a expressão

    Entendendo as funções usadas para programação funcional

    Formando a definição

    Escovando

    Comparação entre programação funcional e imperativa

    Preparando o compilador C#

    Conceitos de programação funcional

    Funções de primeira classe e de ordem superior

    tipos de função

    valores de função

    funções puras

    funções recursivas

    Sentindo-se funcional em C#

    Usando o conceito matemático para entender a abordagem funcional

    Aplicando tupla para C# funcional

    Curry em C#

    Pipelining

    encadeamento de métodos

    Transformando código imperativo em código funcional

    A abordagem do código imperativo

    A abordagem do código funcional

    O método GenerateOrderedList()

    O método Main()

    As vantagens e desvantagens da programação funcional

    Resumo

    2. Delegados passo a passo

    Apresentando delegados

    Delegados simples

    Delegados Multicast

    Usando os métodos Delegate.Combine() e Delegate.Remove()

    Usando os operadores += e -=

    Delegados integrados

    delegados genéricos

    Os delegados da Action e do Func

    Variação distintiva em delegados

    Covariância

    Contravariância

    Resumo

    3. Expressando métodos anônimos com expressões lambda

    Conhecendo métodos anônimos

    Criando métodos anônimos

    Usando um método anônimo como argumento

    Escrevendo métodos anônimos - algumas diretrizes

    Vantagens dos métodos anônimos

    expressões lambda

    Transformando um método anônimo em uma expressão lambda

    Criando um tipo delegado usando expressões lambda

    Árvores de expressão e expressões lambda

    Assinando eventos usando expressões lambda

    Usando a palavra-chave do evento

    Usando EventHandler ou EventHandler

    As vantagens de usar a expressão lambda na programação funcional

    Funções de primeira classe

    Fecho

    Resumo

    4. Estendendo a funcionalidade do objeto com métodos de extensão

    Aproximando-se dos métodos de extensão

    Criando um método de extensão

    Métodos de extensão no código IntelliSense

    Chamando métodos de extensão nos outros assemblies

    Fazendo referência a um namespace

    Pegando carona em um namespace

    Aproveitando a interface, a coleção e o objeto

    Estendendo a interface

    Estendendo a coleção

    Estendendo um objeto

    Vantagens de usar métodos de extensão na programação funcional

    Limitações do método de extensão

    Estendendo uma classe estática

    Modificando a implementação do método na classe ou tipo existente

    Resumo

    5. Consultando qualquer coleção facilmente com LINQ

    Introdução ao LINQ

    Adiando a execução do LINQ

    Escolhendo entre sintaxe fluente e sintaxe de expressão de consulta

    Compreendendo a sintaxe fluente do LINQ

    Compreendendo a sintaxe da expressão de consulta LINQ

    Enumerando operadores de consulta padrão

    Filtragem

    Projeção

    Juntando-se

    Encomenda

    Agrupamento

    A operação definida

    Métodos de conversão

    Operação do elemento

    Resumo

    6. Aprimorando a capacidade de resposta do programa funcional com programação assíncrona

    Construindo um aplicativo responsivo

    Executando um programa de forma síncrona

    Aplicando threads no programa

    Criando threads usando pool de threads

    O padrão de modelo de programação assíncrona

    Usando o método Read() síncrono

    Usando os métodos BeginRead() e EndRead()

    Adicionando LINQ à invocação do método BeginRead()

    O padrão assíncrono baseado em tarefa

    Apresentando as classes Task e Task

    Aplicando um modelo TAP simples

    Usando o método de extensão WhenAll()

    Envolvendo um APM em um modelo TAP

    Programação assíncrona com as palavras-chave async e await

    Funções assíncronas na programação funcional

    Resumo

    7. Recursão de Aprendizagem

    Explorando a recursão

    Funcionamento da rotina recursiva

    Refatorando uma iteração para a recursão

    Usando recursão de cauda

    Estilo de passe acumulador

    Estilo de passagem de continuação

    Recursão indireta sobre recursão direta

    Recursão em uma abordagem funcional usando LINQ Aggregate

    Explorando o método Aggregate

    Resumo

    8. Otimizando o código usando técnicas de preguiça e cache

    Introdução à preguiça

    Enumeração preguiçosa

    Avaliação preguiçosa

    Avaliação não estrita

    Inicialização preguiçosa

    As vantagens e desvantagens de ser preguiçoso

    Cacheando recursos caros

    Executando o cálculo inicial

    Memorização

    Resumo

    9. Trabalhando com padrão

    Dissecando correspondência de padrões em programação funcional

    Transformando dados usando correspondência de padrões

    Alternando para correspondência de padrão

    Simplificando a correspondência de padrões

    Dando as boas-vindas ao recurso de correspondência de padrões no C# 7

    Apresentando o Monad como um padrão de design

    Criando o tipo Monádico M

    Implementando o tipo de dados genérico para Monad

    Implementando Monad para Lazy e Task

    Regras do padrão Mônada

    Resumo

    10. Executando uma ação na programação funcional C#

    Desenvolvendo programação funcional em Windows Forms

    Criando o código por trás de um formulário

    Criando o código do mecanismo em uma abordagem imperativa

    Preparando as propriedades da classe

    Construindo o construtor

    Limpando as propriedades

    Anexando o número à caixa de exibição

    Preparando a operação matemática

    Formatando a entrada

    Resolvendo o cálculo

    Calculando a operação adicional

    Criando o código do motor na abordagem funcional

    Adicionando várias novas propriedades

    Simplificando a correspondência de padrões

    Atribuindo as propriedades

    Construindo a classe limpando as propriedades

    Anexar o número inserido à caixa de texto

    Preparando a operação

    Formatando a entrada

    Resolvendo o cálculo

    Calculando a operação adicional

    Resumo

    11. Melhores Práticas de Codificação e Teste do Código Funcional

    Práticas recomendadas de codificação em C# funcional

    Prevenção de assinaturas desonestas

    Refatorando uma classe mutável em uma classe imutável

    Evitando mutabilidade e acoplamento temporal

    Lidando com os efeitos colaterais

    Separando o código da lógica de domínio e do shell mutável

    Examinando o código contendo efeitos colaterais

    Refatorando o método AddRecord()

    Refatorando o método RemoveRecord()

    Executando a lógica de domínio no teste de unidade

    Testando o método AddRecord()

    Testando o método RemoveRecord()

    Executando o teste

    Adicionando o shell mutável ao código

    Resumo

    Prefácio

    Alguns de nós podem estar acostumados a desenvolver um aplicativo usando a técnica de programação por orientação a objetos e não se importam com a técnica de programação funcional. No entanto, há benefícios em usar a programação funcional. Um dos benefícios é que teremos uma nova perspectiva sobre nosso código de programação, já que a função na programação funcional é idêntica a uma função matemática. Por ser idêntica a uma função matemática, a função na programação funcional não contém efeitos colaterais, o que significa que a invocação da função não terá efeito em outras funções da classe. Discutiremos mais detalhes sobre os benefícios e outras coisas relacionadas à programação funcional neste livro.

    O que este livro cobre

    Capítulo 1, Tasting Functional Style in C# , apresenta a abordagem de programação funcional discutindo seus conceitos e a comparação entre programação funcional e imperativa. Também tentamos refatorar um código imperativo simples em uma abordagem funcional.

    Capítulo 2, Walkthrough Delegates , aborda a definição, a sintaxe e o uso de delegados. Também discutimos a variação de delegados e o delegado integrado.

    Capítulo 3, Expressing Anonymous Methods with Lambda Expressions , orienta-nos pelo conceito de delegados e usa-o para criar e usar um método anônimo. Depois de analisarmos o método anônimo, podemos transformá-lo em uma expressão lambda e aplicá-lo à programação funcional.

    Capítulo 4, Extending Object Functionality with Extension Methods , elabora os benefícios de usar o método de extensão na programação funcional. Antes disso, discutimos o uso do método de extensão e também discutimos como obter esse novo método no IntelliSense. Além disso, tentamos invocar o método de extensão de outros assemblies.

    capítulo 5, Consultando qualquer coleção facilmente com LINQ , enumera o operador LINQ fornecido por C# e compara as duas sintaxes LINQ: Fluent Syntax e Query Expression Syntax. Também discutimos a execução adiada no processo LINQ.

    Capítulo 6, Aprimorando a capacidade de resposta do programa funcional com programação assíncrona , aborda a programação assíncrona para a abordagem funcional. Ele explicará o modelo de programação assíncrona e o padrão assíncrono baseado em tarefa.

    Capítulo 7, Learning Recursion , explica as vantagens da recursão sobre a sequência de loop. Também discutimos a recursão direta e indireta neste capítulo.

    Capítulo 8, Optimizing the Code Using Laziness and Caching Techniques , aborda a técnica usada para otimizar o código na abordagem funcional. Falamos sobre o pensamento preguiçoso e a técnica de cache para otimizar nosso código.

    Capítulo 9, Trabalhando com Padrão , abrange as vantagens de usar padrões em comparação com as operações convencionais de caixa de comutação. Discutimos a correspondência de padrões e a mônada neste capítulo. Usamos o recurso de correspondência de padrões, que é o novo recurso fornecido pelo C# 7.

    Capítulo 10, Tomando uma ação na programação funcional C#, orienta-nos através do desenvolvimento de código funcional com base em determinado código imperativo. Usamos nosso aprendizado no capítulo anterior para criar um aplicativo usando a abordagem funcional.

    Capítulo 11, Coding Best Practice and Testing the Functional Code , explica a melhor prática na abordagem funcional, incluindo a criação de uma assinatura honesta e como lidar com os efeitos colaterais. Também separamos o código em lógica de domínio e shell mutável e, em seguida, testamos usando testes de unidade.

    O que você precisa para este livro

    Para percorrer este livro e compilar com êxito todo o código-fonte, precisamos de um computador pessoal que execute o Microsoft Windows 10 (ou superior) com o Visual Studio Community 2015 Update 3 instalado para a execução do código nos capítulos 1-8, 10, 11 e Visual Studio Community 2017 RC (Release Candidate) instalado para a execução do código no capítulo 9. Também precisamos do .NET Framework 4.6.2, a menos que você precise recodificar todo o código-fonte para executar em sua versão atual do .NET Framework. Você também precisa do .NET Core 1.0 se quiser compilar todo o código em outra plataforma, pois todos os códigos são compatíveis com o .NET Core 1.0.

    Para quem é este livro

    Este livro é adequado para desenvolvedores C# com conhecimento prévio básico de C# e sem experiência em programação funcional.

    Convenções

    Neste livro, você encontrará vários estilos de texto que distinguem diferentes tipos de informação. Aqui estão alguns exemplos desses estilos e uma explicação de seu significado.

    Palavras de código em texto, nomes de tabelas de banco de dados, nomes de pastas, nomes de arquivos, extensões de arquivos, nomes de caminho, URLs fictícios, entrada do usuário e identificadores do Twitter são mostrados a seguir: Podemos incluir outros contextos por meio do uso da diretiva include.

    Um bloco de código é definido da seguinte forma:

    namespace ActionFuncDelegados

    {

    programa de classe parcial pública

    {

    static void Main(string[] args)

    {

    //ActionDelegateInvoke();

    FuncDelegateInvoke();

    }

    }

    Quando queremos chamar sua atenção para uma parte específica de um bloco de código, as linhas ou itens relevantes são colocados em negrito:

    Console.WriteLine(Números primos de 0 a 49 são:);

    foreach (int i em ExtractData)

    Console.Write({0} \t, i)

    ;

    Console.WriteLine();

    Qualquer entrada ou saída de linha de comando é escrita da seguinte forma:

    C:\>dir | mais

    Novos termos e palavras importantes são mostrados em negrito. Palavras que você vê na tela, por exemplo, em menus ou caixas de diálogo, aparecem no texto assim: Temos uma propriedade Body contendo {(a * b)} , NodeType contendo Lambda , Type contendo o delegado Func com três modelos.

    Capítulo 1. Experimentando o estilo funcional em C#

    A programação funcional é um estilo de construção dos elementos e da estrutura do programa de computador que trata os cálculos como avaliações em funções matemáticas. Embora existam algumas linguagens especificamente projetadas para criar programação funcional, como Haskell ou Scala, também podemos usar C# para realizar o design de programação funcional.

    No primeiro capítulo deste livro, vamos explorar a programação funcional testando-a. Usaremos o poder do C# para construir algum código funcional. Também trataremos dos recursos em C# que são mais usados no desenvolvimento de programas funcionais. Ao final deste capítulo, teremos uma ideia de como será a abordagem funcional em C#. Aqui estão os tópicos que abordaremos neste capítulo:

    Introdução à programação funcional

    Na programação funcional, escrevemos funções sem efeitos colaterais da mesma forma que escrevemos em Matemática. A variável na função de código representa o valor do parâmetro da função e é semelhante à função matemática. A ideia é que um programador defina as funções que contém a expressão, a definição e os parâmetros que podem ser expressos por uma variável para resolver problemas.

    Depois que um programador cria a função e a envia ao computador, é a vez do computador fazer seu trabalho. Em geral, o papel do computador é avaliar a expressão na função e retornar o resultado. Podemos imaginar que o computador atue como uma calculadora, pois analisará a expressão da função e dará o resultado ao usuário em formato impresso. A calculadora irá avaliar uma função composta por variáveis passadas como parâmetros e expressões que formam o corpo da função. As variáveis são substituídas por seus valores na expressão. Podemos fornecer expressões simples e expressões compostas usando operadores algébricos. Como as expressões sem atribuições nunca alteram o valor, as subexpressões precisam ser avaliadas apenas uma vez.

    Suponha que temos a expressão 3 + 5 dentro de uma função. O computador definitivamente retornará 8 como resultado logo após avaliá-lo completamente. No entanto, este é apenas um exemplo simples de como o computador age ao avaliar uma expressão. Na verdade, um programador pode aumentar a capacidade do computador criando uma definição e expressão complexas dentro da função. O computador não apenas pode avaliar a expressão simples, mas também pode avaliar o cálculo e a expressão complexos.

    Noções básicas sobre definições, scripts e sessões

    Como discutimos anteriormente sobre uma calculadora que analisará a expressão da função, vamos imaginar que temos uma calculadora que possui um painel de console como um computador. A diferença entre esta e uma calculadora convencional é que temos que pressionar Enter em vez de = (igual a) para executar o processo de avaliação da expressão. Aqui, podemos digitar a expressão e pressionar Enter . Agora, imagine que digitamos a seguinte expressão:

    3 x 9

    Imediatamente após pressionar Enter , o computador imprimirá 27 no console, e é isso que esperamos. O computador fez um ótimo trabalho avaliando a expressão que demos. Agora, passemos à análise das seguintes definições. Imagine que os digitamos em nossa calculadora funcional:

    quadrado a = a * a

    max ab = a, se a >= b

    = b, se b > a

    Definimos as duas definições, square e max . Podemos chamar a lista de script de definições. Ao chamar a função square seguida de qualquer número que represente a variável a , teremos o quadrado desse número. Além disso, na definição de max, servimos dois números para representar as variáveis a e b , e então o computador irá avaliar esta expressão para descobrir o maior número entre as variáveis.

    Ao definir essas duas definições, podemos usá-las como uma função, que podemos chamar de sessão, da seguinte forma:

    quadrado (1 + 2)

    O computador definitivamente imprimirá 9 após avaliar a função anterior. O computador também será capaz de avaliar a seguinte função:

    máximo 1 2

    Ele retornará 2 como resultado com base na definição que definimos anteriormente. Isso também é possível se fornecermos a seguinte expressão:

    quadrado (máx. 2 5)

    Em seguida, 25 será exibido em nosso painel de console da calculadora.

    Também podemos modificar uma definição usando a definição anterior. Suponha que queremos quadruplicar um número inteiro e aproveitar a definição da função quadrada; aqui está o que podemos enviar para nossa calculadora:

    quad q = quadrado q * quadrado q

    quadra 10

    A primeira linha da expressão anterior é uma definição da função quad. Na segunda linha, chamamos essa função e receberemos 10000 como resultado.

    O script pode definir o valor da variável; por exemplo, dê uma olhada no seguinte:

    raio = 20

    Portanto, devemos esperar que o computador seja capaz de avaliar a seguinte definição:

    área = (22/7) * quadrado (raio)

    Usando substituição e simplificação para calcular a expressão

    Usando um método matemático chamado redução , podemos avaliar expressões por variáveis de substituição ou expressões para simplificar as expressões até que não seja possível mais substituição na redução. Vamos pegar nossa expressão anterior, square (1 + 2) , e observar o seguinte processo de redução:

    quadrado (1 + 2) -> quadrado 3 (adição)

    -> 3 x 3 (quadrado)

    -> 9 (multiplicar)

    Primeiramente, temos o símbolo -> para indicar a redução. A partir da sequência, podemos descobrir o processo de redução, ou seja, o processo de avaliação. Na primeira linha, o computador executará a expressão 1 + 2 e a substituirá por 3 para reduzir a expressão. Em seguida, reduzirá a expressão na segunda linha simplificando o quadrado 3 para expressões de 3 x 3. Por fim, simplificará 3 x 3 e o substituirá por 9 , que é o resultado dessa expressão.

    Na verdade, uma expressão pode ter mais de uma possibilidade na redução. O processo de redução anterior é uma das possibilidades de um processo de redução. Também podemos criar outras possibilidades, como as seguintes:

    quadrado (1 + 2) -> (1 + 2) x (1 + 2) (quadrado)

    -> 3 x (1 + 2) (adição)

    -> 3 x 3 (soma)

    -> 9 (multiplicar)

    Na sequência anterior, em primeiro lugar, podemos ver que a regra para um quadrado é aplicada. O computador então substitui 1 + 2 na linha 2 e na linha 3. Por fim, ele multiplica o número na expressão.

    A partir dos dois exemplos anteriores, podemos concluir que a expressão pode ser calculada usando substituição e simplificação simples, a regra básica da matemática. Também podemos ver que a expressão é uma representação do valor, não o valor em si. No entanto, a expressão estará na forma normal se não puder mais ser reduzida.

    Entendendo as funções usadas para programação funcional

    A programação funcional usa uma técnica de enfatizar funções e sua aplicação em vez de comandos e sua execução. A maioria dos valores na programação funcional são valores de função. Vamos dar uma olhada na seguinte notação matemática:

    f :: A -> B

    Pela notação anterior, podemos dizer que a função f é uma relação de cada elemento ali declarado, que é A e B . Chamamos A , o tipo de origem e B , o tipo de destino. Em outras palavras, a notação de A -> B afirma que A é um argumento onde temos que inserir o valor e B é um valor de retorno ou a saída da avaliação da função.

    Considere que x denota um elemento de A e x + 2 denota um elemento de B , então podemos criar a notação matemática da seguinte forma:

    f(x) = x + 2

    Está gostando da amostra?
    Página 1 de 1