Quais são algumas boas práticas ao tentar ensinar programação declarativa a programadores imperativos?


13

Eu me ofereci para fazer um pouco de treinamento em F # na minha empresa e eles pareciam mostrar algum interesse. Eles geralmente são programadores de VB6 e C # que não seguem a programação com muita paixão. Dito isto, sinto que é mais fácil escrever o código correto quando você pensa em uma questão funcional, para que eles definitivamente obtenham algum benefício.

Alguém pode oferecer alguns conselhos sobre como devo abordar isso?

Ideias

  • Não se concentre na sintaxe, mas em como essa linguagem e os idiomas que ela promove podem ser usados.
  • Tente pensar em exemplos difíceis de escrever de maneira imperativa, mas que se traduzem em código elegante quando escritos de maneira declarativa.

F # e programação declarativa ?????
usar o seguinte comando

@ Pavel - Isso é uma pergunta?
ChaosPandion

3
@ Pavel - OK, gostaria de explicar por que você fez a declaração? Esta é a segunda vez que você faz comentários extremamente vagos. É muito rude.
ChaosPandion

3
pt.wikipedia.org/wiki/Declarative_programming A programação funcional é um tipo de programação declarativa. Além disso, +1, boa pergunta.
Note to self - pense em um nome

2
@Chaos, na minha opinião, o F # não suporta o paradigma de programação declarativa. Sua avaliação ágil e recursos imperativos tornam a linguagem meramente uma forma conveniente e funcional de denotar as mesmas declarações imperativas que você usa em, digamos, C #. Vamos lá, ainda makeé mais uma linguagem declarativa do que F # ou Caml! (Ironicamente, isso torna seu trabalho mais fácil.)
P Shved

Respostas:


5

A programação funcional é uma besta estranha para mim. Eu aprendi F # e Haskell, escrevi alguns programas simples e adoro usá-los, mas nunca tive o "flash de revelação" de que algumas pessoas falam. Mas, lentamente, notei que cada vez mais eu escrevia um código que deveria ser imutável, dividindo tarefas em mais funções menores e tentando usar muito mais os delegados. É algo que, se você gosta, entra no seu trabalho porque o valor dessas técnicas é evidente.

Agora, mais praticamente para treinamento: acho que dois conceitos realmente clicam em Programação Funcional como um estilo para mim.

Primeiro, o estilo FP é baseado na estrutura dos dados, não na composição como no OOP. Eu olhei para algo como List em C # como sendo um truque inteligente para gerar listas seguras para tipos, algo que compôs o tipo (string) no outro tipo (lista). Depois de aprender FP, olho para os genéricos mais como as Mônadas agora. List é uma forma estruturada que o código pode assumir e decora as strings.

Segundo, e talvez mais útil para programadores de C # / ASP, é a idéia de que o FP trabalha com recursão e repetição, enquanto o OOP trabalha com mutabilidade e loop. Eu costumo pensar no ciclo de vida da página ASP como um tipo de FP agora: cada solicitação é processada do zero durante todo o ciclo de vida; portanto, a página inteira é, na verdade, um grande programa que se repete lentamente. Se você pode restringir essa noção, terá uma idéia melhor de como um programa imperativo pode ser estruturado em torno de loops de funções que capturam dados, operam sobre eles e retornam novos dados em vez de modificar os antigos.

O obstáculo mais difícil, pelo menos para mim, a superar com essa abordagem é a sensação de que você está desperdiçando toneladas de recursos ao usar objetos mutáveis, economizando uma tonelada de memória. No GC, confiamos, e eu apenas tive que aprender a deixar de lado as preocupações com desempenho até que eu realmente vi o programa ser executado e verificado se havia algum, e se sim, usar um criador de perfil para ver exatamente onde estavam os problemas.



1

Muitas linguagens de programação imperativas (Ada, C / C ++, Turbo Pascal, FoxPro) têm a capacidade de definir ponteiros para funções ou literais de nomes de procedimentos que podem ser avaliados (e os procedimentos nomeados após o literal invocado) em tempo de execução.

O exemplo tradicional é qsort em C. Desenvolva a noção de que você pode definir algoritmos que executam outros algoritmos nas estruturas de dados. Obviamente, isso é apenas uma fração do que é programação funcional. Mas eu descobri que esse é um bom ponto de partida para que a idéia se encaixe.

Uma vez que isso afunda, você pode começar a se aprofundar em outras coisas (imutabilidade, compartilhamento de nada etc.)


Correção: O que quero dizer é construir sobre a noção de que você pode definir algoritmos parametrizados que podem tomar OTHER algoritmos como parâmetros e executá-los em estruturas de dados.
luis.espinal

1

Alguém pode oferecer alguns conselhos sobre como devo abordar isso?

Certo:

  • Escolha seus exemplos com cuidado para que seu código F # não apenas resolva um problema com elegância, mas também com muito mais elegância do que é possível com o C # / VB . A correspondência de padrões e a inferência de tipos são seus amigos aqui.

  • Use um exemplo para destacar os benefícios do novo recurso encontrado em F #, por exemplo, fluxos de trabalho assíncronos, padrões ativos.

  • Não tenha medo de dar exemplos impuros usando estruturas de dados mutáveis, quando apropriado. F # é impuro por uma razão.

  • Não apresente F # como uma panacéia. Descreva os aplicativos para os quais o F # não é adequado e aqueles para os quais é muito mais adequado do que outras linguagens .NET.

  • Aponte para amostras de brinquedos que eles podem estudar, bem como projetos bem-sucedidos do mundo real que usavam F # (Bing AdCenter, Halo 3 etc.).

  • Explique tudo em termos de como o F # pode ajudá-los a resolver problemas mais facilmente. Evite debates religiosos. Mantenha-se positivo sobre o F #, não negativo sobre outros idiomas. Arme-os com fatos e evidências, mas deixe-os tirar suas próprias conclusões.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.