seance2_4h.md
-
Derrode Stéphane authoredDerrode Stéphane authored
TD2 : Modélisation de formes géométriques
Nous allons aborder dans ce TD le concept d'héritage de la programmation objet, et l'utilisation de tests unitaires pour guider le développement logiciel et améliorer sa qualité.
Le but de ce TD est de concevoir un module pour manipuler des formes géométriques avec Python. Ce module sera utilisé dans les TDs suivants, donc les tests seront essentiels pour limiter les éventuels bugs. Vous commencerez par définir les classes et leurs attributs, puis écrirez les tests unitaires de votre module, et terminerez par l'implémentation des méthodes.
Modélisation avec UML (1h)
Les formes géométriques sont représentées par des classes, et l'héritage sera utilisé pour factoriser les propriétés communes. Nous nous limitons à un repère à deux dimensions orthonormé, avec les axes croissant vers la droite et le bas. Les coordonnées dans ce repère sont des entiers relatifs (c'est-à-dire possiblement négatifs). Dans cet espace, nous choisissons de représenter les formes suivantes :
- Les rectangles caractérisés par leur origine (
x
,y
) et leurs dimensions (l
,h
). - Les ellipses caractérisées par leur origine (
x
,y
) et leurs rayons aux axes (rx
,ry
). - Un type de forme de votre choix (ex. triangle, polygone, étoile, ...), qui possède au moins une origine (
x
,y
).
Exercice 1 - Représentez les 3 classes dans un diagramme de classes UML (voir https://app.diagrams.net pour dessiner en ligne, avec l'onglet UML sur la gauche). Il est recommandé de commencer les noms des classes par une majuscule et les attributs par une minuscule. Les attributs devraient-ils être publics ou privés ?
Les attributs x
et y
étant partagés par les trois classes, on introduit l'héritage pour les regrouper. Toutes les formes géométriques hériteront d'une même classe Forme. L'intérêt de cette classe est double :
- Du point de vue des développeurs du module, les méthodes dont le code est identique entre formes (ex. translation) sont fusionnées dans Forme, réduisant la quantité de code à (et donc la multiplication des erreurs possibles).
- Du point de vue des utilisateurs du module, on peut écrire du code qui manipule des rectangles et des ellipses (ex. système de collisions de formes) sans avoir à écrire du code séparément pour les rectangles et les ellipses. Cet aspect sera illustré dans un prochain TD.