Package caseine.tags

Annotation Interface ToDo


@Retention(RUNTIME) public @interface ToDo
Pour retirer tout fragment annotable et éventuellement le remplacer par autre chose.
Author:
Yvan Maillot <yvan.maillot@uha.fr>

L'annotation @caseine.tags.ToDo

L'annotation @ToDo permet de retirer n'importe quel élément annotable et éventuellement le remplacer par un autre.

Cible

@ToDo s'applique à tout élément annotable.

Formes d'emploi

@ToDo s'emploie

  1. comme une annotation multivaluée : e.g. @ToDo(value = "une consigne à l'étudiant", replacement="public static String emptyString{ return \"\"; }")
  2. comme une annotation monovaluée : e.g. @ToDo("une consigne à l'étudiant")
  3. comme une annotation de marquage : @ToDo

Effet

L'annotation @ToDo a pour effet
  1. selon que la propriété replacement soit renseignée ou non:
    1. Si elle n'est pas renseignée (ou vide), de supprimer l'élément annoté .
    2. Si elle est renseignée (et non vide), de remplacer l'élément annoté par un autre défini par la propriété replacement (cf. Utilisation de la propriété replacement ci-après).

Utilisation de la propriété replacement

L'usage de la propriété replacement nécessite de prendre quelques précautions.

Si elle est présente et différente de la chaîne vide, l'élément annoté est

  1. soit remplacé par le contenu d'un fichier dont le chemin est donné par la valeur de la propriété replacement, s'il s'agit du chemin d'un ficher accessible.
  2. soit remplacé par cette valeur elle-même sinon.

Si l'élément annoté possède un commentaire de Javadoc, il est rajouté à l'élément de remplacement, si celui-ci le permet.

Si la consigne (value) est présente et différente de la chaîne vide, elle est rajoutée en commentaire // TODO la consigne.

Attention, la consigne prévaut sur la javadoc. Il ne pas y avoir à la fois commentaire et javadoc.

Attention, pour pouvoir déployer sur le serveur, il faut absolument que le code de remplacement soit parsable.

  • Tout dépend de l'élément annoté,
    • si c'est une classe une autre classe (de même nom) ou même une interface ou n'importe quel type de même nom.
    • si c'est un membre de classe, il peut être remplacé par n'importe quel autre membre ou même par un bloc d'instructions.
    • si c'est un paramètre, il peut être remplacé par un autre paramètre
    • etc.

Exemples d'annotation de marquage

Exemple 1

 @ToDo
 public class Vecteur {

   private double x, y;

   public Vecteur(double x, double y) {
      this.x = x;
      this.y = y;
   }

   public Vecteur() {
      this(0.0, 0.0);
   }

   public double norme() {
      return sqrt(x*x+y*y);
   }
 }
 

sera tout bonnement effacé mais le fichier est conservé.

Exemple 2

 public class Vecteur {

   @ToDo
   private double x, y;

   public Vecteur(double x, double y) {
      this.x = x;
      this.y = y;
   }

   public Vecteur() {
      this(0.0, 0.0);
   }

   public double norme() {
      return sqrt(x*x+y*y);
   }
 }
 

sera remplacé par

 public class Vecteur {

   public Vecteur(double x, double y) {
      this.x = x;
      this.y = y;
   }

   public Vecteur() {
      this(0.0, 0.0);
   }

   public double norme() {
      return sqrt(x*x+y*y);
   }
 }
 

Ce code n'est pas compilable

Exemple 3

 public class Vecteur {

   private double x, y;

   public Vecteur(@ToDo double x, double y) {
      this.x = x;
      this.y = y;
   }

   public Vecteur() {
      this(0.0, 0.0);
   }

   public double norme() {
      return sqrt(x*x+y*y);
   }
 }
 

sera remplacé par

 public class Vecteur {

   private double x, y;

   public Vecteur(double y) {
      this.x = x;
      this.y = y;
   }

   public Vecteur() {
      this(0.0, 0.0);
   }

   public double norme() {
      return sqrt(x*x+y*y);
   }
 }
 

