Le but est de mettre en pratique les concepts de la programmation orientée objet et plus particulièrement :
Il s’agit d’implémenter un ensemble de classes représentant des figures géométriques simples, en respectant l’interface donnée pour ces classes. L’interface des classes à implémenter est consultable à l’adresse :
http://marc.champesme.free.fr/POO/devoir/MIAS2-2003-2004/classesGeo/jmldoc/
et peut-être téléchargée à l’adresse :
http://marc.champesme.free.fr/POO/devoir/MIAS2-2003-2004/classesGeo.jmldoc.tgz
Le devoir doit être réalisé individuellement : chaque étudiant devra rendre sa propre version du logiciel ainsi qu’un rapport décrivant le travail réalisé.
Les assertions des classes, telles qu’elles sont données, contiennent des erreurs qui rendent impossible d’en donner une implémentation conforme. Parmi celles-ci certaines sont décrites en annexe A. Votre première tâche sera d’apporter les corrections nécessaires aux assertions des classes à implémenter. Chaque correction apportée aux assertions des classes devra être décrite dans le rapport que vous rendrez en accompagnant cette description d’une référence explicite à l’annexe A.
D’autres erreurs non décrites dans l’annexe existent très probablement, si vous en trouvez il vous est possible de les corriger, sous réserve que vous décriviez très précisément en quoi consiste ces erreurs, quelles classes et méthodes sont concernées, et que vous justifiiez en quoi ces erreurs rendent l’implémentation impossible.
En dehors de ce cadre, toute modification non justifiée des assertions sera considérée comme une erreur.
Vous devez donner une implémentation complète et conforme aux assertions pour chacune des méthodes de chaque classe, à l’exception de la classe GMath dont l’implémentation vous est fournie.
Votre implémentation sera jugée correcte, si l’exécution d’un programme de test arbitraire (mais satisfaisant toutes les pré-conditions) ne provoque aucune violation d’assertion.
Vous devrez aussi écrire des commentaires complets pour la classe PointGeo, en décrivant de manière aussi précise que possible le rôle et le fonctionnement de cette classe et de chacune de ses méthodes. Vos commentaires devront, en particulier, s’efforcer de décrire avec des mots aussi précis que possible les informations fournies par les assertions (vos commentaires devront donc être plus détaillés que ceux qui sont donnés pour les autres classes).
En plus du travail demandé ci-dessus, jusqu’à 4 points de bonus (i.e. hors barème) pourront être attribués pour la réalisation d’une (ou plusieurs) des tâches décrites ci-après.
Réaliser un programme permettant d’afficher les figures. Pour ce travail, vous pourrez vous aider du logiciel disponible à l’adresse :
http://marc.champesme.free.fr/POO/source/LogicielDessin.tar.gz
Ce travail sera évalué selon les critères suivant :
Réalisation d’un logiciel interactif de dessin basé sur les classes implémentées. Pour ce travail, vous pourrez vous inspirer des travaux d’étudiants disponibles aux adresses :
http://marc.champesme.free.fr/POO/devoir/MIAS2-2003-2004/devoirEtudiant1.src.tgz
et
http://marc.champesme.free.fr/POO/devoir/MIAS2-2003-2004/devoirEtudiant2.src.tgz
Ce travail sera évalué selon les mêmes critères que le travail précédent en prenant en compte, en plus, la richesse en fonctionnalités et l’ergonomie du logiciel (i.e. facilité d’utilisation).
La qualité de la réalisation sera évaluée selon les critères suivants :
Chaque étudiant rend le code source des classes implémentées et un rapport tel que décrit ci-dessous :
Votre rapport doit être présenté et rédigé de manière à permettre une compréhension rapide, complète et précise de l’ensemble du travail réalisé. Ce rapport devra contenir en particulier :
La correction des erreurs décrites ci-dessous peut nécessiter, pour chaque erreur, des modifications dans plusieurs classes.
La méthode GMath.epsEquals(...) n’est pas adaptée (i.e. test trop strict) quand les valeurs à comparer sont inférieures à epsilon.
Les sous-classes de Figure autres que Segment permettent de définir des figures dont des points caractéristiques successifs sont identiques, alors que la classe Segment impose que les deux points d’un segment soit distincts. Cela rend impossible l’implémentation de certaines méthodes (par exemple, la méthode getSegment(int) de la classe LignePolygonale)
Les post-conditions de la méthode homothetie(...) de la classe PointGeo sont contradictoires dans le cas ou (k == 1) et this.equals(centre).
Les variables de type double peuvent prendre la valeur spéciale Double.NaN (i.e. “Not a Number”). Les assertions des méthodes à paramètres de type double ne prennent pas en compte cette possibilité ce qui rend leur implémentation impossible du fait des propriétés très particulière de cette valeur (par exemple, l’expression Double.NaN == Double.NaN est toujours fausse).
Il manque un parenthesage sur la 2eme post-condition de la méthode epsDroiteContient(...).
Pour la méthode estEpsPerpendiculaireA(), si un segment est exactement vertical (resp. horizontal) et l’autre approximativement horizontal (resp. vertical), alors, dans ce cas, les segments ne sont pas reconnus comme approximativement perpendiculaires. Il manque par conséquent la possibilité de pouvoir évaluer si un segment est approximativement horizontal (resp. vertical).
Pour le constructeur prenant un paramètre de type LignePolygonale, il manque une pré-condition permettant d’établir l’invariant : getNbPoints() >= 3