Résumé
La règle d’Object Calisthenics «un seul niveau d’indentation par méthode» se heurte vite à un cas banal: sortir d’une boucle dès qu’une condition est vraie. Le return anticipé dans la boucle est simple et lisible, et il ajoute un second niveau; continue et break posent le même problème. La question de l’article est de garder la règle sans perdre la sortie.
Première réponse: déléguer le test au callback de array_reduce. La fonction parcourt tout le tableau, mais reste linéaire, et le temps mesuré sur cinquante mille éléments est presque celui de la version naïve. Dans d’autres cas, array_filter ou array_map font le même travail, et JavaScript offre Array.prototype.some.
Deuxième réponse: une fonction récursive qui réduit le tableau avec array_pop et se rappelle tant que les conditions tiennent. Même complexité en théorie, mais la récursion occupe de l’espace, et la mesure est dix fois moins bonne. Ma recommandation est donc array_reduce, ou toute fonction intégrée, dans presque tous les cas.
Ce que j’en retiens dépasse PHP: les règles d’Object Calisthenics disent quoi faire, pas comment. Choisir le bon construit rend le code plus fluide et plus propre sans rien coûter en performance.
Idées clés
- Un return, un continue ou un break dans une boucle ajoute un second niveau d’indentation, contraire à la règle.
- array_reduce, ou une autre fonction intégrée, garde une complexité linéaire et un temps proche de la boucle naïve.
- La récursion respecte la règle et la complexité, mais coûte environ dix fois plus en pratique.
- Les règles d’Object Calisthenics disent quoi faire, pas comment le faire.
Pourquoi j’ai écrit cet article
Pour répondre à une question que la règle «un seul niveau d’indentation» d’Object Calisthenics pose dès la première boucle: comment sortir d’une boucle dès qu’une condition est vraie sans second niveau, et ce que chaque réponse, array_reduce ou récursion, coûte en pratique.