Bonjour,
Voilà une question qui m'empêche régulièrement de dormir.
Admettons que j'ai un 1er objet NEWS qui comme son nom l'indique représente une news sur un site web, et un autre objet USER qui correspond à un utilisateur inscrit de ce même site web. A coté de ça, on à une base de donnée qui contient ces 2 tables et dont les champs correspondent aux attributs de ces 2 class (cas très classique en somme) :
On fait abstraction des setters et getters qui ne sont pas utiles pour la question.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 class news { public $id; public $titre; public $texte; public $redacteur; // en BDD, contient l'ID d'un user public function GetRedacteur() {} // retourne un objet de type user } class user { public $id; public $nom; public $prenom; } // et comme on est civilisé, on va utiliser des managers pour gérer la persistance class ManagerNews { private $bdd; public function add(news $n) {...} public function upd(news $n) {...} public function del(news $n) {...} public function get($id) {...} } class ManagerUser { private $bdd; public function add(user $u) {...} public function upd(user $u) {...} public function del(user $u) {...} public function get($id) {...} }
Imaginons maintenant que je veuille instancier une NEWS à partir d'un enregistrement de la base de données :
La question est donc de savoir que faut-il stocker dans l'attribut news::redacteur, et donc indirectement que doivent faire les fonctions news::getRedacteur() et surtout managerUser::get(), car je vois au moins 2 façons distinctes de faire, toutes 2 lourdes d'inconvénients...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $mn = new ManagerNews(); $MyNews = $mn->Get(10);
1) On peut stocker un objet de type USER, auquel cas, il faudra le créer en même temps que l'instance de news. Du coup, news::user() retournera juste cet attribut brut de décoffrage. Par contre, je trouve cette solution très inquiétante pour les perfs de l'appli, surtout si user contient a son tour des objets.
2) on peut stocker l'ID (integer) du user qui à rédigé la news, et chaque appel à news::getRedacteur() entrainera la création d'un managerUser et un appel BDD pour créer $redacteur...
J'avais opté dans un précédent projet pour un système de cache, ou on stock l'id à la création de l'objet et un attributs de cache vide. A chaque appel de getRedacteur(), on test alors si il y a quelque chose dans la variable de cache, on instancie l'objet et on la met dans le cache si c'est pas le cas, puis on retourne le cache. Cette solution combine à priori les avantage des 2 méthodes sans les inconvénients, sinon de perdre un peu le contrôle sur la consommation mémoire de l'appli, mais elle me laisse une impression de sale et j'ai l'impression de passer à coté de quelque chose...
Aussi à votre avis, quelle est la meilleure façon de faire ?
Partager