Ce code n'est pas compilable

Exemple 4

 public class Vecteur {

   private double x, y;

   public Vecteur(double x, double y) {
      this.x = x;
      this.y = y;
   }

   @ToDo
   public Vecteur() {
      this(0.0, 0.0);
   }

   public double norme() {
      return sqrt(x*x+y*y);
   }
 }
 

sera remplacé par

 public class Vecteur {

   private double x, y;

   public Vecteur(double x, double y) {
      this.x = x;
      this.y = y;
   }

   public double norme() {
      return sqrt(x*x+y*y);
   }
 }
 

Ce code est compilable

Exemple d'annotation monovaluée

 @ToDo("Écrire une méthode qui retourne la norme de ce vecteur")
 public double norme() {
    return sqrt(x*x+y*y);
 }
 

sera remplacé par

 // TODO Écrire une méthode qui retourne la norme de ce vecteur
 

Exemple d'annotation multivaluée (sans fichier)

Exemple 1

 @ToDo(value = "Cette méthode contient des erreurs. Corrigez-là !",
           replacement="private int norme(double x, double y) { return x*x+y*y; }")
 public double norme() {
    return sqrt(x*x+y*y);
 }
 

sera remplacé par

 // TODO Cette méthode contient des erreurs. Corrigez-là !
 private int norme(double x, double y) {
    return x * x + y * y;
 }
 

Exemple 2

 // Revoir les paramètres de ce constructeur
 public Vecteur(@ToDo(replacement = "double _X") double x, @ToDo(replacement = "double _Y") double y) {
    this.x = x;
    this.y = y;
 }
 

sera remplacé par

 // Revoir les paramètres de ce constructeur
 public Vecteur(double _X, double _Y) {
    this.x = x;
    this.y = y;
 }
 

Exemple d'annotation multivaluée (avec fichier)

 @ToDo(
     value = "Cette classe est très mal écrite et même pas compilable.
              Corrigez là. Faites le nettoyage. Mais qu'elle remplisse toujours le même office.",
     replacement = "vecteur.txt")
 @ToCheck(grade = 1, priority = 5) 
 public class Vecteur {

    @ToCheck(grade = 1, priority = 10)
    @GetterToCheck(grade = 1, priority = 15)
    @SetterToCheck(grade = 1, priority = 20)
    private double x, y;

    @ToCheck(grade = 1, priority = 12)
    public Vecteur(double x, double y) {
       this.x = x;
       this.y = y;
    }

    @ToCheck(grade = 1, priority = 13)
    public Vecteur() {
       this(0.0, 0.0);
    }

    @ToCompare(value = "Mauvais calcul de la norme", grade = 1, priority = 30)
    public double norme() {
       return sqrt(x * x + y * y);
    }

    public double getX() {
       return x;
    }

    public double getY() {
       return y;
    }

    public void setX(double x) {
       this.x = x;
    }

    public void setY(double y) {
       this.y = y;
    }
 }
 

si le fichier vecteur.txt contient:

 public class vecteur {

    public double x, y;

    Vecteur(double _X, double _Y) {
       x = _X;
       y = _X;
    }

    Vecteur() {
       x = 0.0;
       y = 0.0;
    }

    double Norme() {
       return x * x + y * y;
    }
 }
 

sera remplacé par

 // TODO Cette classe est très mal écrite et même pas compilable. Corrigez là. Faites le nettoyage. Mais qu'elle remplisse toujours le même office.
 public class vecteur {

    public double x, y;

    Vecteur(double _X, double _Y) {
       x = _X;
       y = _X;
    }

    Vecteur() {
       x = 0.0;
       y = 0.0;
    }

    double Norme() {
       return x * x + y * y;
    }
 }
 

Ce code n'est pas compilable

  • Element Details

    • value

      String value
      Returns:
      La consigne à destination de l'étudiant. Elle sera précédée de // TODO ou rien si c'est la value par défaut.
      Default:
      ""
    • replacement

      String replacement
      Default:
      ""