203 votes

Est-il un logiciel-la méthodologie d'ingénierie pour la programmation fonctionnelle?

Génie logiciel qu'elle est enseignée aujourd'hui est entièrement axé sur la programmation orientée objet et le "naturel" orientée objet, vue sur le monde. Il y a une méthodologie détaillée qui décrit comment transformer un modèle de domaine dans un modèle de classe avec plusieurs étapes et beaucoup de (UML) des artefacts comme des cas d'utilisation diagrammes de classe ou de diagrammes. Beaucoup de programmeurs ont intériorisé cette approche et ont une bonne idée sur la façon de la conception orientée objet application à partir de zéro.

La nouvelle vague est la programmation fonctionnelle, qui est enseigné dans de nombreux livres et des tutoriels. Mais qu'en est fonctionnelle génie logiciel? Lors de la lecture sur Lisp et Clojure, je suis tombé sur deux états:

  1. Les programmes fonctionnels sont souvent mis en place de bas en haut plutôt que de haut en bas ("Sur Lisp', Paul Graham)

  2. Fonctionnelle Programmeurs utilisent des Cartes où OO-Programmeurs utilisent des objets/classes ('Clojure pour les Programmeurs Java', parler par de Riches Hickley).

Alors, quelle est la méthodologie pour une systématique (modèle ?) conception d'une application fonctionnelle, c'est à dire en Lisp ou Clojure? Quelles sont les étapes communes, ce qui artefacts dois-je utiliser, comment faire une carte de l'espace du problème à la solution de l'espace?

167voto

Norman Ramsey Points 115730

Dieu merci, le génie logiciel les gens n'ont pas encore découvert la programmation fonctionnelle. Voici quelques parallèles:

  • De nombreux OO "design patterns" sont saisies comme des fonctions d'ordre supérieur. Par exemple, le modèle Visiteur est connu dans le monde fonctionnelle comme un "pli" (ou si vous êtes un pointu dirigé théoricien, un "catamorphism"). Dans les langages fonctionnels, les types de données sont pour la plupart des arbres ou des tuples, et chaque type d'arbre a un naturel catamorphism associés.

    Ces fonctions d'ordre supérieur viennent souvent avec certaines lois de programmation, aka "libre théorèmes".

  • Fonctionnelle programmeurs utilisent des diagrammes beaucoup moins lourd que le OO programmeurs. Beaucoup de ce qui est exprimé dans OO diagrammes est plutôt exprimé dans les types, ou dans les "signatures", qui vous doivent penser que "les types de modules". Haskell a aussi de type "classes", qui est un peu comme un type d'interface.

    Ceux fonctionnelle programmeurs qui utilisent des types généralement à penser que "une fois que vous obtenez les types de droit; le code pratiquement écrit lui-même."

    Pas toutes les langues qui utilisent des types explicites, mais la manière De Concevoir les Programmes de livre, un excellent livre pour l'apprentissage de Régime/Lisp/Clojure, s'appuie fortement sur les "descriptions de données", qui sont étroitement liés à des types.

Alors, quelle est la méthodologie pour une systématique (modèle ?) conception d'une application fonctionnelle, c'est à dire en Lisp ou Clojure?

Toute méthode de conception basée sur l'abstraction de données fonctionne bien. Je pense que c'est plus facile quand le langage a des types explicites, mais il fonctionne même sans. Un bon livre sur les méthodes de conception pour les types de données abstraites, qui s'adapte facilement à la programmation fonctionnelle, est l'Abstraction et la Spécification du Programme de Développement par Barbara Liskov et Jean Guttag, la première édition. Liskov a remporté le prix Turing dans le cadre de ce travail.

Une autre méthodologie de conception qui est unique à Lisp est de décider ce que les extensions de langage serait utile dans le domaine du problème dans lequel vous travaillez, et ensuite utiliser hygiénique des macros pour ajouter ces constructions à votre langue. Un bon endroit pour en savoir plus à propos de ce genre de conception est Matthieu Flatt l'article de la Création de Langues dans la Raquette. L'article est peut-être derrière un paywall. Vous pouvez également trouver plus d'informations générales sur ce type de conception en recherchant le terme "spécifique au domaine du langage intégré"; en particulier, des conseils et des exemples au-delà de ce que Matthieu Flatt couvre, je serais probablement commencer avec Graham Sur le langage Lisp ou peut-être la norme ANSI Common Lisp.

Quelles sont les étapes communes, ce qui artefacts dois-je utiliser?

Étapes communes:

  1. Identifier les données dans votre programme et les opérations, et de définir un type abstrait de données représentant ces données.

  2. Identifier des actions communes ou des modèles de calcul, et de les exprimer comme des fonctions d'ordre supérieur ou des macros. S'attendre à prendre cette étape en tant que partie de refactoring.

  3. Si vous êtes en utilisant un langage fonctionnel typé, utilisez le vérificateur de types tôt et souvent. Si vous êtes à l'aide de Lisp ou Clojure, la meilleure pratique consiste à écrire la fonction des contrats de premier y compris les tests unitaires-il du développement piloté par les tests au max. Et vous voulez utiliser n'importe quelle version de QuickCheck a été porté à votre plate-forme, ce qui, dans votre cas, on dirait qu'il est appelé ClojureCheck. C'est un outil extrêmement puissant de la bibliothèque pour la construction aléatoire des tests de code qui utilise des fonctions d'ordre supérieur.

46voto

cgrand Points 4922

Pour Clojure, je vous recommande de revenir à la bonne vieille relationnelle de la modélisation. De la tar pit est une source d'inspiration pour lire.

38voto

mikera Points 63056

Personnellement, je trouve que tous les habituelles bonnes pratiques de OO développement de l'appliquer dans la programmation fonctionnelle en tant que bien juste avec quelques modifications mineures pour tenir compte de la fonctionnelle de la vision du monde. À partir d'un point de vue de la méthodologie, vous n'avez pas vraiment besoin de faire quelque chose de fondamentalement différent.

Mon expérience, c'est d'avoir déplacé de Java à Clojure au cours des dernières années.

Quelques exemples:

  • Comprendre votre domaine professionnel / modèle de données - tout aussi important de savoir si vous allez à la conception d'un modèle d'objet ou de créer une fonctionnelle de la structure de données avec imbriqué cartes. À certains égards, FP peut être plus facile, car il vous encourage à réfléchir sur le modèle de données séparément à partir de fonctions / processus, mais vous avez encore à faire les deux.

  • Service d'orientation dans la conception - en fait, il fonctionne très bien à partir d'un FP point de vue, depuis un service est vraiment juste une fonction avec certains effets secondaires. Je pense que le "bottom up" vue du développement de logiciels parfois préconisées dans le Lisp monde est en fait juste un bon service API orientée sur des principes de conception dans une autre forme.

  • Développement Piloté par les tests - fonctionne bien dans la FP langues, en fait, parfois même mieux parce que les fonctions pures se prêtent extrêmement bien à l'écriture claire, répétabilité des tests sans aucune nécessité de mettre en place une dynamique de l'environnement. Vous pouvez également construire distinct des tests pour vérifier l'intégrité des données (par exemple, cette carte avez toutes les clés en il que j'attends, pour compenser le fait que, dans un langage OO la définition de la classe de mettre ceci pour vous au moment de la compilation).

  • Prototying / itération - fonctionne aussi bien avec de la FP. Vous pourriez même être en mesure de prototype en direct avec les utilisateurs, si vous avez de très très bons à la construction d'outils / DSL et à les utiliser dans le REPL.

13voto

sclv Points 25335

OO programmation étroitement les couples de données avec le comportement. Programmation fonctionnelle sépare en deux. Si vous n'avez pas les diagrammes de classe, mais vous n'avez pas de structures de données, et vous en particulier ont des types de données algébriques. Ces types de peut être écrit de façon très serrée correspondent à votre domaine, y compris l'élimination impossible valeurs par construction.

Donc il n'y a pas des livres et des livres sur elle, mais il est bien établi approche, comme le dit le dicton, il est impossible de valeurs irreprésentable.

En faisant cela, vous pouvez faire un choix sur la représentation de certains types de données comme des fonctions au lieu de cela, et à l'inverse, représentant certaines fonctions comme une union de types de données au lieu de sorte que vous pouvez obtenir, par exemple, la sérialisation, le resserrement de la spécification, de l'optimisation, etc.

Ensuite, étant donné que, vous écrivez des fonctions sur votre adts telle que l'on établisse une sorte d' algèbre -- c'est à dire il y a des lois fixes qui pour ces fonctions. Certains sont peut-être idempotent -- même après plusieurs applications. Certains sont associatifs. Certains sont transitives, etc.

Maintenant vous avez un domaine sur lequel vous avez les fonctions qui le composent selon bien comportés lois. Un simple incorporé DSL!

Oh, et compte tenu de leurs propriétés, vous pouvez bien sûr écrire automatisé essais randomisés (ala QuickCheck).. et c'est juste le début.

7voto

Kaz Points 18072

La conception Orientée objet n'est pas la même chose que le génie logiciel. Génie logiciel a à faire avec l'ensemble du processus de la façon dont nous allons partir d'exigences pour un système de travail, à temps et avec un faible taux de défauts. Programmation fonctionnelle peut être différente de OO, mais il ne supprime pas les exigences de haut niveau, et de la conception détaillée, de vérification et de test, les indicateurs logiciels, estimation, et toutes les autres génie logiciel "trucs".

En outre, les programmes fonctionnels présentent la modularité et de l'autre structure. Le détail de vos conceptions doivent être exprimés en termes de concepts dans cette structure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X