Como as linguagens de máquina (por exemplo, 0110101000110101
) as linguagens de computador geralmente evoluíram para formas mais altas de abstração, facilitando a compreensão do código quando aplicado a um problema. Assembler era uma abstração sobre código de máquina, C era uma abstração sobre assembler, etc.
O design orientado a objetos parece ser muito bom para nos permitir modelar um problema em termos de objetos, por exemplo, o problema de um sistema de inscrição em um curso universitário pode ser modelado com uma Course
classe, uma Student
classe etc. Então, quando escrevemos a solução em uma linguagem OO, temos classes semelhantes que recebem responsabilidades e que geralmente são úteis para o design, especialmente para modularizar o código. Se eu der esse problema a 10 equipes independentes que o resolverem com um método OO, geralmente as 10 soluções terão as classes relacionadas ao problema em comum. Pode haver muitas diferenças quando você começa a entrar no acoplamento e nas interações dessas classes; portanto, não existe "diferença de representação zero".
Minha experiência com programação funcional é muito limitada (sem uso no mundo real, apenas programas do tipo Hello World). Não estou conseguindo ver como essas linguagens permitem o mapeamento fácil de soluções de FP para problemas (com uma baixa diferença de representação) da mesma forma que as linguagens OO.
Entendo as vantagens do FP em relação à programação simultânea. Mas estou faltando alguma coisa ou a FP não se resume a reduzir uma lacuna representacional (tornando as soluções mais fáceis de entender)?
Outra maneira de perguntar: o código FP de 10 equipes diferentes que resolvem o mesmo problema do mundo real tem muito em comum?
Da Wikipedia sobre Abstração (ciência da computação) (ênfase minha):
Linguagens de programação funcional geralmente exibem abstrações relacionadas a funções , como abstrações lambda (transformando um termo em uma função de alguma variável), funções de ordem superior (parâmetros são funções), abstração de colchetes (transformando um termo em uma função de uma variável).
A lacuna representacional pode ser potencialmente aumentada, porque [alguns] problemas do mundo real não são modelados facilmente com tais abstrações.
Outra maneira que vejo diminuindo a lacuna representacional é rastrear os elementos da solução de volta ao problema. O 0
's e 1
s em código de máquina é muito difícil de rastrear, enquanto que a Student
classe é fácil de rastrear. Nem todas as classes OO rastreiam facilmente para o espaço do problema, mas muitas o fazem.
As abstrações de FP não precisam sempre ser explicadas para descobrir qual parte do espaço do problema está resolvendo (além dos problemas de matemática )?OK - Eu sou bom nessa parte. Depois de examinar muitos outros exemplos, vejo como as abstrações de FP são muito claras para partes do problema que são expressas no processamento de dados.
A resposta aceita para uma pergunta relacionada A UML pode ser usada para modelar um programa Funcional? - diz "Programadores funcionais não têm muito uso para diagramas". Realmente não me importo se é UML, mas me faz pensar em abstrações de FP fáceis de entender / comunicar, se não houver diagramas amplamente usados (assumindo que esta resposta esteja correta). Novamente, meu nível de uso / entendimento de FP é trivial, então não entendo a necessidade de diagramas em programas simples de FP.
O design do OO possui níveis de abstração de função / classe / pacote, com encapsulamento (controle de acesso, ocultação de informações) em cada um, o que facilita o gerenciamento da complexidade. Esses são elementos que permitem ir do problema para a solução e voltar mais facilmente.
Muitas respostas falam de como a análise e o design são feitos no FP de maneira análoga à OO, mas ninguém cita nada de alto nível até agora (paul citou algumas coisas interessantes, mas é de baixo nível). Ontem eu pesquisei bastante no Google e encontrei uma discussão interessante. O seguinte é de refatoração de programas funcionais de Simon Thompson (2004) (ênfase minha)
Ao projetar um sistema orientado a objetos, é dado como certo que o projeto precederá a programação. Os projetos serão gravados usando um sistema como UML, suportado em ferramentas como o Eclipse. Programadores iniciantes podem muito bem aprender uma abordagem de design visual usando sistemas como o BlueJ. O trabalho sobre uma metodologia semelhante para programação funcional é relatado no FAD: Functional Analysis and Design , mas existe pouco outro trabalho. Pode haver várias razões para isso.
Os programas funcionais existentes são de uma escala que não requer design. Muitos programas funcionais são pequenos, mas outros, como o Glasgow Haskell Compiler, são substanciais.
Os programas funcionais modelam diretamente o domínio do aplicativo, tornando o design irrelevante. Embora as linguagens funcionais forneçam uma variedade de abstrações poderosas, é difícil argumentar que elas fornecem todas e apenas as abstrações necessárias para modelar o mundo real.
Programas funcionais são construídos como uma série de protótipos em evolução.
Na tese de doutorado citada acima , os benefícios do uso de metodologias de análise e design (ADM) são destacados independentemente dos paradigmas. Mas é argumentado que as ADMs devem se alinhar ao paradigma de implementação. Ou seja, o OOADM funciona melhor para a programação OO e não é bem aplicado a outro paradigma como o FP. Aqui está uma ótima citação que eu acho que parafraseia o que chamo de gap representacional:
pode-se argumentar longamente sobre qual paradigma fornece o melhor suporte para o desenvolvimento de software, mas obtém-se o pacote de desenvolvimento mais natural, eficiente e eficaz quando se permanece dentro de um único paradigma, desde a descrição do problema até a implementação e entrega.
Aqui está o conjunto de diagramas propostos pelo FAD:
- diagramas de dependência de função que apresentam uma função com aqueles que utiliza em sua implementação;
- diagrama de dependência de tipos que fornece o mesmo serviço para tipos; e,
- diagramas de dependência de módulo que apresentam vistas da arquitetura do módulo do sistema.
Há um estudo de caso na seção 5.1 da tese do FAD, que é um sistema para automatizar a produção de dados relacionados a uma liga de futebol. Os requisitos são 100% funcionais, por exemplo, entrada de resultados de futebol, tabelas de classificação, tabelas de pontuação, tabelas de presença, transferência de jogadores entre equipes, atualização de dados após novos resultados, etc. Nenhuma menção de como o FAD trabalha para resolver requisitos não funcionais está documentada , além de afirmar que "nova funcionalidade deve ser permitida a um custo mínimo", algo quase impossível de testar.
Infelizmente, além do FAD, não vejo referências modernas para linguagens de modelagem (visuais) propostas para o FP. A UML é outro paradigma, por isso devemos esquecer isso.