Bonjour
J'essaye de me familiariser avec le langage objet (PHP tend principalement vers la POO depuis un bon moment et pas moi ;/ ) et j'aurais quelques petites questions
J'ai créé les 2 class suivantes
La class Membre :
la class MembresManager :
On a bien une class, un rôle. Une class pour représenter le membre, une autre class pour gérer les membres.
J'ai 3 problèmes.
Problème 1 :
Dans ma class membre je me retrouve avec une 30aine d'attributs.
J'ai l'impression que ça fait beaucoup :/
Ce qui signifie que sur chaque page ou j'affiche la moindre info sur des membres, je crée des instances de la class Membre qui ont donc autant d'attributs. Peu importe la quantité d'info dont j'ai besoin sur la page concernant ces membres. Je trouve ça dommage et peu optimisé.
Exemple, sur la page d'accueil j'affiche les 10 derniers inscrits je fais ceci :
$membres est un tableau d'objets Membre.
Dans ma fonction getListMembres, chaque ligne retournée (soit les 10 demandées) crée un objet Membre avec seulement quelques attributs initialités (login, id_avatar, date_inscription...), les seuls attributs utiles pour ce genre de demande.
N'est-ce pas un peu lourd au niveau mémoire etc. de créer 10 objets avec autant d'attributs, alors que sur ma page d'accueil j'ai uniquement besoin d'afficher son image de profil (avatar), login et date d'inscription?
Problème 2 :
Si on regarde ma fonction getListMembre on voit que je fais une jointure avec une table t_avatars et que je récupère l'avatar du membre. Mais Voila une question me turlupine.
Dois je directement mettre l'attribut avatar (qui correspond au nom de l'image) dans la class Membre ou dois je crée un attribut objavatar qui sera une instance d'une class Avatar ?
En gros j'ai du mal à construire mes class lorsque des données se croisent (tables relationnelles : jointures)
Pour bien différencier les rôles, j'imagine bien une class Avatar et dans la class Membre je fais la fonction set suivante lorsque j'hydrate l'objet Membre :
Un truc dans le genre
Comment feriez vous ? Le problème avec ma solution, je créerais une dépendance assez forte entre ma class membre et la class Avatar (je ne sais pas si c’est vraiment un problème). Je crois que dans ce cas je crée une dépendance de type Composition, si j'ai bien compris.
Problème 3 :
Il s'agit en fait d'un problème que j'avais déjà énoncé dans mon topic concernant le patern MVC.
J'ai constaté qu'avec le langage objet on se retrouve très vite avec un grand nombre d'include (require) de fichiers. Sachant qu'il est généralement conseillé de créer un fichier pour une class.
Alors certes j'utilise l'autoloaded afin que ça charge automatiquement les fichiers (class) qui sont demandées sur la page (ceci évite également d'avoir a faire tous les includes sur les pages). Mais si je prend l'exemple de ma page d'accueil ou j'affiche les derniers membres inscrits, les derniers articles, les derniers commentaires etc. on fini très vite par inclure un bon paquet de class :
Membre
MembresManager
Article
ArtcilesManager
Commentaire
CommentairesManager
Avatar (si je prend cette solution)
AvatarsManager
etc...
le site est surement mieux structuré, et plus facilement maintenable avec ce système, mais d'un point de vue optimisation je n'arrive pas à être convaincu
Je me sers sûrement très mal de la POO :?
J'essaye de me familiariser avec le langage objet (PHP tend principalement vers la POO depuis un bon moment et pas moi ;/ ) et j'aurais quelques petites questions
J'ai créé les 2 class suivantes
La class Membre :
Code:
class Membre {
protected $id_membre,
$login_membre,
$password_membre,
$date_demande_pass,
$nom_membre,
$prenom_membre,
$email_membre,
$id_avatar,
$nb_commentaires,
$date_inscription,
$date_connexion,
...
etc. (environ 28 attributs)
public function __construct($valeurs=array())
{
if(!empty($valeurs)) //si on a spécifié des valeurs alors on hydrate l'objet
{
$this->hydrate($valeurs);
}
}
public function hydrate($donnees)
{
foreach ($donnees as $attributs => $valeur)
{
$methode = 'set'.ucfirst($attribut);
if (is_callable(array($this, $methode)))
{
$this->$methode($valeur);
}
}
}
public function setId_membre($id_membre)
{
$this->id_membre=$id_membre;
}
public function getId_membre()
{
return $this->id_membre;
}
public function setLogin_membre($login_membre)
{
$this->login_membre=$login_membre;
}
public function getLogin_membre()
{
return $this->login_membre;
}
….....
…....
…....
etc.
}
la class MembresManager :
Code:
class MembresManager
{
protected $_connexion;
const ORDER_LAST_MEMBRES = 1;
const ORDER_ACTIFS_MEMBRES = 2;
public function __construct(PDO $bdd)
{
$this->setConnexion($bdd);
}
function getListMembres($debut=0,$fin=10, $order=MembresManager::ORDER_LAST_MEMBRES) {
$sql='select m.login_membre, m.date_inscr_membre, m.id_avatar, a.avatar'
. ' from t_membres AS m'
. ' INNER JOIN t_avatars AS a ON (a.id_avatar=m.id_avatar)';
if($order==MembresManager::ORDER_ACTIFS_MEMBRES)
{
$sql .= ' order by m.nb_jours_actifs DESC ';
}
else
{
$sql .= ' order by m.date_inscr_membre DESC ';
}
$sql .= ' LIMIT :deb,:fin ';
$requete = $this->_connexion->prepare($sql);
$requete->bindValue(':deb',(int) $debut, PDO::PARAM_INT);
$requete->bindValue(':fin',(int) $fin, PDO::PARAM_INT);
$requete->execute();
//retourne directement le résultat dans un objet de la classe Article. FETCH_PROPS_LATE lance le constructeur avant que PDO assigne les valeurs
$requete->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Membre');
$listeMembres=$requete->fetchall();
$requete->closeCursor();
return $listeMembres;
}
protected function setConnexion(PDO $bdd){
if($bdd instanceof PDO)
{
$this->_connexion=$bdd;
}
}
}
On a bien une class, un rôle. Une class pour représenter le membre, une autre class pour gérer les membres.
J'ai 3 problèmes.
Problème 1 :
Dans ma class membre je me retrouve avec une 30aine d'attributs.
J'ai l'impression que ça fait beaucoup :/
Ce qui signifie que sur chaque page ou j'affiche la moindre info sur des membres, je crée des instances de la class Membre qui ont donc autant d'attributs. Peu importe la quantité d'info dont j'ai besoin sur la page concernant ces membres. Je trouve ça dommage et peu optimisé.
Exemple, sur la page d'accueil j'affiche les 10 derniers inscrits je fais ceci :
Code:
$objMembresMg= new MembresManager($bdd);
$membres=$objMembresMg->getListMembres(0,10, MembresManager::ORDER_LAST_MEMBRES);
$membres est un tableau d'objets Membre.
Dans ma fonction getListMembres, chaque ligne retournée (soit les 10 demandées) crée un objet Membre avec seulement quelques attributs initialités (login, id_avatar, date_inscription...), les seuls attributs utiles pour ce genre de demande.
N'est-ce pas un peu lourd au niveau mémoire etc. de créer 10 objets avec autant d'attributs, alors que sur ma page d'accueil j'ai uniquement besoin d'afficher son image de profil (avatar), login et date d'inscription?
Problème 2 :
Si on regarde ma fonction getListMembre on voit que je fais une jointure avec une table t_avatars et que je récupère l'avatar du membre. Mais Voila une question me turlupine.
Dois je directement mettre l'attribut avatar (qui correspond au nom de l'image) dans la class Membre ou dois je crée un attribut objavatar qui sera une instance d'une class Avatar ?
En gros j'ai du mal à construire mes class lorsque des données se croisent (tables relationnelles : jointures)
Pour bien différencier les rôles, j'imagine bien une class Avatar et dans la class Membre je fais la fonction set suivante lorsque j'hydrate l'objet Membre :
Code:
public function setAvatar($avatar)
{
$this->avatar= new Avatar(array(avatar => $avatar));
}
Un truc dans le genre
Comment feriez vous ? Le problème avec ma solution, je créerais une dépendance assez forte entre ma class membre et la class Avatar (je ne sais pas si c’est vraiment un problème). Je crois que dans ce cas je crée une dépendance de type Composition, si j'ai bien compris.
Problème 3 :
Il s'agit en fait d'un problème que j'avais déjà énoncé dans mon topic concernant le patern MVC.
J'ai constaté qu'avec le langage objet on se retrouve très vite avec un grand nombre d'include (require) de fichiers. Sachant qu'il est généralement conseillé de créer un fichier pour une class.
Alors certes j'utilise l'autoloaded afin que ça charge automatiquement les fichiers (class) qui sont demandées sur la page (ceci évite également d'avoir a faire tous les includes sur les pages). Mais si je prend l'exemple de ma page d'accueil ou j'affiche les derniers membres inscrits, les derniers articles, les derniers commentaires etc. on fini très vite par inclure un bon paquet de class :
Membre
MembresManager
Article
ArtcilesManager
Commentaire
CommentairesManager
Avatar (si je prend cette solution)
AvatarsManager
etc...
le site est surement mieux structuré, et plus facilement maintenable avec ce système, mais d'un point de vue optimisation je n'arrive pas à être convaincu
Je me sers sûrement très mal de la POO :?