Depuis langage machine (par exemple 0110101000110101
) des langages informatiques ont généralement évolué vers des formes supérieures de l' abstraction est devenue en général plus facile de comprendre le code quand il est appliqué à un problème. Assembleur était une abstraction sur le code machine, C était une abstraction sur Assembleur, etc.
Object-oriented design seems to be very good at allowing us to model a problem in terms of objects, eg, the problem of a university course registration system can be modeled with a Course
class, a Student
class, etc. Then, when we write the solution dans un langage OO, nous avons des classes similaires qui ont des responsabilités et qui sont généralement utiles pour la conception, en particulier pour la modularisation du code. Si je donne ce problème à 10 équipes indépendantes qui le résolvent avec une méthode OO, généralement les 10 solutions auront en commun les classes relatives au problème. Il peut y avoir beaucoup de différences lorsque vous commencez à entrer dans le couplage et les interactions de ces classes, donc il n'y a rien de tel qu'un «écart de représentation zéro».
Mon expérience avec la programmation fonctionnelle est très limitée (pas d'utilisation réelle, seulement des programmes de type Hello World). Je n'arrive pas à voir comment ces langages permettent de mapper facilement les solutions de FP aux problèmes (avec un faible écart de représentation) comme le font les langages OO.
Je comprends les avantages de la PF par rapport à la programmation concurrente. Mais est-ce que je manque quelque chose, ou la PF ne vise-t-elle pas à réduire un écart de représentation (faciliter la compréhension des solutions)?
Une autre façon de se poser la question: le code FP de 10 équipes différentes résolvant le même problème du monde réel aurait-il beaucoup en commun?
Un article de Wikipédia sur l' abstraction (de l'informatique) (mine d'importance):
Les langages de programmation fonctionnels présentent généralement des abstractions liées à des fonctions , telles que les abstractions lambda (transformer un terme en fonction d'une variable), des fonctions d'ordre supérieur (les paramètres sont des fonctions), l' abstraction des crochets (transformer un terme en fonction d'une variable).
L'écart de représentation pourrait être potentiellement accru, car [certains] problèmes du monde réel ne sont pas facilement modélisés avec de telles abstractions.
Une autre façon que je vois décroissant déficit de représentation est en traçant les éléments de solution revenir au problème. Le 0
Se et 1
s en langage machine est très difficile à retracer, alors que la Student
classe est facile à retracer. Toutes les classes d'AO trace facilement à l'espace de problème, mais beaucoup le font.
Les abstractions de PF n'ont-elles pas toujours besoin d'être expliquées pour savoir quelle partie de l'espace à problèmes elles résolvent (à part les problèmes mathématiques )?OK - je suis bon sur cette partie. Après avoir examiné de nombreux autres exemples, je vois comment les abstractions FP sont très claires pour certaines parties du problème exprimées dans le traitement des données.
La réponse acceptée à une question connexe UML peut-il être utilisé pour modéliser un programme fonctionnel? - dit "Les programmeurs fonctionnels n'ont pas beaucoup d'utilisation pour les diagrammes." Je ne me soucie pas si elle est langage UML, mais je me demande sur les abstractions PF étant faciles à comprendre / communiquer, s'il n'y a pas des schémas qui sont largement utilisés ( en supposant que cette réponse est juste). Encore une fois, mon niveau de FP utilisation / compréhension est trivial, donc je comprends pas besoin de schémas sur les programmes de PF simples.
OO Fournisseur de conception a Fonction / classe / package-niveau d'abstraction, avec encapsulation (contrôle d'accès, en se cachant de l'information) à chaque, ce qui rend plus facile gérer la complexité. Ce sont des éléments qui permettent de passer du problème à la solution et vice-versa plus facilement.
De nombreuses réponses parlent de la manière dont l' analyse et la conception se font en FP dans un analogue de manière à OO, personne ne cite rien mais de haut niveau à ce jour (Paul cite des choses intéressantes, mais il est de bas niveau). J'ai fait beaucoup de recherches sur Google hier et trouvé une discussion intéressante. Ce qui suit est extrait de Refactoring Functional Programs de Simon Thompson (2004) (c'est moi qui souligne)
Lors de la conception d'un système orienté objet, il est tenu pour acquis que la conception précédera la programmation. Les conceptions seront écrites à l'aide d'un système comme UML qui est pris en charge dans des outils tels que Eclipse. Les programmeurs débutants pourraient bien apprendre une approche de conception visuelle en utilisant des systèmes comme BlueJ. Œuvre sur une méthodologie similaire pour la programmation fonctionnelle est rapporté dans DCP: Analyse fonctionnelle et conception , guère d' autres tâches existe. Il peut y avoir plusieurs raisons pour cela.
Les programmes fonctionnels existants sont d'une échelle qui ne nécessite pas de conception. De nombreux programmes fonctionnels sont petits, mais d'autres, comme le Glasgow Haskell Compiler, sont importants.
Programmes fonctionnels modélisent directement le domaine d'application, rendant ainsi la conception hors de propos. Alors que les langages fonctionnels offrent une variété d'abstractions puissantes, il est difficile de soutenir que ceux - ci fournissent tous et que les abstractions nécessaires pour modéliser le monde réel.
programmes fonctionnels sont construits comme une série de prototypes en constante évolution.
Dans la thèse citée ci - dessus , les avantages de l' utilisation méthodologies d' analyse et de conception (ADM) sont présentés indépendamment des paradigmes. Mais un argument avancé est que les SMA doivent aligner sur le modèle de mise en œuvre. C'est, OOADM fonctionne le mieux pour la programmation orientée objet et n'est pas bien appliquée à un autre paradigme, comme FP. Voici une citation que je pense paraphrases ce que j'appelle déficit de représentation:
on peut argumenter longuement au sujet de laquelle paradigme offre le meilleur soutien au développement de logiciels, mais on obtient package de développement le plus naturel, efficace et efficace lorsque l'on reste dans un seul paradigme de la description du problème par le biais de mise en œuvre et la livraison.
Voici l'ensemble des schémas proposés par DCP:
- diagrammes de dépendance des fonctions qui présentent une fonction avec ceux qu'il utilise dans sa mise en œuvre;
- la dépendance de type diagramme qui fournit le même service pour les types; et,
- diagrammes de dépendance du module qui présentent des vues de l'architecture du module du système.
Il y a une étude de cas dans la section 5.1 de la thèse FAD, qui est un système pour automatiser la production de données relatives à une ligue de football (soccer). Les exigences sont 100% fonctionnelles, par exemple, saisir les résultats du football, produire des tableaux de ligue, des tableaux de pointage, des tableaux de présence, transférer des joueurs entre les équipes, mettre à jour les données après de nouveaux résultats, etc. Aucune mention du fonctionnement du FAD pour résoudre les exigences non fonctionnelles n'est documentée , en plus de déclarer que "les nouvelles fonctionnalités devraient être autorisées à un coût minime", ce qui est presque impossible à tester.
Malheureusement, en dehors de FAD, je ne vois aucune référence moderne pour les langages de modélisation (visuels) qui sont proposés pour FP. UML est un autre paradigme, nous devons donc l'oublier.