vendredi 3 juin 2011

Les Get Setteurs ne sont pas classe

Etes-vous déjà retrouvés face à un graphe UML qui est compliqué du fait de la présence des méthodes getter et Setter des attributs privés ? Cela vient de m'arriver en manipulant une archive War. Le graphe serait tellement plus simple sans les méthodes dédiées.

Guetter les getter et sauter les setter

 Une petite verrue pour recenser les attributs et méthodes dédiées devrait faire l'affaire pour éviter de trop modifier mon générateur basé sur Graphviz. Mais en réalité, c'est plus complexe que cela.
    // -------------------------------------------
    void manageGetSet() {
        int f;
        int m;
        Field fi[] = {};
        try {
            fi = c.getDeclaredFields();
        } catch (Error e) {
        }
        for (f = 0; f < fi.length; f++) {
            boolean hasGet = false;
            boolean hasSet = false;
            String nomChamp = fi[f].getName();
            String nomChampGet = "get" + nomChamp.toUpperCase().substring(0, 1)
                    + nomChamp.substring(1);
            String nomChampSet = "set" + nomChamp.toUpperCase().substring(0, 1)
                    + nomChamp.substring(1);
            Method mi[] = {};
            try {
                mi = c.getDeclaredMethods();
            } catch (Error e) {
            }
            for (m = 0; m < mi.length; m++) {
                String methodName = mi[m].getName();
                if (methodName.compareTo(nomChampGet) == 0) {
                    hasGet = true;
                }
                if (methodName.compareTo(nomChampSet) == 0) {
                    hasSet = true;
                }
            }
                if (hasSet && hasGet) {
                    vGetSetFields.add(nomChamp);
                    vGetSetMethods.add(nomChampGet);
                    vGetSetMethods.add(nomChampSet);
                } else

                if (hasGet) {
                    vGetSeulFields.add(nomChamp);
                    vGetSeulMethods.add(nomChampGet);
                }
            }
        }
    // -------------------------------------------

Tester

Voici un exemple tiré des showcase de Primefaces.
Le premier schéma indique le modèle sans distinguer getter et setter, le deuxième permet quant à lui de les distinguer.
  • Version brute

  • version améliorée

Petit constat

  • le jaune n'est pas généré par Graphviz, - pas encore trouvé comment faire - il permet juste de visualiser les différences notables.
  • deux blocs supplémentaires figurent sur le graphe, un bloc "get set" tout en haut, un bloc "get seul" juste en dessous. Les blocs vides ont été noircis.
  • c'est améliorable, surtout quand la manipulation des couleurs sera possible dans les records Graphviz.
  • le graphe est plus compact, il le serait moins si le graphe ne contenait pas des beans java.
  • vérifier la faisabilité avec yED.

Liens