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 :

Exception : Anti-pattern


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Exception : Anti-pattern
    Bonjour,

    Je développe actuellement une application pour l'IUT, c'est un devoir à rendre vendredi. Et je me posais une question. Mon code fonctionne, mais je cherche à l'optimiser au maximum, principalement sur la gestion des erreurs.
    Donc, je dois coder un programme permettant de gérer des données stockés dans une BDD MySQL et aussi dans une List Java. Pour ça, on utilise le design pattern DAO de niveau 2.

    J'ai lu ce sujet qui parle d'anti pattern : https://www.developpez.net/forums/d8...eption-metier/
    Et je ne comprend pas bien la différence entre une bonne utilisation ou non des exceptions.

    Voici une partie de mon code :
    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
     
    @Override
    	public boolean create(Abonnement obj) throws Exception {
    		Iterator<Abonnement> dataIterator = data.iterator();
     
    		while (dataIterator.hasNext()) {
    			Abonnement datum = dataIterator.next();
    			if(obj.getId_client() == datum.getId_client() && obj.getId_revue() == datum.getId_revue()) {
    				throw new IllegalArgumentException("Le client n°" + obj.getId_client() + " que vous avez choisi est déjà abonné à cette revue.");	
    			}
    		}
     
    		boolean ok = this.data.add(obj);
     
    		return ok;
    	}
    Ma classe métier "Abonnement" a une clé primaire composite, composé de {id_client, id_revue}, ce qui complique pas mal la création des classes DAO ! Et pour ça, je dois donc vérifier si la clé primaire n'existe pas déjà dans la list.
    Donc, je boucle sur "data" qui est la liste contenant les données et si la clé primaire existe déjà, j'utilise un throw new qui me renvoie l'erreur, erreur que je récupère dans un try - catch dans ma classe Main et qui m'affiche ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ListeMemoire] Erreur ajout "Abonnement" : Le client n°1 que vous avez choisi est déjà abonné à cette revue.
    Donc, je voudrais savoir si c'est une bonne façon d'utiliser les Exception, et si non, comment je pourrais mieux gérer ce genre de chose?

    Merci !

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Ben là, on est plutôt dans la mauvaise utilisation... d'autant que ta méthode renvoie un boolean pour dire que ça c'est bien passé ou non.
    Tu devrais plutôt faire un return false plutôt que ton throw new Exception(...)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    D'accord, ouais, j'avais raison d'hésiter...

    Du coup, j'ai un peu de mal à comprendre dans quel situation le throw new doit être utilisé. J'ai vu pas mal de bout de code sur des tutoriels utiliser le throw new pour tester les valeurs d'un constructeur par exemple. Genre, une classe Ville, qui ne peut pas avoir un nombre négatif d'habitants, et donc ils utilisent un throw new pour renvoyer l'erreur.

  4. #4
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 444
    Points : 4 565
    Points
    4 565
    Par défaut
    Pour ma part, j'aurais considéré ça comme une bonne utilisation, une exception va casser le flux d'éxécution, le traitement de création se faisant certainement dans un flux plus complexe(création puis affichage du résultat à l'utilisateur et potentiellement d'autres choses entre les 2), il est plus simple de juste tout arréter jusqu'à l'interception de l'exception.

    Un autre point, est que ce cas n'est pas le seul cas qui pourrait empécher le traitement, une autre erreur métier, par exemple que l'abonnement n'est plus dispo.
    Egalement, une erreur technique dans la DB lancera une exception, en utilisants différentes exceptions, ou du moins avec des messages différents, on peut notifier l'utilisateur de manière unifiée en gardant uniquement 2 flux: 1 "ça se passe bien", et l'autre "ça ne marche pas, voir le message ou le type d'exception pour savoir pourquoi".

    Je ne suis pas fan des return boolean parce qu'a tous les coups, si on ne connait pas l'api, on oublie de les vérifier, et donc on ne traite pas les erreurs(la classe java.io.File est un bon exemple).

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yildiz-online Voir le message
    Pour ma part, j'aurais considéré ça comme une bonne utilisation, une exception va casser le flux d'éxécution, le traitement de création se faisant certainement dans un flux plus complexe(création puis affichage du résultat à l'utilisateur et potentiellement d'autres choses entre les 2), il est plus simple de juste tout arréter jusqu'à l'interception de l'exception.

    Un autre point, est que ce cas n'est pas le seul cas qui pourrait empécher le traitement, une autre erreur métier, par exemple que l'abonnement n'est plus dispo.
    Egalement, une erreur technique dans la DB lancera une exception, en utilisants différentes exceptions, ou du moins avec des messages différents, on peut notifier l'utilisateur de manière unifiée en gardant uniquement 2 flux: 1 "ça se passe bien", et l'autre "ça ne marche pas, voir le message ou le type d'exception pour savoir pourquoi".

    Je ne suis pas fan des return boolean parce qu'a tous les coups, si on ne connait pas l'api, on oublie de les vérifier, et donc on ne traite pas les erreurs(la classe java.io.File est un bon exemple).
    Tout dépend de ce qu'il y a avant ou plutôt de ce qu'on veut faire.
    Contre exemple :
    L'utilisateur saisie des données et les enregistre dans une liste.
    Ensuite, on traite cette liste pour ajouter en DB
    Si la saisie existe déjà, on s'en fou... sinon, on ajoute
    Là, l'exception casse la boucle de traitement alors que le test du boolean permet de s'en sortir sans l'artillerie lourde.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    List<DonneesSaisies> aEnregister = ...
    int count = 0;
    for (DonneesSaisies donneesSaisie : aEnregistrer)
    {
       if (ajouter(donneesSaisie)) ++count;
    }
    System.out.println("On a enregistré " + count + " donnée" + (count > 1 ? "s":""));
    Dans le cas d'une exception, il faudrait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ...
    for (DonneesSaisies donneesSaisie : aEnregistrer)
    {
       try
       {
          ajouter(donneesSaisie); 
          ++count;
       }
       catch (Exception e)
       {
          ...
       }
    }
    ...
    Bref, il faut trancher au cas par cas... mais la règle générale qu'on peut y voir est : "Si on peut éviter une exception, alors il faut l'éviter"

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bon, je comprend mieux.

    Je vous remercie de vos réponses.. J'ai vraiment beaucoup de mal à juger, si mon code doit faire tel chose ou tel autre chose. Mais je suppose que ça arrivera avec l'expèrience ^^ !

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/10/2010, 17h06
  2. Anti-pattern : exception métier
    Par LittleBean dans le forum Langage
    Réponses: 46
    Dernier message: 27/01/2010, 14h24
  3. singleton == anti pattern?
    Par yan dans le forum C++
    Réponses: 5
    Dernier message: 17/04/2008, 14h17
  4. JSF est-il Anti Design Pattern ?
    Par threshold dans le forum JSF
    Réponses: 83
    Dernier message: 12/12/2007, 15h23

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