Voilà maintenant quelques mois que j'ai commencé la POO, et l'utilisant jusqu’à maintenant de façon simple pour essayer de bien comprendre sans pour l'instant m'occuper de l'optimisation, je me pose depuis quelques temps tout de même quelques questions sur lesquels j'aimerais bien avoir vos réponses et vos techniques. Tout ça dans une optique d'optimisation et bien sûr de meilleur compréhension.
J'ai par exemple une application Calendrier. Composé de différentes classes : User, Event, Category, Group...
Chaque classe qui représente ici un objet à son gestionnaire implémentant toutes les requêtes vers la DB.
J'ai avec une base de données relationnelles et chacun des objets cités à une table qui lui correspond.
Pour expliquer ma question, je vais vous donner un exemple lors de l'affichage d'un Event.
Tout d'abord, voici un DESC de ma table Event :
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(30) | NO | | NULL | |
| description | text | NO | | NULL | |
| date_start | date | NO | | NULL | |
| time_start | time | YES | | NULL | |
| date_end | date | NO | | NULL | |
| time_end | time | YES | | NULL | |
| adress | varchar(255) | YES | | NULL | |
| phone | varchar(30) | YES | | NULL | |
| category | int(5) unsigned | NO | MUL | NULL | |
| user | int(5) unsigned | NO | MUL | NULL | |
| visible | tinyint(1) | NO | | 1 | |
+-------------+------------------+------+-----+---------+----------------+
category, group, user représente simplement les ID des objets dans leur table respective. Donc quand j'affiche un Event, j'appelle la méthode de son gestionnaire : $manager->getEvent($id) par exemple qui va chercher les données et qui me retournera un objet Event avec ses données hydratées.
Mais lorsque j'affiche les données, j'ai dans mon objet hydraté uniquement les ID des objets.
Alors affiché le nom de la catégorie avec l'ID 17, je serai donc obliger d'instancier le gestionnaire de Category et de faire $categoryManager->get(17); pour obtenir les informations sur ma catégorie.
Ça me fait donc une requête en plus. Et puis pareil pour afficher l'auteur (ici user), je dois faire la même chose.
Je connais les jointures, et je sais les utilisés. Mais est ce que ça ne serait pas "non conforme au concept de la POO" de ne pas tout traiter comme un objet ?
Pour l'instant dans mon objet Event : j'ai les méthodes setTitle, setId... Celles ci ne font que définir un attribut.
Si j'utilise une jointure : ma méthode setCategory deviendrait alors quelque chose comme :
public function setCategory( $id )
{
$categoryManager = new CategoryManager($this->db);
$this->category = $categoryManager->get($id);
}
Mon objet se mettrait alors à contenir plein d'autre méthodes et appellerait plusieurs gestionnaires. Qu'en pensez vous ? Est ce la bonne solution ? Ou celle que j'utilise actuellement est la bonne.Il y aussi une autre question qui me turlupine : est qu'un gestionnaire d'un objet à le droit de retourner d'autre objet. Je veux dire par droit, est ce une bonne façon de faire ?
Par exemple, si je veux récuperer tous les Event d'une Category. Faut il implémenter dans le CategoryManager une méthode getEvents(Category $category) qui ferait donc une requête sur la table Events et récupérerait les Event ou l'ID de la Category est égale à la sienne.
Ou, est il mieux d'implémenter la méthode dans EventManager avec une méthode getEventsCategory(Category $category) qui ferait la même requête.
Pour ma part je pense la deuxième solution étant celle convenable. Mais sachant que Category et Event sont deux objets "dépendant" (un Event doit avoir une Category) cela doit reste correct ?
Merci à ceux qui me liront et encore plus à ceux qui me répondront.