características funcionais de c# 3.0 seminário programação funcional

Post on 19-Apr-2015

136 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Características funcionais de C# 3.0

Seminário Programação Funcional

Equipe Felipe Cavalcanti – fcf3 Fernando Kakimoto – fvk Filipe César – fcsa Francisco Magalhães – fpms

Motivação Construção de APIs de mesmo poder

expressivo das linguagens de consulta – LINQ Project Bancos de dados relacionais XML

Coesão Redução de linhas de código

Uso de expressões lambda Maior entendimento do código (Readability)

Motivação Uso de extensão de métodos

Trabalhar com coleções de uma variedade de tipos

Uso de Generics

Composability Escrever código livre de efeitos colaterais

Roteiro Breve Histórico de C# Características funcionais de C# 3.0 Exemplos Conclusão

Breve Histórico de C# Criada pela Microsoft como parte da

iniciativa .NET Anunciada em Julho de 2000 após aprovação

ECMA-334 Características iniciais

Linguagem orientada a objetos Tipagem forte Portabilidade de código Gerenciador de memória automático Suporte a internacionalização

Breve Histórico de C# C# 2.0

Divulgada juntamente com o release do Visual Studio 2005

Introduziu extensões à linguagem Generics Anonymous method Iterators Partial types

Breve Histórico de C# C# 3.0

Corresponde à versão atual Lançada em 19 de Novembro de 2007 Parte do .NET Framework 3.5 Novas características

Linguagens funcionais LINQ

Características Funcionais de C# 3.0 Implicitly typed local variables Extension methods Tuples Object and collection initializers Anonymous types Query expressions Implicitly typed arrays Lambda expressions Expressions trees

Implicitly typed local variables Utilizando-se a palavra-chave var, força o

compilador a inferir o tipo da variável ou array de elementos da expressão do lado direito da sentença.

É obrigatório a inicialização da variável var na declaração

A inicialização precisa ter um tipo definido em tempo de compilação, aonde não pode ser null.

A inicialização não pode referenciar a declaração da variável.

Implicitly typed local variables A declaração da variável local com tipo

implícito é equivalente a declaração com tipo explicito mostrada a baixo:

Implicitly typed local variables Exemplos de declarações de variáveis locais

utilizando o var incorretamente:

Implicitly typed local variables Declaração de variável local:

var i = 5;

Inicialização do for: for(var x = 1; x < 10; x++)

Inicialização de um foreach foreach(var item in list){...}

Expressão using using (var file = new StreamReader("C:\\teste.txt"))

{...}

Extension methods Extension Methods nos permite adicionar

novos métodos em tipos já existentes sem que seja necessário realizar herança ou mesmo recompilar o tipo original

Métodos estáticos que podem ser chamados usando a síntaxe de métodos de instância.

O compilador fica responsável por procurar e invocar o método estendido

Extension methods Aplica-se para

Classes, classes abstratas e interfaces Tipos parametrizados e não-parametrizados

Passos Definir uma classe estática Definir um método estático cujo primeiro

argumento seja do tipo para o qual se deseja estender

Usar a palavra chave this no primeiro argumento

Extension methods Exemplo:

Extension methods É muito utilizado em query operators que

adicionam novas funcionalidades para tipos já existentes como IEnumerable.

Tuples Um dos tipos muito utilizados na programação

funcional. Listas de valores fortemente tipadas, tal

como o conjunto de argumentos para um método.

Tuples Exemplo:

Object and collection initializers Criam objetos e coleções em contextos de

expressões ao invés de declarações

Inicialização in-line de objetos

Mais conveniente de implementar

Mais fácil de ler

Object and collection initializers Exemplo

Declarativo Expressão

Object and collection initializers Passar como argumento de funções

Objetos dentro de objetos

Object and collection initializers Inicializador com construtores

Object and collection initializers Inicializadores de coleções

Consiste numa sequência de inicializadores, limitados por chaves e separados por vírgulas

Até agora Implicitly typed local variables

Realiza inferência do tipo de variável Extension methods

Estender tipos através de classes estáticas Tuples

Listas de valores fortemente tipadas Object and collection initializers

Inicialização in-line de objetos e coleções

