Actualites | Forum |Archives
Le magazine des décideurs et webmasters qui gagnent !
Inscription | Livre d'or | Plan du site | 15 visiteurs actifs
   
A la Une
Actualité
Dossiers
Communiqués
Coin Technique
Agenda des salons
Emploi
Echange de liens

Archives
Sélection
Expérience qui parle
Internet quotidien
Tous les dossiers

Forum
Forum SAM-MAG

Guides
Check-list de la promotion des sites
Promouvoir et référencer les sites web

Contact
Nous contacter
Newsletter
La protection des données personnelles


 
  Utilisation de classes pour pallier des lacunes du SGBDR ...  Les langages objets
Dossier "SAM l'Informaticien" du 21 août au 3 septembre 2000 par Daniel Lucazeau

es SGBDR doivent gérer les relations, c'est le 'R' de leur nom ! C'est à dire que les valeurs de certaines colonnes de tables doivent exister dans une colonne d'une autre table. Oracle comme Access le font..

Mais un SGBD très utilisé sur le net comme MySql ne le fait pas, les concepteurs s'en expliquent - voir pour cela http://dev.nexen.net/docs/mysql/annotee/manuel_Missing_Foreign_Keys.php.

Nous allons, à partir d'un exemple concret, mettre en place des objets ou plutôt des classes d'objets qui vont nous permettre d'avoir une application propre. Nous allons étudier un annuaire de sites ; sans chercher une complétude mais suffisamment riche pour pour mettre en avant les concepts exposés.

Voici le modèle des données gérées :

(Cliquez sur l'image pour voir ce graphe en plus grand)

et le modèle de tables sous-jacent :

(Cliquez sur l'image pour voir ce graphe en plus grand)

Objet 'SITE'

Nous allons créer une sous-classe de la classe d'accès au SGBD, qui sera spécialisée dans la manipulation de la table 'SITE'. Cette classe va implémenter les règles de gestion inhérente à la table :

  • Création
    • Données en entrée (nom, type, ..) ;
    • On vérifie que 'type' appartient bien à la table 'TYPE'. Si les valeurs proviennent d'une liste de choix, la cohérence est assurée, mais on peut faire le choix d'implémenter cela quand même pour traiter des mouvements en off-line ;
    • On vérifie que le site n'est pas déjà créé.

Objet 'TYPE'

Nous allons créer une seconde sous-classe, spécialisée elle dans la manipulation de la table 'TYPE'. On implémentera par exemple :

  • Création
    • Les données doivent être valides
    • Et ne pas déjà exister
  • Suppression
    • Données en entrée (idSite) ;
    • On vérifie que ce type ne soit plus une typologie de site existant...
Notation sommaire             

Classe SITE sous-classe de BDD

  • Données/Attributs
    • Identifiant ;
    • Nom du site ;
    • Type du site ;
    • ..
  • Services/Méthodes
    • Fiche descriptive ;
    • Création d'une fiche ;
    • Mise à jour d'une fiche ;
    • Suppression d'une fiche ;
    • Etc..

Fin de la classe.

Classe TYPE sous-classe de BDD

  • Données/Attributs
    • Identifiant ;
    • ..
  • Services/Méthodes
    • Fiche descriptive ;
    • Création d'une fiche ;
    • Mise à jour d'une fiche ;
    • Suppression d'une fiche ;
    • Etc..

Fin de la classe.

Développons la méthode " création " de la classe 'TYPE' :

Méthode creaType ( idType, libType)

Si (id et lib sont des chaînes non vides) alors
     Si (id n'existe pas) alors on le créé et on renvoie le résultat ;
Sinon on renvoie faux

Ce n'est pas l'application qui se préoccupe de gérer les erreurs avec la base de données mais l'objet lui-même qui est responsable de son comportement. On aurait pu utiliser dans ce cas précis les retours d'informations des fonctions d'accès MySql de PHP, mais cela ne l'est plus (possible) pour gérer les contraintes d'intégrité référentielle.

Ce qui donne en PHP

class typeDeSite extends aj_Db {

    
function typeDeSite () {
        $this
->aj_Db();
    
}

   
function creaType( $idTypeSite = "", $libelleTypeSite = "") {
        $status
= 0;
       
// retour <=> VRAI si création OK // FAUX sinon
        if ( $idTypeSite && $libelleTypeSite) {
           
if ( !$this->rechType( $idTypeSite)) {
                $rqSql
= sprintf("INSERT INTO typeDeSite VALUES( '%s', '%s')",_ $idTypeSite, $libelleTypeSite);
                $status
= $this->query( $rqSql);
           
}
       
}
       
return $status;
   
}

   
function rechType( $idTypeSite = "") {
       
// retour <=> VRAI si existe // FAUX sinon
        $rqSql = sprintf("SELECT * FROM typeDeSite WHERE idTypeSite = '%s'",_ $idTypeSite);
        $this
->query( $rqSql);
       
return $this->next_record();
   
}
    
}    // end of class typeDeSite

Conclusion

Tout n'est pas développé, car ce n'est qu'un cas d'école pour vous faire entrevoir la puissance de l'orientation objet. Je n'ai pas fait de comparaison de performance entre ce système et un autre avec contrôle intégrés (par ex. Asp/Access).

Mais quand on n'a pas le choix des logiciels de base, il faut s'adapter. Et, plutôt que de se lamenter sur les risques d'incohérence (avec par exemple PHP/MySql), il vaut mieux prendre les devants en fournissant en même temps:

  • la base de données au(x) développeur(s) (nopus pouvons être le livreur et le livré)
  • et les composants logiciels qui vont assurer l'intégrité de la base dans le temps.

A suivre…

Vous lirez avec intérêt :

- La réutilisabilité... les langages objets

Daniel Lucazeau
Ajornet.com
Chef de projet Internet
Développeur informatique

Tous droits réservés - Reproduction même partielle interdite sans autorisation préalable

 
 
Google
 
Web www.sam-mag.com
 

Copyright © ACORUS 2004. All Rights Reserved

- Sam-Mag.com Referencement-Sur-mesure - Referencer-Site-Web.com
Visibilite-Internationale.com - Referencement-Immobilier.net