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

Langage Java Discussion :

La loi de Demeter


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut La loi de Demeter
    Bonjour,
    PMD m'indique que mon code est en Violation potentielle de la loi de Déméter (objet non créé localement).
    Dans ce simple petit bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            final SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("yyyy-MM-dd.HH.mm.ss", Locale.FRENCH);
            final SimpleDateFormat FORMAT_TIMESTAMP = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSS", Locale.FRENCH);
            final Date dateCharge = new Date(System.currentTimeMillis());
            final Timestamp timeCharge = new Timestamp(dateCharge.getTime());
            final String dateStringCharge = FORMAT_DATE.format(dateCharge);
            final String timeStringCharge = FORMAT_TIMESTAMP.format(dateCharge);
    Les 3 dernières lignes sont en violation potentielle.
    J'en conclu que mon code devrait être améliorer afin d'éviter cette violation (dont j'ai du mal à saisir les tenants et aboutissants).
    Je vous remercie d'avance pour les éclaircissement que vous pourrez m'apporter.

  2. #2
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Je pense que cela viens du fait que tu essais d'initialiser des constantes avec d'autre constantes. Pour le vérifier enlève les mots clé final devant et regarde à la compilation ce qu'il te dit.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par wikipedia
    La Loi de Déméter pour les fonctions requiert que toute méthode M d'un objet O peut simplement invoquer les méthodes des types suivants d'objets :

    lui-même
    ses paramètres
    les objets qu'il crée/instancie
    ses objets composants
    Le but c'est d'éviter les codes spaghettis et la collaboration trop ténues entre les objets.


    Je pense que la solution serait:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            final SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("yyyy-MM-dd.HH.mm.ss", Locale.FRENCH);
            final SimpleDateFormat FORMAT_TIMESTAMP = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSS", Locale.FRENCH);
            final Date dateCharge = new Date(System.currentTimeMillis());
            final Timestamp timeCharge = buildTimestamp(dateCharge);
     
    public static Timestamp buildTimestamp(Date date){
       return new Timestamp(date.getTime());
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut
    Merci tchize. Code testé et approuvé
    Reste plus qu'à creuser cette loi car elle provoque énormément d'alertes dans mon code !

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par shibo Voir le message
    Merci tchize. Code testé et approuvé
    Reste plus qu'à creuser cette loi car elle provoque énormément d'alertes dans mon code !
    Je ne la connaissais pas avant, mais d'après l'article de wikipedia, un des reproches qu'on lui fait, c'est de te forcer à multiplier les petites méthodes comme je viens de proposer....

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    L'idée de la loi de Demeter est de ne parler qu'à ses amis les plus proches dans le but de limiter le couplage. C'est à dire que ce genre de choses est à proscrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class MaClass {
      Employes employes;
     
      public void doSomething(Employe employe){
        // code métier de la classe
     
        employes.getListeEmployes.add(employe);
     
        // suite du code métier de la classe
      }
    }
    D'après la loi de Demeter il faudrait plutôt que la classe Employes dispose d'une méthode pour ajouter un employé afin que "MaClass" ne dépende pas du contenu de Employes. "MaClass" ne doit pas savoir comment sont stockés les employés (que ça soit dans une liste, dans une Map, dans un Set, ... ), "MaClass" veut juste ajouter un employé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class MaClass {
      Employes employes;
     
      public void doSomething(Employe employe){
        // code métier de la classe
     
        employes.ajouterEmploye(employe);
     
        // suite du code métier de la classe
      }
    }
    Ainsi "MaClass" n'est pas couplée avec le système de stockage des employés dans la classe Employes. La classe "Employes" peut changer à tout moment son système de stockage sans que "MaClass" soit impacté. La loi de Demeter va avec le principe du "Tell Don't Ask". Exemple : Si on veut mettre un String en minuscule, on ne demande pas au String son tableau de char[] pour ensuite mettre chacun des char en minuscule, on demande directement au String de créer un nouveau String en minuscule : monString.toLowerCase();

    NB : Le pattern factory conduit souvent à la violation de a loi de Demeter. puisqu'on effectue en général "factory.buildC().doSomething()".

    Romain.

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

Discussions similaires

  1. Que pensez-vous de la loi de Demeter ?
    Par 3DArchi dans le forum Langage
    Réponses: 137
    Dernier message: 03/02/2016, 14h39
  2. Loi de demeter / IntelliJ
    Par behess dans le forum ALM
    Réponses: 3
    Dernier message: 24/12/2010, 10h52

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