Mais pra frente Anonymous types Query expressions Implicitly typed arrays Lambda expressions Expressions trees

Anonymous types Define, declara e instancia um tipo e um

objeto em um único passo (classe sem nome)

Utiliza a idéia de tuplas – conjunto de pares nome/valor

Limitado ao scopo local

Exemplo

Anonymous types Utilizado em projeções

Criar um subconjunto de valores

Query expressions Provê uma sintaxe integrada para consultas

semelhante à linguagens relacionais e hierárquicas como SQL e XQuery.

Iniciam com a cláusula from e terminam com a cláusula select ou group.

A cláusula from inicial pode ter em seguida zero ou mais from, let, where ou join.

Query expressions Cada let computa um valor e o coloca em um

identificador.

Cada where é um filtro que exclui itens do resultado

Joins comparam as chaves especificadas das duas sequências, retornando os valores iguais.

Query expressions Orderby ordena o resultado de acordo com o

critério desejado

O último select ou group especificam o formato do resultado.

Cláusula Into permite a junção de consultas tratando o resultado de uma consulta como um gerador de uma subsequente.

Query expressions Ambiguidades evitadas com expressões sendo

identificadas por from e qualquer token válido, exceto ";", "=" or ",".

Para utilizar qualquer uma das palavras-chaves, deve colocar o @ na frente.

Query expressions Exemplo

Query expressions Exemplo

Implicitly typed arrays Declarar arrays de tipos implícitos

O tipo é inferido de acordo com seus elementos

Todos os elementos devem ter um único tipo inferido Caso contrário, erro de complilação

Exemplo

Implicitly typed arrays Pode ser combinados com inicializadores de

objetos anônimos Cria uma estrutura de dado de tipo anônimo

Lambda expressions Expressam a implementação de um método

ou a instanciação de um delegate a partir de uma construção sintática simples

Usada em delegações e em árvores de expressões

Exemplo

Lambda expressions Statement lambda expressions

Expressões mais complicadas Uso de chaves

Expression trees Permitem que expressões lamda sejam

representadas como estruturas de dados ao invés de código executável.

Eficientes em termos de memória

Explicita e deixam transparentes a estrutura das expressões lambda

Expression trees Exemplo

Implicitly typed arrays Declarar arrays de tipos implícitos

O tipo é inferido de acordo com seus elementos

Todos os elementos devem ter um único tipo inferido Caso contrário, erro de complilação

Exemplo

Implicitly typed arrays Pode ser combinados com inicializadores de

objetos anônimos Cria uma estrutura de dado de tipo anônimo

Lambda expressions Expressam a implementação de um método

ou a instanciação de um delegate a partir de uma construção sintática simples

Usada em delegações e em árvores de expressões

Exemplo

Lambda expressions Statement lambda expressions

Expressões mais complicadas Uso de chaves

Expression trees Permitem que expressões lambda sejam

representadas como estruturas de dados ao invés de código executável.

Eficientes em termos de memória

Explicita e deixam transparentes a estrutura das expressões lambda

Expression trees Exemplo

Expression trees Exemplo[1]

Conclusão C# 3.0 e LINQ adotam muitos termos e

mecanismos das linguagens de programação funcional

Alto poder de coesão através das características apresentadas Diminui linhas de código Facilita a leitura Ajuda na manutenção e extensão

Apesar das várias características funcionais, C# é limitada, não se tornando verdadeiramente multiparadigma

Referências [1] “C# programming guide”, disponível em:

http://msdn.microsoft.com/en-us/library/67ef8sbd.aspx [2] Andrew Kennedy, “C# is a functional programming

language”, Microsoft Research Cambridge [3] “Is C# becoming a functional language?”,

disponível em: http://blogs.msdn.com/madst/archive/2007/01/23/is-c-becoming-a-functional-language.aspx

[4] Eric White, “Query Composition using Functional Programming Techniques in C# 3.0”, disponível em: http://blogs.msdn.com/ericwhite/pages/FP-Tutorial.aspx

[5] “Recommended blog for C# 3.0 and functional programming”, disponível em: http://blog.falafel.com/2007/09/04/RecommendedBlogForC30AndFunctionalProgramming.aspx

Características funcionais de C# 3.0

Seminário Programação Funcional

top related