Aujourd'hui je vous propose de parler Design Pattern, et plus particulièrement d'un pattern intéressant à mettre en place quand on cherche à alléger (en mémoire) une application : le pattern Flyweight (poid mouche).
l'application doit manipuler de très nombreuses Entités (des produits pour une boutique par exemple), et chaque Entité est représentée par un Objet. L'instanciation de tous ces objets est très gourmande en mémoire :
$oDataMapper = new DataMapper_Product();
$tRowset = $oDataMapper->fetchAll($where);
foreach($tRowset as $oProduct) {
// one instance of Product $oProduct is created in each loop
echo $oProduct->getName();
}
On voit le problème : pour chaque ligne récupérée, un objet est instancié, donc est créé, chargé en mémoire... c'est lent et coûteux.
Il suffit de n'instancier qu'une seule fois l'objet en question, et de l'hydrater au fur et à mesure du besoin :
$oDataMapper = new DataMapper_Product();
$tRowset = $oDataMapper->fetchAll($where);
// Only one instance of Product is used
$oProduct = new Product;
foreach($tRowset as $tInfosAboutProduct) {
$oProduct->hydrate($tInfosAboutProduct);
echo $oProduct->getName();
}
Ce qui dans notre cas pourrait donner par exemple cette classe :
class Product extends Dao {
protected $_name;
protected $_price;
(... getter and setters ...)
public function hydrate(array $tData) {
$this
->setName($tData['name'])
->setPrice($tData['price']);
return $this;
}
}
Les performances sont dans ce cas meilleures, et l'utilisation mémoire est plus réduite.
Ce type de pattern n'est pas forcément adapté dans toutes les situations, on l'utilise :
Et vous, avez-vous déjà utilisé ce pattern ? Quel est votre retour d'expérience ?
OctoFirst
Voyez où votre équipe coince
Le projet sur lequel je bosse en ce moment. Vos pull requests en disent déjà long : où l'équipe se grippe, comment l'activité se répartit entre bugs, features et refacto. OctoFirst en fait des signaux clairs, sans reporting à faire à la main.
Y jeter un œil, c'est gratuit
Audit & Formation
Disponible sur Malt
Besoin d'un regard extérieur sur votre code ? J'accompagne les équipes PHP sur l'architecture, les tests et l'industrialisation, au rythme de vos projets.
Me trouver sur Malt© Jean-François Lépine, 2010 - 2026 · Flux RSS