Artchitecture POO et optimisation SQL
Salut,
Je pose le problème ici car je développe en PHP, mais il concerne plus particulièrement la manière d'aborder le problème. Le concept, donc.
Pour expliquer mon propos simplement, je propose de prendre un exemple simple. imaginons que je dispose d'une table contenant des articles, et deux classes pour les gérer correctement.
Je vais au plus simple, je passe certains constructeurs, certaines vérifications de données, ainsi que la définition de certaines méthodes.
Code:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class Catalogue
{
protected $db;
public function creerArticle() { }
public function getArticlesByUser($username)
{
$articles = array();
$this->db->query('SELECT article_id, ... FROM article WHERE username = ...');
while ( $d = $db->fetch_assoc() )
{
$articles[] = new Article($d);
}
return $articles;
}
public function getArticlesByCategorie($username) { }
...
}
class Article()
{
protected $id;
protected $name;
...
function __construct($mixed)
{
if ( is_int($mixed) )
{
$this->db->query('SELECT article_id, ... FROM article WHERE id= ...');
$mixed = $db->fetch_assoc()
}
$this->id = $mixed['article_id'];
$this->name = $mixed['article_name'];
}
public function supprimer() { }
public function getName() { }
...
} |
En gros, c'est le principe, avec des contrôles sur l'intégrité des données en plus.
Le problème... Dans un soucis d'économiser les requetes SQL au nécessaire (et donc de ne pas charger tous les articles), le code devient vite crade, et ne respecte pas forcement les concepts de la POO. Du moins, la class Catalogue pourrait être static, ça ne changerait rien, et les arguments ne sont pas passés proprement à la class Article. Cependant, laisser la classe Article faire une requete SQL pour charger les données chaque article n'est pas envisageable !
Autre soucis, au niveau de la redondance SQL. Rien ne m'empeche de charger plusieurs fois un même objet (par exemple, si je fais un new Article(6) suivit d'un second new Article(6), 2 requetes SQL seront créées). de même si je fais un new Article(8) alors que cet article a déjà été chargé lors de l'appel de getArticlesByUser('toto') par exemple.
J'avais imaginé détourner le principe du sigleton (par exemple, un tableau static contenant plusieurs instances, selon l'ID de l'article), mais ça s'éloigne beaucoup trop du concept de la POO.
Bref, si vous avez des conseils sur l'architecture à adopter, ou même des mots clés à me donner pour faciliter mes recherches Google, ça m'aiderait beaucoup.
Merci d'avance.