130 votes

Bases de données et de programmation fonctionnelle sont en désaccord ?

J'ai été un développeur web pour un certain temps maintenant, et nous avons récemment commencé à apprendre la programmation fonctionnelle. Comme d'autres, j'ai eu quelques significative de la difficulté à appliquer plusieurs de ces concepts à mon travail. Pour moi, la principale raison pour cela est que je vois un conflit entre les entre les FP de l'objectif de rester apatrides semble tout à fait en désaccord avec le fait que la plupart de développement web que j'ai fait a été fortement liée à des bases de données, qui sont très centrées sur les données.

Une chose qui m'a fait beaucoup plus productif développeur sur la programmation orientée objet côté des choses a été la découverte de l'objet-relationnel mappeurs comme MyGeneration d00dads pour .Net, Class::DBI pour perl, ActiveRecord pour ruby, etc. Cela m'a permis de rester à l'écart de l'écriture d'insertion et de sélectionner les déclarations de tous les jours, et de se concentrer sur le travail avec les données facilement comme des objets. Bien sûr, je pourrais encore écrire des requêtes SQL lorsque leur puissance est nécessaire, mais sinon elle a été prélevée bien derrière les coulisses.

Maintenant, se tournant vers fonctionnelle de la programmation, il semble comme avec la plupart des FP frameworks web comme des Liens nécessitent l'écriture de beaucoup de passe-partout de code sql, comme dans cet exemple. Weblocks semble un peu mieux, mais il semble qu'il utilise une sorte de modèle de programmation orientée objet pour travailler avec les données, et nécessite encore de code écrit manuellement pour chaque table dans votre base de données comme dans cet exemple. Je suppose que vous utilisez certains de génération de code à écrire ces fonctions de cartographie, mais qui semble décidément onu-lisp.

(Remarque je n'ai pas regardé Weblocks ou des Liens très près, j'ai peut-être juste de l'incompréhension comment ils sont utilisés).

La question est donc, pour l'accès à la base de parties (qui, je le crois assez grand) de l'application web, ou d'autres nécessitant une interface avec une base de données sql, nous semblent être forcé vers le bas l'un des chemins suivants:

  1. Ne pas Utiliser la Programmation Fonctionnelle
  2. Accéder à des Données dans un ennuyeux, onu-abstraites manière qui implique l'écriture manuelle de beaucoup de SQL ou SQL-like code ala Liens
  3. La Force de notre Langage fonctionnel en une pseudo-paradigme de la programmation orientée objet, donc en enlevant une partie de l'élégance et de la stabilité de la vraie programmation fonctionnelle.

À l'évidence, aucune de ces options semblent idéales. A trouvé un moyen de contourner ces problèmes? Est-il vraiment encore un problème ici?

Note: personnellement, je suis plus familier avec le LISP sur le pc avant, donc, si vous voulez donner des exemples et de connaître de multiples FP langues, lisp serait probablement la langue officielle de leur choix

PS: Pour les Questions spécifiques à d'autres aspects du développement web, voir à cette question.

83voto

HLGEM Points 54641

Venir à ce à partir d'une base de données de personne, je trouve que les développeurs front end essayez trop dur de trouver des moyens de rendre les bases de données de rentrer dans leur modèle, plutôt que de considérer des façons les plus efficaces d'utiliser une base de données qui ne sont pas orientés objet ou fonctionnel, mais relationnel et à l'utilisation de la théorie. J'ai vu ce qui est généralement le résultat à une baisse des performances du code. Et de plus, il crée un code qu'il est difficile d'optimisation des performances.

Lorsque l'on considère l'accès à la base il y a trois considérations principales - l'intégrité des données (pourquoi toutes les règles commerciales doivent être appliquées au niveau de la base de données de niveau pas par le biais de l'interface utilisateur), de performance et de sécurité. SQL est écrit à gérer les deux premières considérations plus efficacement que n'importe quel extrémité avant de la langue. Car il est spécifiquement conçu pour le faire. La tâche d'une base de données est très différente de ce que la tâche d'une interface utilisateur. Est-il étonnant que le type de code qui est le plus efficace dans la gestion de la tâche est conceptuellement différent?

Et les bases de données de détenir des informations cruciales pour la survie de l'entreprise. Est est étonnant que les entreprises ne sont pas prêts à expérimenter avec de nouvelles méthodes d'où leur survie est en jeu. Heck, de nombreuses entreprises ne sont pas disposées à même la mise à niveau vers de nouvelles versions de leur base de données existante. Il est donc inhérente conservatisme de conception de base de données. Et il est volontairement de cette façon.

Je ne voudrais pas essayer d'écrire des T-SQL ou de l'utilisation de la base de données de concepts de design pour créer votre interface utilisateur, pourquoi vous essayez d'utiliser la langue de votre interface et des concepts de design pour accéder à ma base de données? Parce que vous pensez que SQL n'est pas de fantaisie (ou la nouvelle) assez? Ou vous ne vous sentez pas à l'aise avec elle? Juste parce que quelque chose ne correspond pas au modèle que vous sentez le plus à l'aise, ne signifie pas qu'il est mauvais ou mal. Cela signifie qu'elle est différente et probablement différente pour une raison légitime. Vous utilisez un autre outil pour une tâche différente.

