Aller au contenu principal

Interfaces

Imaginons que nous développons un jeu vidéo et que nous devions détecter s'il y a une collision entre deux joueurs. Dans le but de simplifier, nous assumerons que les joueurs ne sont définis que par des points ayant des coordonnées x, y et z.

Une façon simple serait de définir une fonction et de passer en argument les coordonnées des deux positions.

let collisionJoueurs = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number) => {
if (x1 == x2 && y1 == y2 && z1 == z2)
return true;

return false;
}

console.log(collisionJoueurs(2, 2, 1, 3, 3, 1)); // pas de collision
info

Note n'étant pas reliée à TypeScript: nous n'avons pas à écrire un else pour la condition. false est la valeur par défaut et si jamais la condition est vraie, c'est ce qui sera retourné.

Anciennement, il ne s'agissait pas d'une pratique populaire (early return) puisque la désallocation de la mémoire pouvait se faire à la fin de la fonction. Ainsi, retourner avant la fin de la fonction pouvait mener à garder en mémoire des références inutiles. En JavaScript, et dans plusieurs autres langages modernes, ce n'est pas tellement un enjeu.

On peut simplifier encore plus de la façon suivante...

let collisionJoueurs = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number) => {
return x1 == x2 && y1 == y2 && z1 == z2;
}

console.log(collisionJoueurs(2, 2, 1, 3, 3, 1)); // pas de collision

Cette solution est fonctionnelle, mais n'est pas élégante et peu flexible au niveau du constructeur. De plus, il y a de la répétition évidente dans les noms des arguments et l'appel de la fonction n'est pas très descriptif.

Nous pouvons définir une interface afin de définir ce qu'est une position., c'est-à-dire un "contrat" sur les attributs que l'objet doit au minimum avoir.

interface Position {
x: number,
y: number,
z: number,
}

let collisionJoueurs = (p1: Position, p2: Position) => {
return p1.x == p2.x && p1.y == p2.y && p1.z == p2.z
}

let p1: Position = { x: 2, y: 2, z: 1 };
let p2: Position = { x: 3, y: 3, z: 1 };

console.log(collisionJoueurs(p1, p2));

Cela simplifie grandement notre définition de fonction et nous permet de réutiliser le type Position.