Objet « fraction » en CoffeeScript

jeudi 3 octobre 2013
par  Alain BUSSER

Voici le récit, en html, de la construction des fractions en CoffeeScript :

fractions.html
construction, pas à pas, d’un objet en CoffeeScript : La fraction

CoffeeScript n’est pas fourni « batteries included » : Pas un seul fichier additionnel, fût-il de maths. Mais pour créer un tel fichier, il n’est pas nécessaire de savoir programmer en JavaScript : On peut le faire directement en CoffeeScript. La fraction est un objet (au sens de la programmation orientée objet), possédant deux variables d’instance :

  • son numérateur (un entier)
  • son dénominateur (un entier non nul)

Mais ce n’est pas tout : La fraction possède aussi des méthodes, parmi lesquelles les plus importantes sont

  • son constructeur (l’algorithme de naissance d’une fraction, en effet les fractions ne naissent pas dans les choux, mais dans une tasse de café ; étonnant, non ?)
  • son affichage
  • son inverse et on opposé (des fractions)
  • ses addition, soustraction, multiplication et division par une autre fraction

Des détails peuvent être trouvés ici (mais c’était en JavaScript, pas en CoffeeScript).


Fractions en CoffeeScript

Classe Fraction

CoffeeScript ne possédant pas d'objet Fraction, on va en créer un, sous forme d'une classe (qui est la liste de tout ce que possède une fraction pour être une fraction). Une fraction aura deux variables d'instance:

  • Son numérateur, noté n;
  • Son dénominateur, noté d.
Alors, si f est une fraction, le numérateur de f s'obtient avec f.n et son dénominateur s'obtient avec f.d. Mais pour la fraction courante (celle qu'on est en train de créer, on note this.n et this.d, ou, en abrégé, @n et @d.

Pour créer une fraction (lui expliquer comment elle doit naître), on crée une méthode (ou algorithme) de naissance, appelée constructor; c'est une fonction qui, au numérateur et au dénominateur, associe ... rien (elle doit juste créer la fraction)

On voit que, pour créer une nouvelle fraction, on écrit new Fraction (avec le numérateur et le dénominateur de la fraction). Mais on voit aussi que CoffeeScript n'affiche pas une fraction comme telle, mais en disant simplement que c'est un objet.

Méthode d'affichage

Pour afficher correctement une fraction, on doit créer une méthode d'affichage:

Inverse d'une fraction

Le calcul de l'inverse d'une fraction est une méthode inverse, donc une fonction. Mais comme elle ne renvoit rien, on la note avec des parenthèses vides:

Opérations

Les opérations sur les fractions sont aussi des méthodes, mais elles acceptent une variable autre qui est une fraction:

On voit sur l'exemple de a×b qu'il manque une méthode de simplification. Celle-ci fait appel à l'algorithme d'Euclide, implémenté sous forme d'une fonction pgcd de deux variables a et b

Fractions irréductibles

Algorithme d'Euclide

L'algorithme d'Euclide consiste à remplacer deux entiers naturels a et b simultanément par b et a%b (reste de la division euclidienne de a par b) jusqu'à ("until") ce que b soit nul; à ce moment, la valeur que possède a est le pgcd de a et b (du moins, de leur valeur initiale). En effet, on a pgcd(a,b)=pgcd(b,a%b) (invariant de boucle).

La fonction pgcd s'écrit ainsi en CoffeeScript:

Pour simplifier une fraction, on divise son numérateur et son dénominateur par leur pgcd; on le fait dans la méthode de création d'une fraction pour que toutes les fractions soient irréductibles:

la classe Fraction

Le code suivant peut être compilé pour obtenir un fichier fractions.js qu'il suffit d'insérer dans l'entête d'un document html, pour pouvoir programmer avec les fractions:


Commentaires