Idées d'articles

De Patchwork.

Sommaire

Superposition de classe : une nouvelle dimension de factorisation au cœur du langage

La réutilisation, l'évolution ou l'adaptation rapide du code d'une application figurent parmi les préoccupations fortes des entreprises. Pourtant, les techniques classiques de structuration de code ne proposent bien souvent qu'une seule et unique dimension d'organisation, alignée sur les fonctionnalités de l'application. Ce problème de tyrannie de la décomposition dominante (Ossher et al., 1999) rend difficile la factorisation des aspects transverses tel que la sécurité, les synchronisations, les journaux, etc.

Notre objectif dans cette conférence est de présenter une nouvelle technique d'organisation de code, que nous avons appelée "superposition de classe", et qui permet, couplée à un second concept d' "héritage multiple d'application", d'ajouter une dimension supplémentaire de structuration du code.

Par des ajouts simples au langage PHP, superposition de classe et héritage multiple d'application rendent naturels de nombreux concepts souvent abstraits : la programmation orientée aspect, l'injection de dépendance, les classes et objets fantaisies (mock objects), les mécanismes d'extensibilité (plug-in) ou même corriger un bug dans une librairie tiers sans en changer ni le code ni les interfaces deviennent très faciles à faire. La technique permet également de rassembler des codes en libraires dont les dépendances relatives sont gérées automatiquement. À l'opposé, elle permet aussi de spécialiser une application pour un client particulier, par simple "superposition" de code sur celui existant.

Pour tenir ces promesses, nous ferons une présentation détaillée de ces techniques, appuyée sur l'implémentation qui en est faite dans notre framework de démonstration, Patchwork.

Décharger le serveur en confiant l'assemblage des pages au navigateur

Les serveurs Web sont typiquement limités par trois facteurs : le processeur, la mémoire vive et la bande passante. La recherche de performance amène généralement à identifier plusieurs zones dans une page HTML, qui ont chacune des durées de vie différentes. Une stratégie d'optimisation classique consiste alors à mettre en cache chacune de ces zones pendant cette durée.

Si cette technique permet d'économiser beaucoup de temps processeur, elle n'est pas suffisante pour économiser la bande passante, car même si seule une petite zone a changé, c'est toute la page qui doit être envoyée à nouveau. De plus, si le navigateur peut lui-même mettre en cache des pages grâce au protocole HTTP, il ne peut le faire que pour une page entière, et pendant le temps de vie de la zone la plus éphémère.

Nous proposons dans cette conférence de présenter une méthode de composition de pages au sein du navigateur dans laquelle chaque composant d'une même page fait l'objet d'une requête indépendante, et qui permet ainsi de pallier à ces deux difficultés. Couplé à une gestion fine des entêtes de cache HTTP, le serveur est ainsi complètement déchargé de la gestion des ressources qui n'ont pas changées : il n'a plus à gérer ni la composition des pages, ni leur transfert sur le réseau.

Au delà de cet aspect performance, qui mérite d'être démontré à grande échelle et peut tout à fait être discuté, cette solution pourrait avoir d'autres avantages : elle nous a d'une part imposé des contraintes au niveau de l'architecture du code de nos applications qui se sont avérées très structurantes ; d'autre part, elle nécessite l'exposition des données brutes via des URL, et en conséquence nos applications disposent naturellement d'une interface pour les requêtes AJAX ou autres services Web ; enfin, elle pourrait être un guide pour concevoir des applications "scalable", facilement distribuables à l'aide d'un Content Delivery Network (CDN).

Comment améliorer PHP ? avec un préprocesseur !

Dans cette conférence nous proposons de présenter les avantages significatifs qu'un préprocesseur de code intercalé au sein de la fonction __autoload() nous a apporté :

  • implémenter la superposition de classes (voir autre conférence du même auteur),
  • ajouter des constructeurs et destructeurs statiques au langage,
  • générer du code spécialisé en fonction du contexte d'exécution : supprimer le code mort, résoudre les constantes ou des portions de code de façon statique,
  • vérifier l'encodage des sources, supprimer les BOM parasites, pour un code 100% UTF-8,
  • analyser le code pour anticiper certaines erreurs (divergence des tables de traduction) ou pré-remplir certains caches (tables de traduction),
  • substituer des fonctions par d'autres, pour enrichir/corriger/intercepter leur comportement, et par exemple : charger une implémentations PHP des extensions mbstring et iconv si nécessaire ou détecter les problèmes potentiels liés à la casse des noms de fichiers sous Windows,
  • booster le mécanisme d'autoload par insertion/substitution de marqueurs à la volée,
  • libérer le constructeur PHP4 sans casser le code PHP4 ou 5 existant.

Certains de ces sujets ont déjà été discutés dans la communauté (constructeur statique), d'autres sont possibles grâce à des extensions (runkit pour la substitution de fonction) et d'autres encore sont à notre connaissance évoqués pour la première fois (marqueurs pour autoload).

Nous baserons notre conférence sur l'implémentation 100% PHP que nous avons faite d'un tel préprocesseur dans notre framework de démonstration, Patchwork.

Superframework – dopez vos développements PHP

Résultat direct de la conférence présentée au précédent forum de l'AFUP, Superframework est un projet issu de notre envie de rationaliser puis de partager notre pratique de développement en entreprise. À l'origine intimement entrelacé à notre framework maison (Patchwork), nous avons compris que son cœur pouvait être rendu indépendant et surtout compatible avec et complémentaire de la très grande majorité des frameworks et autres applications existantes.

En contrepied du mythe de la v2 et du cahier des charges parfait, notre pratique de développement est celle du chantier propre et des évolutions continues. Pourtant, cette pratique ne serait pas soutenable sans un outil adapté qui permette de maîtriser l'entropie apportée par les demandes de nos clients et nos propres idées.

Superframework permet d'organiser l'ensemble de ses développements sous la forme d'un arbre dont le tronc et les branches principales contiennent le code le plus générique, et dont les feuilles sont des instances spécialisées par client d'applications métier.

Nous montrerons comment cette organisation permet, au fil du temps, de rationaliser le processus de capitalisation d'expérience à travers la migration permanente du code depuis les feuilles vers les branches, en passant par des étapes de refactorisation amenant toujours plus de généricité.

À la fin de la conférence, en plus de savoir pourquoi, vous saurez aussi comment faire tourner Superframework sur votre code.