Pergunta

Eu estou familiarizado com a arquitetura orientada a objetos, incluindo o uso de padrões de projeto e diagramas de classe para visualização, e eu sei de arquitetura orientada a serviços com os seus contratos e as ligações de protocolos, mas está lá característica nada sobre um software arquitetura para um sistema escrito em uma linguagem de programação funcional?

Eu sei que FP tem sido utilizado para de tamanho médio para projetos de grande escala. Paul Graham escreveu a primeira encarnação do Yahoo! Armazenar em Common Lisp. Alguns sistemas de desenvolvimento Lisp são complexas. inteligência artificial e sistemas financeiros escritos em linguagens funcionais pode ficar muito grande. todos eles têm pelo menos algum tipo de arquitetura inerente, porém, eu estou querendo saber se eles têm alguma coisa em comum?

O que uma arquitetura com base na avaliação de expressões parece? São arquiteturas FP mais combináveis?

Update: Kyle me lembrou que SICP é um bom recurso para este assunto.

Update 2: eu encontrei um bom post sobre o assunto: Como é que a programação funcional afetam a estrutura do seu código?

Foi útil?

Solução

A linha comum na "arquitetura" de projetos que utilizam linguagens funcionais é que eles tendem a ser separados em camadas de álgebras em vez de subsistemas no sentido tradicional arquitetura de sistemas.

Para grandes exemplos de tais projetos, veja xmonad , Yi e Happs . Se você examinar como eles são estruturados, você vai achar que eles compreendem camadas de estrutura monádico com um pouco de cola combinator no meio.

Também olhar para O Scala papel Experiment que contornos uma arquitetura onde um sistema é composto de componentes que abstrato sobre suas dependências.

Outras dicas

Atualmente estou trabalhando no livro "Design e Arquitectura na programação funcional". Ele descreve vários padrões de design e abordagens que estão existem no mundo FP puro (idioma principal é o Haskell), mas não só. O livro ensina como construir grande aplicação a partir do zero com o estado puro e impuro, multithreading, rede, banco de dados, GUI, como dividi-lo em camadas e obter simplicidade. Ele também mostra como domínios e idiomas modelo, como organizar e descrever a arquitetura do aplicativo como testá-lo, e ainda mais.

A lista de tópicos inclui:

  • As abordagens para modelagem de arquitetura usando diagramas;
  • análise
  • Requisitos;
  • Incorporado modelagem de domínio DSL;
  • O projeto DSL externo e implementação;
  • Mônadas como subsistemas com efeitos;
  • monads grátis como interfaces funcionais;
  • Arrowised eDSLs;
  • Inversão de Controle usando eDSLs monádicas Livres;
  • Software Transactional Memória;
  • Lentes;
  • Estado, leitor, escritor, monads RWS, ST;
  • estado
  • Impure: IORef, MVar, STM;
  • Multithreading e modelagem de domínio concorrente;
  • GUI;
  • Aplicabilidade das técnicas de análise convencionais e abordagens tais como UML, SOLID, GRASP;
  • Interação com subsistemas impuros.

O livro baseia-se nos projectos Haskell Eu estou pesquisando, especialmente uma aplicação SCADA Andromeda . O código para este livro está disponível aqui . Enquanto o livro está em desenvolvimento (que será feito até ao de 2017), eu posso recomendar que você se familiarizar com o meu artigo "Design e Arquitectura na FP" aqui (Rus).

Atualizar

Eu compartilhei o meu livro on-line (5 primeiros capítulos). ver post no Reddit

A maior semelhança que você encontrará em linguagens funcionais está usando funções para armazenar dados. É um pouco como o uso de funções de acesso em um objeto sem o objeto. Em vez disso, a função é criada em um ambiente onde ele tem acesso aos dados de que necessita. Agora, esta função pode ser passado e usado em qualquer lugar e ainda manter a capacidade de usar os dados.

Aqui está um exemplo muito simples. Isso não é puramente funcional como faz mudança de estado, mas é o suficiente comum:

(define (make-counter)
  (let ((count 0))
    (lambda ()
      (set! count (+ count 1))
      count)))

(define x (make-counter))

(x) returns 1

(x) returns 2

...etc...

Portanto, temos uma função, make-counter, que retorna outra função que tem o estado do contador dentro. Podemos chamar esse contador recém-criado e observar o interior mudança.

Esta é a forma como os programas funcionais são estruturados. Você tem funções que recebem funções como argumentos, você tem funções que as funções de retorno com o estado oculto, etc. É tudo muito mais limpo do que gerenciar a memória mesmo.

Eu tenho trabalhado com algumas bastante grandes projetos funcionais. Eles geralmente caem em dois campos (pelo menos, os que eu já utilizados):

  • escalabilidade Extreme / confiabilidade / concorrência. modelos transacionais pode ser construída com muito rigor para a língua. Concurrent ML é um grande exemplo disso, e os projetos que o utilizam são muito difíceis de obter errado quando se trata de correção de concorrência.
  • análise / modificar estruturas. Muitos dos padrões de design que estes quadros são baseados em são incrivelmente fáceis de formular / build / modificar em linguagens funcionais. O padrão do visitante é um grande exemplo disso.

I impressos e olhou Design Patterns em ocaml , e eles usam módulos e functors (e objetos) para recriar os padrões de projeto normais a que estamos habituados. É interessante, mas acho que eles usam objetos muito muito para ver realmente o benefício de linguagens funcionais. FP é muito combináveis, parte da natureza. Acho que minha resposta curta é usar módulos e functors .

Meu projeto atual é muito grande, e nós separar cada módulo por arquivos --implicit em ocaml. Eu fui caça para um recurso abrangente, bem que poderia ter algumas visões alternativas ou algumas reflexões sobre um projeto realmente bem sucedido que saiu de um projeto.

Esperemos que não muito tangencial, mas provavelmente interessante para qualquer um navegar as respostas a esta pergunta é esta apresentação Design Patterns em dinâmica de programação por Peter Norvig.

Eu acho que isso pode ajudar;

Alguns dos padrões desaparecer - que é, eles são suportados directamente pela recursos de linguagem, alguns padrões são mais simples ou ter um foco diferente, e alguns são essencialmente inalterada.

[AIM-2002-005] Gregory T. Sullivan, avançada linguagem de programação Recursos para Executable projeto Padrões "Padrões melhor através de Reflexão

22 março de 2002

O Design Patterns livro [GOF95] apresenta 24 padrões testados pelo tempo que consistentemente aparecem em bem concebido sistemas de software. Cada padrão é apresentada com uma descrição do projetar problema os endereços padrão, bem como código de execução amostra e projetar considerações. Este papel explora como os padrões da "Gang of Four '', ou" GOF '' livro, como ele é muitas vezes chamado, aparecem quando semelhante problemas são abordados usando um dinâmico, de ordem superior, orientada objecto linguagem de programação. Alguns dos padrões desaparecem - isto é, são suportados directamente pela linguagem características, alguns padrões são mais simples ou tem um foco diferente, e alguns são essencialmente inalterada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top