Comment organiser des programmes fonctionnels [fermé]

41

Dupliquer possible:
programmation fonctionnelle ou POO
Comment écrire du code gérable avec une programmation fonctionnelle?

En POO, votre unité d'organisation de base pour le code est la classe. Une méthodologie fréquemment utilisée dans les langages Java, C # et similaires consiste à organiser votre code de manière à avoir un fichier pour chaque classe avec le nom de fichier qui suit le nom de la classe.

Vous pouvez considérer chacune de ces classes comme une unité d'organisation pour regrouper un seul concept.

Ces classes se trouvent dans des espaces de noms qui suivent souvent la structure de répertoires des fichiers de la solution / projet. Les espaces de noms sont un autre niveau d'organisation.

Comment sont organisés les grands projets dans les langages fonctionnels?

Comment déterminer comment diviser vos fonctions en différents fichiers?

Est-ce que d'autres unités de regroupement sont utilisées à côté des fichiers?

Comment le code est-il généralement organisé dans un seul fichier?

Gilles
la source
18
@ S.Lott What's stopping you from...Des années et des années de programmation avec un état d'esprit complètement différent, au point que le code Haskell ne calcule pas mentalement. Et bien sûr, vous supposez que les projets réels sont toujours correctement et parfaitement organisés (peut-être qu'ils le sont, mais comment se fait-il que personne ne me connaisse?)
yannis
13
@ S.Lott: J'ai toujours programmé en POO. J'ai commencé à barboter dans des langages fonctionnels très récemment par curiosité. Vous dites: "Pourquoi demander ici?". R: Pour obtenir du mentorat et des idées de la part de personnes expérimentées (ou d’experts, comme le dit le site), qui pourraient me renseigner sur le sujet. N'est-ce pas le but de ce site? On ne peut pas répondre à tous les programmeurs ou aux questions SO de la manière suivante: "pourquoi ne le découvrez-vous pas par vous-même"? La réponse est oui, vous pouvez. Mais la raison pour poser la question est d’obtenir des résultats meilleurs / plus rapides de la part d’un expert en la matière.
Gilles
5
@ S.Lott: s'il lit seulement du code aléatoire, comment saura-t-il si les décisions organisationnelles prises sont bonnes ou mauvaises? Et pourquoi sont-ils bons ou mauvais?
Carson63000
4
@ S.Lott Pour résumer, avoir un expert en langage ou en paradigme identifie un projet bien organisé, identifie les faiblesses / faiblesses pouvant exister dans l'organisation et explique pourquoi il vaut bien plus que de lire le code et de regarder l'organisation. , avec l'hypothèse que c'est bien structuré.
Thomas Owens

Réponses:

32

Je suppose que cela dépend de la langue. En ce qui concerne la programmation fonctionnelle, j'ai surtout touché à Haskell, je vais donc expliquer comment cela fonctionne.

Le code Haskell est organisé en "modules" qui ne sont fondamentalement que des collections de fonctions et de types de données. Chaque module est un fichier unique. Un module est une sorte de mélange entre une classe Java et un package Java - la portée exacte de ce qu’un module fait varie. Un module contrôle également les fonctions et les constructeurs de types à exporter et ceux à masquer. c'est semblable àprivate et publicen Java.

Dans mes propres programmes, j'aime bien que les modules en fassent un chose, sémantiquement; cela les rend similaires à une classe Java sauf qu'ils peuvent définir plusieurs types de données. Les modules que j'utilise dans la bibliothèque standard, par exemple Data.List, ressemblent davantage à des paquets: ils fournissent un ensemble de fonctions utilitaires similaires. Ceci est également très similaire aux classes Java statiques comme java.util.Arrays.

Les modules ressemblent aussi aux packages Java en ce sens qu’ils peuvent être imbriqués pour plus de clarté (je ne pense pas que cela ait un effet sur le code lui-même). En général, pour un seul projet, je lui donne un nom (par exemple Project) et tous mes modules en font partie (par exemple, Project.Parseet Project.Run). Si j’écrivais un code qui ressemblait plus à une bibliothèque qu’à une application, je l’organiserais en fonction de ce qu’elle faisait, comme Data.Listou Control.Monad. Une différence majeure par rapport aux autres langues est que Haskell encourage à limiter les entrées-sorties et à tout mettre au même endroit. Un grand nombre de modules ne font pas du tout d'entrées-sorties et, pour un projet donné, j'aime avoir autant de modules purs que possible.

Par exemple, je travaille sur un langage de programmation simple que j'appelle TPL (sans raison valable). Pour cela, j'ai créé deux modules simples: TPL.Parsequi définissent la représentation interne du langage et comment l’analyser, etTPL.Run exécutant l'interpréteur et traitant les variables et les entrées / sorties. Pour compiler et exécuter le code, il existe généralement un Mainmodule qui constitue le point d’entrée du programme.

Il y a une grande liberté dans l'organisation des fonctions dans un fichier; C'est ce que j'aime faire. Je définis mes types de données vers le haut, avant qu'ils ne soient utilisés ailleurs. Juste après la définition des types de données, j'implémente tout ce dont j'ai besoin pour les intégrer à leurs classes de types appropriées - c'est un peu comme implémenter une interface. Ensuite, je suis la logique et diverses fonctions d’aide, selon le cas. Enfin, j'aime avoir toutes mes fonctions IO tout en bas se terminant par main. Cela permet de savoir exactement ce que fait une entrée / sortie et le début du programme.

Donc, en résumé: les fonctions sont contenues dans des modules, chacun étant composé d'un seul fichier. Plusieurs modules peuvent constituer un programme ou une bibliothèque. le premier comprend généralement un Mainmodule qui constitue son point d’entrée. Dans un fichier, il existe différentes options d'organisation, mais je préfère grouper les types de données vers le haut, les entrées / sorties vers le bas et la logique au milieu.

Tikhon Jelvis
la source