Éléments de programmation objet

API

Définition

En Java

En Java, l’API est décrite par:

Avec les commentaires Javadoc.

Notion de boîte noire

L’API réalise l’interface entre le programme que vous écrivez et la bibliothèque utilisée :

Contrat sous-jacent :

Si l’on utilise l’API conformément à la documentation, le comportement sera celui indiqué dans la documentation

Conséquences :

Exemple : JOptionPane

Surcharge et variadisme

Définition

Un point technique : il est possible de surcharger les méthodes et les constructeurs en Java.

Surcharger une méthode signifie avoir plusieurs méthodes avec :

Surcharger un constructeur signifie avoir plusieurs constructeurs avec :

Exemple :

public class Vecteur {
  private double r;
  private double theta;
  public Vecteur(double x,double y) {
    this(x,y,false);
  }
  public Vecteur(double a,double b,boolean polar) {
    if (polar) {
      r=a;
      theta=b;
    } else {
      r=Math.sqrt(a*a+b*b);
      theta=Math.atan2(b, a);
    }
  }
  public double projectionX() {
    return r*Math.cos(theta);
  }
  public double projectionY() {
    return r*Math.sin(theta);
  }
  public double module() {
    return r;
  }
  public double argument() {
    return theta;
  }
  public void echelle(double d) {
    r=r*d;
  }
  public void echelle(double dx, double dy) {
    double x = projectionX()*dx;
    double y= projectionY()*dy;
    r=Math.sqrt(x*x+y*y);
    theta=Math.atan2(y,x);
  }
}

Remarques

On obtient :

public class Vecteur {
  private double r;
  private double theta;
  private Vecteur(double r, double theta) {
    this.r = r;
    this.theta = theta;
  }
  public static Vecteur creerCartesien(double x,double y) {
    return new Vecteur(Math.sqrt(x*x+y*y),Math.atan2(y, x));
  }
  public static Vecteur creerPolaire(double r,double theta) {
    return new Vecteur(r,theta);
  }
  public double projectionX() {
    return r*Math.cos(theta);
  }
  public double projectionY() {
    return r*Math.sin(theta);
  }
  public double module() {
    return r;
  }
  public double argument() {
    return theta;
  }
  public void echelle(double d) {
    r=r*d;
  }
  public void echelle(double dx, double dy) {
    double x = projectionX()*dx;
    double y= projectionY()*dy;
    r=Math.sqrt(x*x+y*y);
    theta=Math.atan2(y,x);
  }
}

Variadisme

Exemple :

public class OutilsVecteur {
  public static Vecteur somme(Vecteur u, Vecteur v, Vecteur... vecteurs) {
    double x=u.projectionX()+v.projectionX();
    double y=u.projectionY()+v.projectionY();
    for(int i=0;i<vecteurs.length;i=i+1) {
      x=x+vecteurs[i].projectionX();
      y=y+vecteurs[i].projectionY();
      }
    return Vecteur.creerCartesien(x,y);
  }
}

Règles de bon usage

Les méthodes suchargés pouvant être appelées l’un à la place de l’autre doivent avoir le même comportement.

Exemple :

JavaDoc

Afin de créer la documentation de son programme ou de sa bibliothèque, on ajouter des commentaires JavaDoc.

Exemple :

/**
 * Cette classe représente un vecteur en dimension 2.
 */
public class Vecteur {
  private double r;
  private double theta;
  private Vecteur(double r, double theta) {
    this.r = r;
    this.theta = theta;
  }
  /**
   * Retourne un vecteur nouvellement alloué dont les coordonnées cartésiennes sont passées en argument.
   * @param x la coordonnée x du vecteur.
   * @param y la coordonnée y du vecteur.
   * @return le vecteur nouvellement alloué.
   * @see #creerPolaire(double, double)
   */
  public static Vecteur creerCartesien(double x,double y) {
    return new Vecteur(Math.sqrt(x*x+y*y),Math.atan2(y, x));
  }
  /**
   * Retourne un vecteur nouvellement alloué dont les coordonnées polaires sont passées en argument.
   * @param r la coordonnée r du vecteur.
   * @param theta la coordonnée theta du vecteur.
   * @return le vecteur nouvellement alloué.
   * @see #creerCartesien(double, double)
   */
  public static Vecteur creerPolaire(double r,double theta) {
    return new Vecteur(r,theta);
  }
  /**
   * Retourne la projection du vecteur sur l'axe X.
   * @return la projection du vecteur sur l'axe X.
   */
  public double projectionX() {
    return r*Math.cos(theta);
  }
  /**
   * Retourne la projection du vecteur sur l'axe Y.
   * @return la projection du vecteur sur l'axe Y.
   */
  public double projectionY() {
    return r*Math.sin(theta);
  }
  /**
   * Retourne le module du vecteur.
   * @return le module du vecteur.
   */
  public double module() {
    return r;
  }
  /**
   * Retourne l'argument du vecteur.
   * 
   * L'argument du vecteur est l'angle en radians formé par l'axe des X et le vecteur.
   * @return l'argument du vecteur.
   */
  public double argument() {
    return theta;
  }
  /**
   * Modifie {@code ce} vecteur en l'allongant d'un facteur d.
   * @param d le facteur d'allongement
   */
  public void echelle(double d) {
    r=r*d;
  }
  /**
   * Modifie {@code ce} vecteur en l'allongant d'un facteur dx suivant l'axe X et
   * d'un facteur dy suivant l'axe Y
   * @param dx le facteur d'allongement suivant l'axe X
   * @param dy le facteur d'allongement suivant l'axe Y
   */
  public void echelle(double dx, double dy) {
    double x = projectionX()*dx;
    double y= projectionY()*dy;
    r=Math.sqrt(x*x+y*y);
    theta=Math.atan2(y,x);
  }
}

La javadoc obtenue est disponible à cet endroit. Notez qu’une fois en anglais le ce prend un sens différent.

API en Java

En Java, la documentation d’une API de bibloithèque est donné par le site généré par l’utilitaire Javadoc.

On peut trouver l’API du la bilbiothèque standard de Java à cette adresse.