INF 441 - TD 1 
Types algébriques

Votre opinion sur le cours de ce matin. C'est anonyme et optionnel. Les commentaires constructifs sont les bienvenus.

Le but de ce TD est de réaliser un même type algébrique en Java et en OCaml. On choisit ici l'exemple très simple d'un type représentant des images. Une image est

Outre le type qui va représenter une telle image, on va définir les opérations suivantes :

1. En Java

Définir une classe Picture pour représenter une image, avec des méthodes
  int getWidth()
  int getHeight()
  void move(int dx, int dy)
  void draw(Graphics g)

Définir trois sous-classes Rectangle, Circle et Union de la classe Picture. Le constructeur Rectangle(int x1, int y1, int x2, int y2) spécifie les coins supérieur gauche et inférieur droit du rectangle. Le constructeur Circle(int x, int y, int r) spécifie le centre et le rayon. Le constructeur Union(Picture p1, Picture p2) construit l'union des deux images p1 et p2.

On dessinera l'image en utilisant la bibliothèque java.awt.Graphics de Java. Attention, les coordonnées graphiques de Java ne sont pas les coordonnées cartésiennes usuelles :

Indication : il pourra être utile de conserver dans chaque objet de la classe Picture une spécification du plus petit rectangle englobant (par exemple sous la forme coin supérieur gauche + dimensions).

Avec le fichier Test.java fourni, vous devez obtenir la fenêtre suivante :

et la sortie suivante dans la console :
  stop dim = 40,140
  car dim = 200,80

Déposer les fichiers Picture.java, Rectangle.java, Circle.java et Union.java :

2. En OCaml

Dans Eclipse, créer un nouveau projet (New puis OCaml project (ocamlbuild)), par exemple td1-ocaml. Éditer les propriétés de ce projet (clic droit sur le projet puis Properties) pour indiquer test.native dans la boîte Targets et graphics dans la boîte Libraries. Ajouter au projet un nouveau module avec le fichier test.ml fourni.

Dans un fichier picture.ml, introduire un type t immuable pour représenter une image, des fonctions

  val rectangle: int -> int -> int -> int -> t
    (** inférieur-gauche et supérieur-droit *)
  val circle: int -> int -> int -> t
    (** centre et rayon *)
  val union: t -> t -> t
pour construire des images et des fonctions
  val width: t -> int
  val height: t -> int
  val move: int -> int -> t -> t
  val draw: t -> unit

On dessinera l'image en utilisant la bibliothèque Graphics d'OCaml. Attention, les coordonnées graphiques d'OCaml sont, à la différence de Java, les coordonnées cartésiennes usuelles :

Pour exécuter, cliquer droit sur test.native dans le projet, puis Run As et OCaml executable (ou Ctrl-F11 ou l'icône Run As dans la barre d'outils d'Eclipse). Vous devez obtenir la fenêtre suivante :

et la sortie suivante dans la console :
  stop dim = 40,140
  car dim = 200,80

Déposer le fichier picture.ml :

3. Pour aller plus loin (questions optionnelles)

3.1 Code idiomatique en Java

Faire de la classe Picture une classe abstraite (qualificatif abstract). Déclarer sa méthode draw également comme abstract (ce qui nous dispense alors de la coder).

Ajouter les qualificatifs protected et private appropriés sur les champs des différentes classes.

3.2 Code idiomatique en OCaml

Ajouter une interface picture.mli où le type t est abstrait, c'est-à-dire déclaré mais sans définition.

Nous vous proposons une solution. Bien sûr, ce n'est pas la seule.