46voto

Svante Points 24355

Tout d’abord, je ne dirais pas que CLOS (Common Lisp Object System) est « pseudo-OO ». C’est première classe OO.

Deuxièmement, je crois que vous devriez utiliser le paradigme qui correspond à vos besoins.

Vous ne pouvez pas statelessly stocker des données, alors qu’une fonction est le flux de données et n’a pas vraiment besoin État.

Si vous avez plusieurs besoins mélangés entre eux, mélanger vos paradigmes. Ne restreignent pas vous-même à seulement en utilisant le coin inférieur droit de votre boîte à outils.

31voto

Kevin Albrecht Points 2527

Vous devriez regarder le papier "de la Tar Pit" par Ben Moseley et Peter Marques, disponible ici: http://web.mac.com/ben_moseley/frp/paper-v1_01.pdf

C'est un classique moderne qui détaille un paradigme de programmation/système appelé Fonctionnelle Programmation Relationnel. Bien que non directement reliées à des bases de données, il explique comment isoler les interactions avec le monde extérieur (bases de données, par exemple) à partir de la fonctionnelle de base du système.

Le document explique également comment mettre en place un système où l'état interne de l'application sont définies et modifiées à l'aide d'une algèbre relationnelle, qui est évidemment liée aux bases de données relationnelles.

Ce document ne sera pas donner une réponse exacte à la façon d'intégrer les bases de données et de la programmation fonctionnelle, mais il vous aidera à concevoir un système pour minimiser le problème.

26voto

J. Abrahamson Points 27606
  1. Les langages fonctionnels n'ont pas le but de rester apatrides, ils ont pour but de faire de la gestion de l'état explicite. Par exemple, en Haskell, vous pouvez considérer que l'État de monade comme le cœur de l'état "normal" et le IO monade une représentation de l'état qui doit exister à l'extérieur du programme. Deux de ces monades vous permettre de (a) représentent de façon explicite dynamique des actions et (b) construire la dynamique des actions en les composant à l'aide de referentially des outils transparents.

  2. Vous faites référence à un certain nombre de Formulaires, qui, par leur nom, résumé des bases de données comme des ensembles d'objets. Certes, ce n'est pas ce que les informations dans une base de données relationnelle représente! Par son nom, il représente de données relationnelles. SQL est une algèbre (langue) pour le traitement des relations sur un ensemble de données relationnelles et est en fait très "fonctionnelle". J'apporte cette manière de considérer que (a) les Formulaires sont pas la seule façon de mapper les informations de base de données, (b) que SQL est en fait une assez belle langue pour certaines conceptions de base de données, et (c) que les langages fonctionnels ont souvent de l'algèbre relationnelle mappages qui exposent la puissance de SQL dans un idiomatiques (et dans le cas de Haskell, typechecked) de la mode.

Je dirais que la plupart lisps êtes un pauvre homme de la fonctionnelle de la langue. Il est parfaitement capable d'être utilisé selon la reacute moderne fonctionnelle pratiques, mais comme il n'exigent pas de la communauté est moins susceptibles de les utiliser. Cela conduit à un mélange de méthodes, qui peuvent être très utiles, mais certainement obscurcit comment pur interfaces fonctionnelles pouvez toujours utiliser les bases de données de manière significative.

15voto

Mendelt Points 21583

Je ne pense pas que les apatrides de la nature de la pf langues est un problème de connexion à des bases de données. Lisp est un non-fonctionnels purs langage de programmation, donc il ne devrait pas y avoir de problème traitant avec de l'etat. Et pur langages de programmation fonctionnelle comme Haskell ont les moyens de traiter d'entrée et de sortie qui peut être appliquée à l'aide de bases de données.

À partir de votre question, il semble que votre problème principal est de trouver un bon moyen de faire abstraction de l'enregistrement de base de données, vous obtenez en retour à partir de votre base de données en quelque chose qui est lisp-y (lisp-ish?) sans avoir à écrire beaucoup de code SQL. Cela ressemble plus à un problème avec l'outillage et les bibliothèques que d'un problème avec la langue de paradigme. Si vous souhaitez faire pur FP peut-être lisp n'est pas la langue de droite pour vous. Common lisp semble de plus en plus sur l'intégration de bonnes idées de oo, fp et d'autres paradigmes que pure fp. Peut-être vous devriez être en utilisant Erlang ou Haskell si vous voulez aller à la pure FP route.

Je ne pense pas que les "pseudo-oo" des idées en lisp ont leur mérite. Vous voudrez peut-être essayer de l'en sortir. Si elles ne correspondent pas à la façon dont vous voulez travailler avec vos données, vous pouvez essayer de créer une couche sur le dessus de Weblocks qui vous permet de travailler avec vos données comme vous le souhaitez. Cela pourrait être plus facile que d'écrire tout ce que vous-même.

Avertissement: je ne suis pas un Lisp expert. Je suis surtout intéressé par les langages de programmation et ont joué avec Lisp/CLOS, Régime, Erlang, Python et un peu de Ruby. Dans les programmes quotidiens de la vie, je suis toujours obligé d'utiliser le C#.

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