Push ifs up and fors down: The idiom, its algebra, and its limits
La heuristique consiste à remonter les conditions vers l'appelant et à descendre les boucles vers des traitements par lots afin de centraliser les branchements et favoriser des boucles internes sans branche. Par exemple, déplacer le test de None vers le code appelant permet de remplacer Option<Walrus> par Walrus et d'implémenter frobnicate_batch qui parcourt un vecteur sans considérer le cas None. Dans les bases de données on retrouve la même idée: pousser projections et sélections tôt dans le plan d'exécution et retarder les jointures pour réduire les volumes traités par les opérations chères. En programmation fonctionnelle et en théorie des catégories, cela s'interprète comme une restriction à un sous-objet et comme la factorisation d'une fonction sur un coproduit, et la loi filter/map issue de la naturalité explique quand déplacer un filtrage avant ou après un map est légitime. Ces réécritures ne sont valides que sous certaines contraintes (condition invariante de boucle, prédicat se limitant à une seule table, ou réduction p . f en un prédicat économique) et elles visent aussi des gains de coût en transformant A->B en traitements par lots [A]->[B].