Je viens de commencer à pirater avec de la grojure et, bien que j'adore la langue, je ne comprends pas comment faire certaines choses idiomatiquement.
Écrire une application Web à l'aide de Compojure, voici l'une de mes actions de contrôleur: p> J'écris cela de manière très impérative. Utilisation de tellement Voici le pseudocode pour ce que j'essaie de faire p> merci beaucoup! P> p> let code> S / si code> s / faire code> s, je ne peux pas m'empêcher de penser que je fais quelque chose de très faux. Comment voudrais-je écrire cela fonctionnellement? P>
3 Réponses :
Les styles de programmation fonctionnels encouragent à l'aide de fonctions de niveau supérieur tels que la carte, réduire et filtrer, elles vous obligent également à faire face à des structures de données immuables la plupart du temps. Rien n'est faux avec votre code jusqu'à présent, car vous n'avez pas cassé aucune règle de programmation fonctionnelle. Cependant, vous pouvez améliorer votre code un peu, comme la combinaison de lecteurs et si vous utilisez si-let. P>
Cela semble raisonnable et, étant donné que vos seuls effets secondaires sont "nécessaires", c'est-à-dire d'ajouter à la session, je ne l'appellerais pas terriblement impératif. Il y a trois changements que je ferais, bien que le troisième est facultatif:
si code> / laisse par paire dans un seul si-let code>. li>.
- Utilisez
(: FOO Bar) code> pour les recherches de mots clés sur une carte, pas (barre: foo) code>. C'est juste le moyen standard de le faire . Li>
- Ne vous inquiétez pas de créer un local pour
nouvel utilisateur code>, puisque vous ne l'utilisez qu'une seule fois; Vous pouvez simplement l'aligner. LI>
ul> Il y a un autre changement que je ne ferais pas, car je pense que cela réduirait la lisibilité. Cependant, c'est une question de style et de jugement, alors je vais le mentionner comme quelque chose que vous pensez. Remarquez comment chaque branche du si code> met fin au labyrinthe dans un appel à resp / redirection code>: vous pouvez extraire tous ces appels au niveau supérieur. et puis décider quels arguments lui passeront. Combiné avec les autres changements, il ressemblerait à: p> xxx pré> p>
C'est bien. Merci beaucoup!
Il n'y a rien de non fonctionnel sur Que devriez-vous faire sur les effets secondaires? Eh bien, ils sont parfois nécessaires, alors le défi est de savoir comment votre structure votre code pour s'assurer que les effets secondaires sont contrôlés et gérables (entièrement refactés dans une zone de danger de manutention spéciale de sorte que le reste de votre code puisse rester propre et purement fonctionnel. ). p>
Dans votre cas, vous pourriez envisager: P>
si code> - c'est une construction parfaitement bonne et purement fonctionnelle qui évalue une expression conditionnelle. Trop de si code> s dans un endroit peut-être un signe d'avertissement que vous devriez utiliser une construction différente (par exemple, Cond? Polymorphisme avec protocoles? MultiMethods? Une composition des fonctions d'ordre supérieur?) P >
faire code> est plus délicat: si vous avez un faire, cela implique que vous faites quelque chose pour un effet secondaire em>, qui est définitivement non fonctionnelle. Dans votre cas Connexion CODE> et UTILISATEUR / CREATE CORET> apparaît comme étant les coupables latéraux ici ici. P>
Merci beaucoup pour la longue réponse détaillée! À quoi ressemblerait une fonction de gestionnaire / créer une fonction de fonction? Et qu'entendez-vous par les drapeaux? La fonction retournerait les chaînes appropriées?
Il y a beaucoup d'options. Une solution pourrait être d'avoir une liste d'effets secondaires "actions" dans votre carte de réponse que la fonction de gestionnaire exécute en séquence. Vous voudrez peut-être également examiner comment fonctionne une partie du middleware anneau.
En effet, la construction "if-then-tree" a été inventée par John McCarthy, le créateur de LISP, spécifiquement pour faciliter la programmation fonctionnelle. en.wikipedia.org/wiki/mccarthy_formalisme