TP3 - TDD - Geometry
Qualité de Développement - R4.02
Deuxième mise en pratique du TDD.
Afin de continuer la mise en pratique du TDD et de poursuivre la prise en main du langage Rust, vous allez développer une petite bibliothèque de géométrie permettant de manipuler des points et des vecteurs 2D.
Création de la branche, de la merge request et du package Rust
Si ce n’est pas déjà fait, créez et basculez sur une nouvelle branche nommée geometry.
Créez la merge request correspondant à l’intégration de la bibliothèque de géométrie dans la branche principale.
Mettez bien à jour votre dépôt local, notamment en ce qui concerne les branches.
Assurez-vous à ce stade de bien être sur la branche geometry.
Créez ensuite le package Rust tp3_geometry, de type blibliothèque avec la commande :
cargo new --lib tp3_geometry
Mise à jour du pipeline
Ajoutez dans le fichier .gitlab-ci.yml la configuration pour le "job" de test de
la bibliothèque de géométrie. Ce job sera très similaire à celui du palindrome.
Validation du pipeline
Commitez et poussez votre code vers votre dépôt GitLab. Validez que le pipeline se déclenche bien et que les tests passent.
Mise en pratique du TDD sur la bibliothèque geometry
Structures de données
Avant de commencer à ajouter des fonctionnalités à votre bibliothèque,
définissez la structure de données Vec2D avec deux composantes, x et y, de
type flottant sur 64 bits : f64.
Définissez également une structure Point avec les mêmes caractéristiques.
Vous pouvez consulter le chapitre du livre à ce sujet.
Appliquez les règles du TDD pour réaliser les fonctionnalités demandées.
Commencez par écrire le test qui valide la création d’un vecteur :
#[test]
fn new_is_valid() {
let u = Vec2D::new(31.0, 11.0);
assert_eq!(u.x, 31.0);
assert_eq!(u.y, 11.0);
}
Le compilateur doit vous insulter puisque vous n’avez pas encore créé cette
fonction. Pour satisfaire le compilateur, créez la fonction associée new (qui
n’est pas strictement un constructeur puisque cela n’existe pas en Rust) dans un bloc impl Vec2D.
Une fois que cela fonctionne, créez le test pour la fonction pour le vecteur nul, puis la fonction de création nul.
Et ainsi de suite.
Pensez à faire un commit à chaque itération ! C’est-à-dire à chaque fin du cycle TDD.
Structuration du code
Une fois ce processus terminé, pour améliorer la qualité de votre bibliothèque en terme de lisibilité et donc de maintenabilité, vous allez structurer votre code.
Commencez en plaçant les éléments relatifs au type Vec2D dans un module dédié. Consultez la page pertinente dans le livre de Rust
Il vous faudra créer deux modules : vec2d et point.
Pour créer un module, vous avez deux options :
-
Créer un fichier
nom_module.rsau même niveau que le fichierlib.rsou -
Créer un répertoire
nom_moduleau même niveau que le fichierlib.rset dans ce répertoire, créer un fichiermod.rs.
Pour que le compilateur prenne en compte ces nouveaux modules, il faudra ajouter
en haut du fichier lib.rs : mod nom_module.
Pour pouvoir utiliser les fonctions définies dans votre module, vous devez ajouter :
use nom_module::NomType;
Vous pourrez ensuite utiliser les fonctions de votre type avec :
NomType::uneFonction();
Chaînage des opérations
L’objectif ici est de rendre possible le chaînage des opérations :
let mut p = Point::origin();
let mut v = Vec2D::new(12.3, 45,6);
p.translate(v.scale(3.0).rotate(PI).add(Vec2D::new(1.0, 1.0)));
Pour cela, il faudra que les opérations de modification retournent une référence vers le vecteur modifié.
Évaluation
Seule la partie sur la bibliothèque "geometry" sera évaluée.