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 :

DRY code, correction de mon code


Sujet :

JavaScript

  1. #1
    Membre �clair�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Par d�faut DRY code, correction de mon code
    Bonjour � tous et merci d'avance pour votre aide.
    Mon code fonctionne, mais j'aurais souhait� avoir du code plus propre, plus concis.

    Voici ma classe qui me permet de consulter un serveur Redis et entre autre avec l'une de ces m�thode "checkUser".
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    redisProcess = {
        checkUser : function (token, callback){ 
            redis_client.SISMEMBER('user:' + token, function (err, res) {
                if (err || res == 0){
                    callback(false);  
                }else{
                    callback(true);   
                }
            });
        }
    }
    Et � chaque reprise o� j'ai besoin de ma m�thode checkUser, je dois r�p�ter ce bloc.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    redisProcess.checkUser(token, function(err, data){
        if(!err){
            console.log(err);
            return false
        }else{      
            //J'éxécute mon code
        }
    });
    J'avais tenter un try catch, mais l'aspect asynchrone du code ma pos� probl�me.
    Merci � vous;

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

    Informations professionnelles :
    Activit� : Urbaniste
    Secteur : Sant�

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par d�faut
    Citation Envoy� par Rifton007 Voir le message
    Bonjour � tous et merci d'avance pour votre aide.
    Mon code fonctionne, mais j'aurais souhait� avoir du code plus propre, plus concis.
    ...
    Bonjour pour un code concis une toute petite chose �viter les [CODEinline]if (true) true else false[CODEinline] ou les [CODEinline]if (true) false else true[CODEinline]
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    if (err || res == 0){
        callback(false);  
    }else{
        callback(true);   
    }
    en supprimant la code inutile callback(!(err || res == 0));pour le reste je ne comprends pas le code.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    function(err, data){
        if(!err){
    est une fonction avec deux arguments mais l'appel se fait via callback(false); qui n'a qu'un argument.

    ensuite j'ai du mal avec la s�mantique
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    if (err || res == 0){
        callback(false);  
    }else{
        callback(true);   
    }
    si il y une erreur ou que le resultat est 0 appeler la callback avec false. puis la callback re-teste cet argument
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    function(err, data){
        if(!err){
    si on avait pas d'erreur on a pass� false et on test si non err donc si non false donc true.
    au final �a donne si on a une erreur on passe false puis si not err alors erreur !!!

    c'est plut�t compliqu�. pourquoi err est un argument qui vaut false si err et true sinon
    soit il faut l'appeler success soit il y a une s�rie de not pour rien.


    je ne vois pas l'utilit� des deux fonction anonymes.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    redisProcess = {
        checkUser : function (token, callback){ 
            redis_client.SISMEMBER('user:' + token, callback);
        }
    }
     
    redisProcess.checkUser(token, function(err, data){
        if(err || res == 0){
            console.log(err);
            return false
        }else{      
            //J'éxécute mon code
        }
    });
    Dans les appels asynchrone susceptibles d'�chouer je pr�f�re les notion descope success et echec.

    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
    redisProcess = {
        checkUser : function (scope){ 
            redis_client.SISMEMBER('user:' + scope.token, function (err, res) {
                if (err || res == 0){
                    scope.success(res);  
                }else{
                    scope.failed(err, res);   
                }
            });
        }
    }
     
    redisProcess.checkUser({
      "token": token, 
      "success": function(data){
            //J'éxécute mon code
            // parmis les avantage on peut ajouter les membres que l'on veut au scope lors de l'appel
            // est les utiliser ici 
            console.log(this.perso);
      },
      "failed":  function(err, data){
            console.log(err);
            return false;
      },
      "perso": 45; //un membre ajouté au scope lors de l'appel.
    });
    A+JYT

  3. #3
    Membre �clair�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Par d�faut
    Merci de ton aide Sekaijin

    en supprimant la code inutile callback(!(err || res == 0));pour le reste je ne comprends pas le code.
    Je te l'accorde mon code se passe de tout commentaire.
    Et c'est ma plus grande frustration quelque soit le langage, c'est de ne pas pouvoir passer � la vitesse sup�rieur.
    J'ai beau lire, suivre des tutorial, j'�prouve toujours des difficult� � raisonn� POO.
    Objet, classe, m�thode, interface, namespace, prototype, mais rien � faire je m'y noie toujours.

    En tout cas merci pour ton code, on va le reprendre ensemble pour voir si j'ai bien compris.

    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
     
    redisProcess = { // Je crée mon objet redisProcess
        checkUser : function (scope){  // je crée ma méthode checkUser avec comme argument un objet (scope)
            redis_client.SISMEMBER('user:' + scope.token, function (err, res) {
                if (err || res == 0){
                    scope.success(res);  // j'appelle ma méthode sucess de l'objet scope
                }else{
                    scope.failed(err, res);   
                }
            });
        }
    }
     
    redisProcess.checkUser({ // j'appelle la méthode checkUser
      "token": token, 
      "success": function(data){
            //J'éxécute mon code
            // parmis les avantage on peut ajouter les membres que l'on veut au scope lors de l'appel
            // est les utiliser ici 
            console.log(this.perso);
      },
      "failed":  function(err, data){
            console.log(err);
            return false;
      },
      "perso": 45; //par contre j'ai pas compris: un membre ajouté au scope lors de l'appel.
    });
    Le termes 'scope' est nouveau pour moi.
    Cela veux dire quoi plus exactement.

    Merci � toi

  4. #4
    Expert confirm�
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 61
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : Urbaniste
    Secteur : Sant�

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par d�faut
    scope ou contexte c'est le contexte � utiliser pour ex�cuter les m�thodes lors du callback

    suppose que tu ai une m�thode comme celle que tu as d�finieredisProcess.checkUserMaintenant tu fais un appel et tu as une variable que tu voudrais utiliser dans la callback
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    function maFonction() {
      var uneVariable = 45;
      redisProcess.checkUser(token, function(err, data) {
        //ici je voudrais utiliser maVariable
        //cela ne pose pas de problème car dans Javascript la porté des variable le permet
        console.log(uneVariable);
      });
    }
    tu te dit cool mais moi j'ai pas une fonction avec une variable mais un objet qui as un membre et des m�thodes je vais faire pareil
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    anObject = {
      uneVariable: 45,
      afterCall: function(err, data) {
        //ici je voudrais utiliser maVariable
        //cela ne pose pas de problème car dans Javascript la porté des variable le permet
        console.log(this.uneVariable);
      },
      run : function () {
        redisProcess.checkUser(token, this.afterCall);
      }
    }
    anObject.run();
    tu appelle bien checkUser avec comme callback ta m�thode afterCall
    Mais l'objet anObject n'est pas connu de la m�thode checkUser du coup lorsque la r�ponse arrive l'appel � afterCall qui va ex�cuter this.maVariable mais this n'est pas une r�f�rence � anObject mais une r�f�rence � redisProcess et �a plante.

    l'id�e qui se cache derri�re scope est de d�finir un contexte qui sera utilis� lors de la r�ponse. ainsi le corps des m�thodes du scope auront acc�s � tous ce qui est mis dedans lors de l'appel. il ne s'agit que d'un simple objet.

    Objet, classe, m�thode, interface, namespace, prototype
    on peut simplifier pour y voir clair

    dans la programmation proc�durale on a des variables (entier bool�en string etc.) des structures (array, list, map...) des proc�dures et des fonctions.

    dans la POO on a plusieurs fa�on d'aborder la programmation.

    la POO � base de classe. la notion de classe est directement issue de la classification (comme pour la biologie)
    on peut dire qu'un poussin est un oiseau qui est un animal. chacune de ces "cat�gorie" est une classe.
    titi est un oiseau donc un animal c'est une instance de la classe oiseau.
    dans cette approche on d�fini des classes qui contiennent la d�finition de membres (les attributs de la classe par exemple dans la classe animal l'attribut nombre de pattes) on d�finit des m�thodes (les actions que l'on peut effectuer sur la classe)
    le d�veloppeur d�fini donc des classes. il lui faut aussi un moyen de cr�er des instances. car sans �a impossible d'avoir notre titi � partir de la classe oiseau. pour cela on d�fini des constructeurs.

    la POO � base de prototype ne d�finie aucune cat�gorie. mais ce concentre sur la fa�on dont on construit des objets. on d�fini des "mod�les" des objet que l'on veut manipuler et on a un moyen d'en fabriquer autant que l'on veut conforme au "mod�le". cela s'appelle un prototype. exactement ce qu'on fait dans l'industrie (automobile par exemple) la encore les objects on des attributs appel� membres. des des actions possible appel�es m�thodes.

    une "fonction" d�finie dans une classe ou un objet s'appelle une m�thode. la diff�rence avec la programmation proc�durale est que la m�thode poss�de une r�f�rence implicite � l'objet qui la porte. cette r�f�rence s'appelle this.

    voila pour les bases. il existe des langages qui n'ajoute rien.

    on a vu qu'un poussin est un oiseau qui est un animal on a donc une notion d'h�ritage. cette notion existe aussi pour les prototypes. un prototype poss�de un prototype qui poss�de un prototype qui poss�de...

    la notion d'interface � �t� introduite par les langages � base de classe qui ne g�rent que l'h�ritage simple.
    une classe n'h�rite que d'une seule autre.
    du coup comment g�rer les "trucs" qui volent. une interface est un contrat une classe qui impl�mente une interface s'engage � fournir toutes les m�thodes pr�vues dans le contrat. ainsi si j'ai une r�f�rence � un objet qui impl�mente l'interface "trucs" qui volent je sais que je peux appeler la m�thode "vole".

    les namespaces n'a absolument rien � voir avec les diff�rents type de programmation.
    ils vise � r�soudre un probl�me simple comment utiliser deux outils qui d�finissent tous les deux le m�me nom pour des chose diff�rente. par exemple dans mon appli j'utilise une librairie qui g�re l'authentification et d�fini une variable nomm�e user. mais voila j'utilise aussi une librairie qui permet de se connecter � un syst�me distant et qui d�finie elle aussi une variable user mais elle n'a rien � voir avec l'autre.
    l'id�es des namespaces est de d�finir chacune des deux variable dans deux espace diff�rent. ainsi je peux avoir les deux variable en m�me temp.

    pour ecmascript pas de classe pas d'interface pas de namespaces

    on a des objets et des prototypes �a fait plut�t court. mais on fait tout avec.
    le langage permet de d�finir une m�thode/fonction que l'on attache � un prototype, ou un objet, ou au contexte global, ou que l'on passe en param�tre d'une autre m�thode/fonction
    on a bien sur les type de base nombre, string et bool et les tableaux.
    comme on peut ajouter les m�thodes que l'on veut � n'importe quel objet pas besoin d'interface.
    qu'en au namespaces on d�fini les objets dans d'autres objets. ce qui est g�n�ralement suffisent pour g�rer les conflit de nom.

    A+JYT

  5. #5
    Membre �clair�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Par d�faut
    Merci infiniment sekaijin pour toutes ces explications.
    C'est bien plus claire pour moi.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Int�grer un code "activecells" dans mon code d�j� existant
    Par clemgdd dans le forum Macros et VBA Excel
    R�ponses: 9
    Dernier message: 14/07/2015, 11h44
  2. Conseils / Correction de mon code POO
    Par altair8080 dans le forum Langage
    R�ponses: 0
    Dernier message: 18/12/2013, 14h52
  3. Correction de mon code [D�butant]
    Par Calvein dans le forum C#
    R�ponses: 12
    Dernier message: 13/06/2008, 07h28
  4. R�ponses: 1
    Dernier message: 19/04/2008, 16h34
  5. Correction de mon code vba svp
    Par njinkeu.mbakob dans le forum Macros et VBA Excel
    R�ponses: 5
    Dernier message: 07/04/2008, 12h21

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