Question

Je connais bien l'architecture orientée objet, y compris l'utilisation de modèles de conception et de diagrammes de classes pour la visualisation, et je connais l'architecture orientée services avec ses contrats et ses liaisons de protocole, mais un logiciel est-il caractéristique architecture pour un système écrit dans un langage de programmation fonctionnel?

Je sais que la PF a été utilisée pour des projets de moyenne à grande échelle. Paul Graham a écrit la première incarnation de Yahoo! Stocker dans Common Lisp. Certains systèmes de développement Lisp sont complexes. L'intelligence artificielle et les systèmes financiers écrits dans des langages fonctionnels peuvent devenir très volumineux. Ils ont tous au moins une sorte d’architecture inhérente, cependant, je me demande s’ils ont quelque chose en commun?

À quoi ressemble une architecture basée sur l'évaluation d'expressions? Les architectures de PF sont-elles plus composables?

Mise à jour: Kyle m'a rappelé que le SICP est une bonne ressource pour ce sujet.

Mise à jour 2: j'ai trouvé un bon message sur le sujet: Comment la programmation fonctionnelle affecte-t-elle la structure de votre code?

Était-ce utile?

La solution

Le fil conducteur de l’architecture " architecture " Selon certains des projets utilisant des langages fonctionnels, ils ont tendance à être séparés en couches d’algèbres plutôt que de sous-systèmes au sens traditionnel de l’architecture des systèmes.

Pour d'excellents exemples de tels projets, consultez XMonad , Yi , et HappS . Si vous examinez leur structure, vous constaterez qu’elles comprennent des couches de structure monadique avec de la colle de combinateur entre les deux.

Consultez également le l’expérience Scala qui décrit une architecture où un système est composé de composants qui résument leurs dépendances.

Autres conseils

Je travaille actuellement sur le livre "Design et architecture dans la programmation fonctionnelle". Il décrit de nombreux modèles de conception et approches existant dans le monde pur de la PF (le langage principal est Haskell), mais pas seulement. Le livre vous apprend à construire une grande application à partir de rien avec un état pur et impur, le multithreading, le réseau, une base de données, une interface graphique, comment la diviser en couches et obtenir la simplicité. Il montre également comment modéliser des domaines et des langages, comment organiser et décrire l’architecture de l’application, comment le tester, et plus encore.

La liste des sujets comprend:

  • Approches de la modélisation d'architecture à l'aide de diagrammes;
  • Analyse des exigences;
  • Modélisation de domaine DSL intégré;
  • Conception et mise en œuvre DSL externe;
  • Les monades en tant que sous-systèmes avec effets;
  • Monades libres en tant qu'interfaces fonctionnelles;
  • eDSL Arrowised;
  • Inversion du contrôle en utilisant des eDSL monadiques libres;
  • Mémoire transactionnelle logicielle;
  • Objectifs;
  • États, lecteurs, écrivains, RWS, monades ST;
  • État impur: IORef, MVar, STM;
  • Modélisation multithreading et simultanée;
  • interface graphique;
  • Applicabilité des techniques et approches classiques telles que UML, SOLID, GRASP;
  • Interaction avec des sous-systèmes impurs.

Le livre est basé sur les projets Haskell que je recherche, en particulier sur une application SCADA Andromeda . Le code de ce livre est disponible ici . Pendant que le livre est en cours de développement (ce sera fait jusqu’en 2017), je peux vous recommander de vous familiariser avec mon article "Design and Architecture in FP". ici .

MISE À JOUR

J'ai partagé mon livre en ligne (5 premiers chapitres). Voir l'article sur Reddit

La principale caractéristique commune des langages fonctionnels consiste à utiliser des fonctions pour stocker des données. C'est un peu comme utiliser des fonctions d'accesseur sur un objet sans l'objet. Au lieu de cela, la fonction est créée dans un environnement où elle a accès aux données dont elle a besoin. Désormais, cette fonction peut être transmise et utilisée n’importe où, tout en conservant la possibilité d’utiliser les données.

Voici un exemple très simple. Ce n'est pas purement fonctionnel car cela change d'état, mais c'est assez commun:

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

(define x (make-counter))

(x) returns 1

(x) returns 2

...etc...

Nous avons donc une fonction, make-counter, qui renvoie une autre fonction contenant l’état du compteur. Nous pouvons appeler ce compteur nouvellement créé et observer le changement à l'intérieur.

C’est ainsi que sont structurés les programmes fonctionnels. Vous avez des fonctions qui prennent des fonctions en arguments, vous avez des fonctions qui renvoient des fonctions avec un état masqué, etc. C'est beaucoup plus propre que de gérer la mémoire vous-même.

J'ai travaillé sur des projets fonctionnels assez importants. Ils tombent généralement dans deux camps (au moins, ceux que j'ai utilisés):

  • Extensibilité extrême / fiabilité / concurrence. Les modèles transactionnels peuvent être très étroitement intégrés au langage. La concurrence simultanée en est un excellent exemple et les projets qui l'utilisent ont beaucoup de mal à se tromper en ce qui concerne la correction de la concurrence.
  • Analyser / modifier les frameworks. Beaucoup de modèles de conception sur lesquels ces frameworks sont basés sont incroyablement faciles à formuler / construire / modifier dans des langages fonctionnels. Le modèle de visiteur en est un excellent exemple.

J'ai imprimé et consulté modèles de conception dans Ocaml , et ils utilisent des modules et des foncteurs (et des objets) pour recréer les modèles de conception habituels auxquels nous sommes habitués. C'est intéressant, mais je pense qu'ils utilisent beaucoup trop les objets pour vraiment voir les avantages des langages fonctionnels. La PF est très composable, elle fait partie de sa nature. J'imagine que ma réponse rapide est d'utiliser les modules et les foncteurs .

Mon projet actuel est plutôt volumineux et nous séparons chaque module par des fichiers --impliqués dans ocaml. Je suis également à la recherche d'une ressource complète pouvant donner lieu à d'autres points de vue ou à des réflexions sur une conception réellement réussie issue d'un projet.

Espérons que ce ne soit pas trop tangentiel, mais probablement intéressant pour tous les lecteurs des réponses à cette question: cette présentation est Design Patterns in Programmation dynamique de Peter Norvig.

Je pense que cela peut aider;

  

Certains des motifs disparaissent - que   est, ils sont pris en charge directement par   caractéristiques de la langue, certains modèles sont   plus simple ou ont un objectif différent, et   certains sont essentiellement inchangés.

[AIM-2002-005] Gregory T. Sullivan, Fonctionnalités avancées du langage de programmation pour la conception exécutable Modèles "Meilleurs modèles grâce à la réflexion

22 mars 2002

  

Le livre sur les modèles de conception [GOF95]   présente 24 modèles éprouvés par le temps qui   apparaissent systématiquement dans bien conçu   systèmes logiciels. Chaque motif est   présenté avec une description de la   problème de conception les adresses de modèle,   ainsi qu'un exemple de code d'implémentation   et considérations de conception. Ce papier   explore comment les motifs de la   Livre "Gang of Four" ou "GOF", comme   est souvent appelé, apparaît lorsque similaire   les problèmes sont résolus à l'aide d'un   dynamique, d'ordre supérieur, orienté objet   langage de programmation. Certains   les modèles disparaissent - c’est-à-dire qu’ils   sont pris en charge directement par la langue   caractéristiques, certains modèles sont plus simples ou   avoir un objectif différent, et certains sont   essentiellement inchangé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top