Como organizar programas funcionais [duplicados]

38

Em OOP, sua unidade básica de organização para código é a classe. Uma metodologia freqüentemente usada em Java, C # e linguagens semelhantes é organizar seu código em torno de ter um arquivo para cada classe com o nome do arquivo após o nome da classe.

Você pode considerar cada uma dessas classes como uma unidade da organização para agrupar um único conceito.

Essas classes estão em namespaces que geralmente seguem a estrutura de diretórios dos arquivos na solução / projeto. Namespaces são outro nível de organização.

Como os grandes projetos em linguagens funcionais são normalmente organizados?

Como você determina como dividir suas funções em arquivos diferentes?

Existem outras unidades de agrupamento ao lado dos arquivos usados?

Como o código é normalmente organizado em um único arquivo?

    
por Gilles 30.11.2011 / 03:44
fonte

1 resposta

29

Eu suspeito que isso depende da linguagem. No que diz respeito à programação funcional, em geral me interessei por Haskell, então vou explicar como funciona lá.

O código Haskell é organizado em "módulos", que são basicamente apenas coleções de funções e tipos de dados. Cada módulo é um único arquivo. Um módulo é uma mistura entre uma classe Java e um pacote Java - o escopo exato do que um módulo varia. Um módulo também tem controle sobre quais funções e datilografa os construtores a exportar e quais ocultar; isso é semelhante a private e public em Java.

Nos meus próprios programas, eu gosto de ter módulos que fazem um , semanticamente; isso os torna como uma classe Java, exceto pelo fato de poderem definir vários tipos de dados. Os módulos que eu uso da biblioteca padrão, como Data.List , são mais parecidos com pacotes - eles fornecem um conjunto de funções utilitárias semelhantes. Isso também é muito semelhante a classes Java estáticas como java.util.Arrays .

Os módulos também são como pacotes Java, pois podem ser aninhados para maior clareza (não acho que isso tenha qualquer efeito no próprio código). Em geral, para um único projeto, atribuo-lhe um nome (digamos, Project ) e faço com que todos os meus módulos façam parte disso (por exemplo, Project.Parse e Project.Run ). Se eu estivesse escrevendo código mais parecido com uma biblioteca do que com um aplicativo, organizaria isso com base no que estava fazendo, como Data.List ou Control.Monad . Uma grande diferença em relação a outros idiomas é que Haskell incentiva a limitação de IO e coloca tudo em um único lugar. Um grande número de módulos não faz o IO, e para qualquer projeto, eu gosto de ter tantos módulos quanto possível.

Como exemplo, estou trabalhando em uma linguagem de programação simples que estou chamando de TPL (sem um bom motivo). Para isso, criei dois módulos simples: TPL.Parse , que define a representação interna da linguagem e como analisá-la, e TPL.Run , que executa o interpretador e lida com variáveis e IO. Para realmente compilar e executar o código, geralmente há um módulo Main , que é o que acaba sendo o ponto de entrada do programa.

Existe uma liberdade significativa na organização das funções dentro de um arquivo; isso é exatamente o que eu gosto de fazer. Eu defino meus tipos de dados para o topo, antes de serem usados em outro lugar. Logo depois de definir os tipos de dados, eu implemento o que eu preciso para torná-los parte de suas typeclasses apropriadas - isso é como implementar uma interface. Então eu sigo com lógica e várias funções auxiliares, conforme apropriado. Por fim, gosto de ter todas as minhas funções de IO no final mesmo com main . Isso deixa claro exatamente o que está fazendo qualquer IO e onde o programa é iniciado.

Então, em resumo: funções estão contidas em módulos, cada um dos quais é composto de um único arquivo. Vários módulos podem compor um programa ou biblioteca; o primeiro geralmente inclui um módulo Main que é seu ponto de entrada. Dentro de um arquivo, existem diferentes opções de organização, mas eu prefiro agrupar tipos de dados perto do topo, IO próximo ao fundo e lógica no meio.

    
por 30.11.2011 / 08:28
fonte