IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

javascript orienté objet: bonne pratique et héritage


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 354
    Points : 593
    Points
    593
    Par défaut javascript orienté objet: bonne pratique et héritage
    Bonjour à tous, je suis actuellement le tuto de Thierry Templier sur la POO en javascript et j'ai une question concernant la partie 2. Ayant besoin de mettre en pratique une "objectisation" de gros code JS je voulais créer des classes héritées pour factoriser du code redondant. J'en suis donc arrivé à retenir la dernière solution proposée avant la partie héritage multiple à savoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    function MaClasseMere(parametre1, parametre2) { 
        this.attribut1 = parametre1; 
        this.attribut2 = parametre2; 
    } 
     
    MaClasseMere.prototype = { 
        methode: function() { 
            alert("[methode] Attributs: " + this.attribut1 + ", " + this.attribut2); 
        } 
    } 
     
    function MaClasse(parametre1, parametre2, parametre3) { 
        MaClasseMere.call(this, parametre1, parametre2); 
        this.attribut3 = parametre3; 
    } 
     
    MaClasse.prototype = { 
        uneMethode: function() { 
            alert("[uneMethode] Attributs: " + this.attribut1 
                           + ", " + this.attribut2 + ", " + this.attribut3); 
        } 
    }; 
     
    heriter(MaClasse.prototype, MaClasseMere.prototype); 
    var obj = new MaClasse("parametre1", "parametre2", "parametre3"); 
    obj.methode(); 
    ...
    seulement voilà, j'ai peur qu'en faisant ainsi les méthodes de la classes mère écrasent les méthodes du même nom de la classe fille rendant par la même les surcharges des méthodes de la classe fille inopérantes. Serait-il plus opportun d’affecter en premier l'héritage comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function MaClasse(parametre1, parametre2, parametre3) { 
        MaClasseMere.call(this, parametre1, parametre2); 
        this.attribut3 = parametre3; 
    } 
     
    heriter(MaClasse.prototype, MaClasseMere.prototype); 
     
    MaClasse.prototype = { 
        uneMethode: function() { 
            alert("[uneMethode] Attributs: " + this.attribut1 
                           + ", " + this.attribut2 + ", " + this.attribut3); 
        } 
    };
    Merci pour votre aide !

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    La bonne pratique est d'utiliser la POO de JS telle que le langage la définit c'est à dire un POO à base de prototype
    et non à base de classe

    lire donc
    http://fr.wikipedia.org/wiki/Program...%A9e_prototype
    mieux
    http://en.wikipedia.org/wiki/Prototy...ed_programming

    et pour en saisir les avantages un peu de théorie ne fait pas de mal
    http://fr.wikipedia.org/wiki/Th%C3%A9orie_du_prototype

    si tu veux donc de bonne pratique ne définit pas de classe

    reproduire la poo à base de classes avec un langage à prototype
    c'est possible ça fonctionne

    ça n'apporte rien

    n'utiliser que la POO à base de classe créé réduit considérablement les capacité du langage
    et ce qui serait fait de façon simple avec le langage devient compliqué à réalisé avec les classes

    un exemple simple javascript connait la notion d'objet nativement
    java ne connait que la notion d'instance d'une classe

    pour obtenir un singleton avec java il faut définir une classe qui contient un membre statique privé un créateur privé et une methode factory puis il faut appeler la méthode factory pour que l'objet existe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class mySingleton {
       static private mySingleton  member;
     
       static private mySingleton () {
         ...
       }
     
     
       static mySingleton  factory() {
          if (null == member)
               member = new mySingleton ();
          return member;
       }
     
       // ici enfin le code utile à l'objet singleton
    }
    monObjet = mySingleton.factory();
    Il faut donc les notions private, static, factory, constructor, et instance

    en javascript et en langage à prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    monObjet = {
       // ici simplement le code utile à l'objet singleton
    }

    l'héritage d'objet est beaucoup plus puissant que l'héritage de classe.
    A+JYT

  3. #3
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par sekaijin Voir le message
    La bonne pratique est d'utiliser la POO de JS telle que le langage la définit c'est à dire un POO à base de prototype
    et non à base de classe [...]
    +1 avec l'ensemble de l'intervention ^^

    >>> Pour visser quelque chose, un couteau cassé et limé ne fera jamais un aussi boulot qu'un tournevis (heu... je ne suis pas sur qu'elle soit d'une grande clarté cette métaphore bref tenons-nous en aux excellentes explications du camarade sekaijin )

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 354
    Points : 593
    Points
    593
    Par défaut
    merci pour les liens intéressants !
    cependant tu es passé à coté de ma question. Quand tu dis :
    Citation Envoyé par sekaijin Voir le message
    La bonne pratique est d'utiliser la POO de JS telle que le langage la définit c'est à dire un POO à base de prototype
    et non à base de classe

    ...

    reproduire la poo à base de classes avec un langage à prototype
    c'est possible ça fonctionne

    ça n'apporte rien

    ...

    l'héritage d'objet est beaucoup plus puissant que l'héritage de classe.
    A+JYT
    je pense qu'une connaissance (ou une lecture) des tutoriels cités de Mr t.Templier s'imposait (j'avais mis un lien). En effet nul part dans le code cité on ne trouve de
    L'auteur des tutos utilise la notation "maClasse" pour faciliter l'association d'idées mais je pense que ce sont des objets hérités par prototypage qui sont utilisés. Ce qui nous placerais déjà dans le contexte des bonnes pratiques que tu défends. Cependant un grand merci pour ta réponse qui aura eu l'avantage de me faire potasser encore un peu

    Ma question je le rappelle est assez concise :

    est-ce que je peux me permettre d’appeler la fonction hériter (cf: tuto) avant de créer par prototype les méthodes de la "classe" (ou objet) fille ou non?

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Si tu réinitialises le prototype (MaClasse.prototype = { ...) après avoir appelé la fonction d'héritage, tu vas perdre tout ce que tu as copié sur ce prototype.

    Il faut que tu t'arranges pour initialiser le prototype dans le bon ordre avec ce que tu veux mettre dedans

    @sekaijin: je suis bien d'accord avec toi que JavaScript fonctionne de manière complètement différente de Java (ou des langages à base de classe). Concernant les instances uniques, il est clair qu'il n'est pas nécessaire d'utiliser des "classes" pour créer les instances. Par contre, quand tu as potentiellement plusieurs instances sur le même "moule", il est important d'utiliser une approche où l'instance est créée à partir du prototype. Sinon tu auras autant d'instanciation de méthodes d'objets que d'objets. Ce n'est pas le cas avec les prototypes où ces méthodes sont partagées.

    Il est également à noter que JavaScript offre la méthode Object.create qui permet d'instancier un objet à partir d'un "moule" (ce moule peut-être vu comme une classe). Cette méthode ne fait pas autre chose que d'affecter le "moule" sur le prototype de l'objet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
    En espérant t'avoir aidé,
    Thierry

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 18
    Points
    18
    Par défaut
    L'auteur des tutos utilise la notation "maClasse" pour faciliter l'association d'idées mais je pense que ce sont des objets hérités par prototypage qui sont utilisés.
    Oui, c'était exactement çà mais j'aime bien les critiques autour de ces tutoriels

  7. #7
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Je ne veux pas dénigrer le travail des petits camarades (donc pardon d'avance thierry ! ), mais en l'occurrence je me demande s'il est pertinent, alors que justement de nombreuses confusions sont possibles (entre les deux paradigmes de programmation que sont la programmation objet par classe et la programmation objet par prototypage), d'utiliser un vocabulaire aussi "trompeur"...

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 354
    Points : 593
    Points
    593
    Par défaut on y est presque...
    Citation Envoyé par templth Voir le message
    Bonjour,
    Si tu réinitialises le prototype (MaClasse.prototype = { ...) après avoir appelé la fonction d'héritage, tu vas perdre tout ce que tu as copié sur ce prototype.
    bah en fait c'était dans le cas ou j'avais une méthode de la classe fille portant le même nom qu'un méthode de la classe mère que je voulais overrider. Dans ce cas je ne perds pas d'autres informations que celles liées à la méthodes à surcharger, si ?

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 18
    Points
    18
    Par défaut
    @Romain: pas de souci! Je suis content d'avoir ton point de vue à ce niveau!

    @Gwendal: oui tu perds uniquement la méthode de la classe mère car elle est "remplacée" par celle de la classe fille.

    Thierry

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 354
    Points : 593
    Points
    593
    Par défaut
    Citation Envoyé par templth Voir le message
    oui tu perds uniquement la méthode de la classe mère car elle est "remplacée" par celle de la classe fille.
    Ok thierry, merci pour ton complément d'informations. J'espère que tu nous pondra d'autres tuto aux sujets aussi pertinents. Je fais aussi du JAVA et j'attends le weekend avec impatience pour avoir un peu de tps pour moi et lire ton intro à la technologie OSGI, cette technologie m'intrigue depuis que j'ai vu les plug's dans eclipse, c'est l'occasion ou jamais de s'instruire...

    au plaisir de te lire.

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PHP Objet, bonne pratique
    Par vince351 dans le forum Langage
    Réponses: 6
    Dernier message: 23/02/2012, 16h24
  2. Réponses: 15
    Dernier message: 01/04/2011, 21h58
  3. Formulaire : envoi d'objet (bonne pratique)
    Par boboss123 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 22/12/2010, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo