Je lis actuellement Robert Martin's Clean Code . Je pense que c'est génial, et quand écrit OO code Je prends ses cours au cœur. En particulier, je pense que ses conseils d'utiliser de petites fonctions avec des noms significatifs rendent mon code beaucoup plus en douceur. Il est mieux résumé par cette citation:
[W] E veut être en mesure de lire le programme comme s'il s'agissait d'un ensemble de paragraphes, chacun décrivant le niveau actuel d'abstraction et de référencement après les paragraphes au niveau suivant.
(Nettoyer le code, page 37: Un "paragraphe" est un paragraphe qui commence par une phrase exprimée dans l'infinitif. "Pour faire x, nous effectuons des étapes Y et Z." "Pour faire Y, Nous ... "etc.) Par exemple:
Pour randerpagewithSetupsandAndowns, nous vérifions si la page est une page de test et, dans l'affirmative, nous incluons les configurations et les démarches. Dans les deux cas, nous rendons la page en HTML
J'écris aussi du code fonctionnel pour mon travail. Les exemples de Martin dans le livre sont définitivement lus comme s'il s'agissait d'un ensemble de paragraphes et qu'ils sont très clairs - mais je ne suis pas sûr que "lit comme un ensemble de paragraphes" est une qualité souhaitable pour le code fonctionnel de .
En prenant un exemple de la Haskell Standard Bibliothèque :
maximumBy :: (a -> a -> Ordering) -> [a] -> a
maximumBy _ [] = error "List.maximumBy: empty list"
maximumBy cmp xs = foldl1 maxBy xs
where
maxBy x y = case cmp x y of
GT -> x
_ -> y
C'est à peu près aussi loin que possible des conseils de Martin, mais c'est concis, idiomatique Haskell. Contrairement aux Java _ exemples de son livre, je ne peux imaginer aucun moyen de refroidir que dans quelque chose qui a le genre de cadence qu'il demande. Je soupçonne que Haskell écrit à la norme de Clean Code se décollerait depuis longtemps et non naturel.
Ai-je tort à envisager (au moins une partie de) Clean Code en attente avec les meilleures pratiques de programmation fonctionnelle? Y a-t-il une façon raisonnable de réinterpréter ce qu'il dit dans un autre paradigme?
Le code de nettoyage est avant tout un manuel de style. Strunk and White ne s'applique pas lorsque vous écrivez à Klingon. L'idée est que vous souhaitez être claire pour les programmeurs qui vont probablement lire votre code. Vous voulez avoir du code modularisé et facile à restructurer. Il existe des moyens de le faire à Haskell, comme il existe des moyens de le faire dans une autre langue, mais les détails précis varieront.
Cela étant dit, il y a un certain nombre de style lignes directrices là-bas pour Haskell. Le débordement de la pile a un assez complet guide aussi. Garder la logique de codage simple et bref semble être assez constant. La généralisation des fonctions est également soulignée car elle conduit à la modularité. DRY code est également stressé, comme avec le code de nettoyage.
En fin de compte, les directives de codage de Code Netty Code et de Haskell s'efforcent de la même chose, mais de la liquidation prenant leurs propres chemins pour y arriver.
Je ne suis pas sûr de suivre ce que vous entendez par votre exemple. Les paragraphes, comme il les décrit, ne nécessitent pas d'endurance longue. Il ne signifie pas que le code devrait lire comme l'anglais. La partie importante est le regroupement de fonctionnalités au même niveau d'abstraction, dans une progression logique. C'est un concept structurel théorique qui transcende les paradigmes de programmation.
Exprimé au format "au paragraphe" de Bob Martin, j'ai lu votre exemple comme suit:
maximumBy
, vous avez besoin d'une fonction de commande et d'une liste, et le résultat est un élément de cette liste.maximumBy
d'une liste vide et une fonction de commande est une erreur.maximumBy
d'une liste xs
, vous repliez la liste à l'aide de la fonction maxBy
.maxBy
de deux éléments de liste, vous les comparez à l'aide de la fonction de commande donnée. Si le premier élément est plus grand, choisissez-le. Sinon, choisissez la seconde.Vous commencez avec les concepts les plus généraux et que vous progressez plus en détail, comme dans les exemples impératifs. L'idée des "paragraphes" est que vous pouvez arrêter de lire à un moment donné lorsque vous avez reçu suffisamment de détails, sans avoir à sauter de haut en bas de la page. C'est certainement le cas ici.
Un couple de noms pourrait peut-être être mieux, mais ils sont des conventions courantes de la langue, en particulier lors de la rédaction de fonctions génériques supérieures à l'ordre. Les noms de fonction d'ordre supérieur ne se traduisent pas non plus en phrases verbales impératives comme les exemples du livre, car ils décrivent davantage les relations entre les verbes.
Il existe des moyens de mettre en œuvre cela qui ne suivent pas les directives "au paragraphe". Laissant la signature de type explicite omettrait la phrase "Vue d'ensemble" de niveau supérieur. Vous pouvez utiliser une expression IF pour la manipulation des erreurs au lieu de la correspondance des motifs, ce qui confierait cela de manière inappropriée avec un autre niveau d'abstraction. Vous pouvez en ligne maxBy
comme fonction anonyme au lieu de lui donner un nom qui peut être décrit plus loin plus en détail.
En fait, je pense que construit des constructions comme where
effectivement est un meilleur adapté au format de paragraphe, car vous pouvez les utiliser pour donner un nom à un détail plus profond de la manière dont Nous l'exprimons en anglais et limitait de la même manière sa portée de manière claire au contexte du "paragraphe".