Pour moi, une classe est une définition d'une entité unique qui peut être en relation fonctionnellement avec d'autres classes et qui peut avoir des caractéristiques hérités d'autres classes.
Une classe métier représente une entité dont les propriétés et les méthodes font partie des données et des traitements métiers et donc de la base de données qui représente l'architecture et la mémoire du SI.
Créer des classes métier revient donc à faire une reproduction de la structure d'une base de données relationnelle, à la fois de ses tables, relations, vues et procédures stockées.
La structure d'une table se voit dans une définition de classe dont les propriétés sont les champs de la table et les méthodes sont les vues ou procédures stockées attachées à l'entité (une occurrence type de la table)
Les enregistrements (données) ou occurrences contenus dans une table sont représenté dans le modèle objet par une collection d'objets issus de la même classe représentant une entité.
Par exemple : La structure d'une table "Membre" est la définition de une entité qui lui correspond dans le modèle objet une classe Membre ayant des propriétés et méthodes caractérisant un membre type. Comme ses attributs (nom et prénom) et ses méthodes (set, get, ...)
Par contre, l'ensemble des enregistrement de la table Membre sont représentés par une classe CollectionDeMembres qui définit les caractèristiques de la collection (liste) des membres ainsi que son comportement. Et c'est cette classe qui peut contenir des méthodes de traitement SQL de groupe comme le "Select * From Membre"
Voici un exemple de rapprochement entre une petite base de données relationnelle et un modèle de classes métier.
Base de données : Messagerie
Code : Tout sélectionner
## Tables :
Create Table Membre (id int, nom varchar(20), prenom varchar(20), login varchar(20), motDePasse varchar(20));
Create Table Message (id int, contenu text, date datetime, idMembre int);
## Indexes/Realtions :
Alter Table Membre Add Constraint PkMembre Primary Key (id);
Alter Table Message Add Constraint FkMessageMembre Foreign Key (idMembre) References Membre.id On Update Cascade On Delete NoAction;
## Vues/Procédures stockées :
Create View getMembres As Select * From Membre;
Create View getMessages As Select * From Message msg Join Membre mbr On msg.idMembre=mbr.id order by date, mbr.id;
Create Procedure insertMembre(id, nom, prenom, login, motDePasse) As Insert Into Membre Values (@id, @nom, @prenom, @login, @motDePasse);
Create Procedure updateMembre(id, nom, prenom, login, motDePasse) As Update Into Membre Set nom=@nom, prenom=@prenom, login=@login, motDePasse=@motDePasse Where id=@id;
Create Procedure deleteMembre(id) As Delete From Membre Where id=@id;
Create Procedure selectMembre(id) As Select * From Membre mbr Join Message msg On mbr.id=msg.idMembre Where mbr.id=@id;
Create Procedure insertMessage(id, contenu, date, idMembre) As Insert Into Message Values (@id, @contenu, @date, @idMembre);
Create Procedure updateMessage(id, contenu, date, idMembre) As Update Message Set contenu=@contenu, date=@date, idMembre=@idMembre Where id=@id;
Create Procedure deleteMessage(id) As Delete From Message Where id=@id;
Create Procedure selectMessage(id) As Select * From Message msg Join Membre mbr On msg.idMembre=mbr.id Where msg.id=@id order by date;
Create Procedure selectMsgMembre(idMembre) As Select * From Message msg Join Membre mbr On msg.idMembre=mbr.id Where mbr.id=@idMembre order by date;
Classes métier :
class Membre {
//
private $id, $nom, $prenom, $login, $motDePasse;
public function __construct(){
//
}
//
public function setId($valeur) { $this->id = $valeur; }
public function setNom($valeur) { $this->nom = $valeur; }
public function setPrenom($valeur) { $this->prenom = $valeur; }
public function setLogin($valeur) { $this->login = $valeur; }
public function setMotDePasse($valeur){ $this->motDePasse = $valeur; }
public function set($id, $nom, $prenom, $login, $motDePasse){
$this->id = $id; $this->nom = $nom; $this->prenom = $prenom;
$this->login = $login; $this->motDePasse = $motDePasse;
}
//
public function getId() { return $this->id; }
public function getNom() { return $this->nom; }
public function getPrenom() { return $this->prenom; }
public function getLogin() { return $this->login; }
public function getMotDePasse(){ return $this->motDePasse; }
public function get(){
return array($this->id, $this->nom, $this->prenom, $this->login, $this->motDePasse);
}
//
public function getFromDb($id){
try {
// On utilise PDO pour se connecter au serveur MySQL
$pdo = new PDO('mysql:host=localhost;dbname=Messagerie',
'root', '');
// Indique à PDO de lever une exception en cas d'erreur
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// On définit la requête SQL/Vue/Procédure stockée à exécuter.
$sql = "Call selectMembre($id)"; //Procédure stockée
// On exécute la requête
$res = $pdo->query($sql);
// On lit le résultat
$rows = $res->fetchAll(PDO::FETCH_OBJECT);
$this->set($rows[0]->id, $rows[0]->nom, $rows[0]->prenom, $rows[0]->login, $rows[0]->motDePasse);
return $this->get();
}
catch (PDOException $e) {
// On retourne une exception PDO
return $e->getMessage();
}
}
public function addToDb(){
try {
// On utilise PDO pour se connecter au serveur MySQL
$pdo = new PDO('mysql:host=localhost;dbname=Messagerie',
'root', '');
// Indique à PDO de lever une exception en cas d'erreur
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// On définit la requête SQL/Vue/Procédure stockée à exécuter.
$sql = "Call insertMembre($this->id, '$this->nom', '$this->prenom', '$this->login', '$this->motDePasse')"; //Procédure stockée
// On exécute la requête
$res = $pdo->query($sql);
return true;
}
catch (PDOException $e) {
// On retourne une exception PDO
return $e->getMessage();
}
}
public function updateDb(){
try {
// On utilise PDO pour se connecter au serveur MySQL
$pdo = new PDO('mysql:host=localhost;dbname=Messagerie',
'root', '');
// Indique à PDO de lever une exception en cas d'erreur
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// On définit la requête SQL/Vue/Procédure stockée à exécuter.
$sql = "Call updateMembre($this->id, '$this->nom', '$this->prenom', '$this->login', '$this->motDePasse')"; //Procédure stockée
// On exécute la requête
$res = $pdo->query($sql);
return true;
}
catch (PDOException $e) {
// On retourne une exception PDO
return $e->getMessage();
}
}
public function deleteFromDb(){
try {
// On utilise PDO pour se connecter au serveur MySQL
$pdo = new PDO('mysql:host=localhost;dbname=Messagerie',
'root', '');
// Indique à PDO de lever une exception en cas d'erreur
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// On définit la requête SQL/Vue/Procédure stockée à exécuter.
$sql = "Call deleteMembre($this->id)"; //Procédure stockée
// On exécute la requête
$res = $pdo->query($sql);
return true;
}
catch (PDOException $e) {
// On retourne une exception PDO
return $e->getMessage();
}
}
}
class CollectionDeMembres {
private $collection;
public function __contruct(){
//
}
//
public function set($collection=null){
$this->collection = $collection;
}
public function get($idMembre=null){
if ($idMembre!=null){
if ($this->exists($idMembre)) return $this->collection[$idMembre];
else return null;
}
else return $this->collection;
}
public function getCount(){
return count($this->collection);
}
public function add($membre){
$this->collection[$membre->id] = $membre;
}
public function remove($idMembre){
unset($this->collection[$idMembre]);
}
public function exists($idMembre){
return isset($this->collection[$idMembre]);
}
public function getFromDb(){
try {
// On utilise PDO pour se connecter au serveur MySQL
$pdo = new PDO('mysql:host=localhost;dbname=Messagerie',
'root', '');
// Indique à PDO de lever une exception en cas d'erreur
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// On définit la requête SQL/Vue/Procédure stockée à exécuter.
$sql = "Select * From getMembres"; //Vue
// On exécute la requête
$res = $pdo->query($sql);
// On lit le résultat
$rows = $res->fetchAll(PDO::FETCH_OBJECT);
foreach ($rows as $row){
$membre = new Membre();
$membre->set($row->id, $row->nom, $row->prenom, $row->login, $row->motDePasse);
$this->add($membre);
}
return $this->get();
}
catch (PDOException $e) {
// On retourne une exception PDO
return $e->getMessage();
}
}
}