Exemple d'un devoir de licence 3 : Généricité, contraintes, exceptions

Présentation
Voici une TODO-LIST de ce que je devais réaliser.
Très bon exercice de préparation avant contrôle et pour bien comprendre ces divers mécanismes.

TODO 1 :
- Ecrire une classe Ensemble qui contiendra un nombre fini d'éléments, que l'on précisera à la construction de l'ensemble.
- Le type des éléments de la classe est défini de façon générique.
- Le constructeur devra créer la structure de données correspondante.

TODO 2 :
- Proposez dans cette classe Ensemble une méthode init pour initialiser tous les éléments de l'ensemble.
- Cette méthode init n'a qu'un seul paramètre :
Une fonction à un argument de type entier et qui retourne un objet de type générique.
La méthode init appelle cette fonction pour chacun des indices de l'ensemble,
et affecte le composant correspondant à l'indice, à la valeur résultat de la fonction.

TODO 3 :
- On utilisera cette classe pour gérer un ensemble d'entiers.
- Initialiser l'ensemble en utilisant une fonction de calcul du carré d'un entier.

TODO 4 :
- Ecrire dans la classe ensemble, une fonction appartient qui renvoie vrai si son paramètre appartient à l'ensemble et faux sinon.
- Ecrire un indexeur sur la classe Ensemble qui permet un accès aux éléments en lecture et en écriture.
- Lorsqu'on l'utilise en écriture, on vérifiera que l'élément à affecter n'appartient pas déjà à l'ensemble.
- Si il appartient à l'ensemble, une exception ExisteException (classe à définir) est levée.

TODO 5 :
- On souhaite maintenant ajouter à la classe Ensemble une fonction Affiche qui parcourt
l'ensemble et affiche chaque élément en appelant sur cet élément une fonction Affiche.
- Pourra-t-on maintenant utiliser cette classe générique sur tout type d'élément ?
Oui car c'est le but de la généricité.
- Comment restraignez-vous l'utilisation à la classe générique
(au niveau de la définition de la classe générique et au niveau de la classe que l'utilisateur spécifie en paramètre) ?
Avec les contraintes (where Type ... class (pour type ref), struct (pour type struct), Ensemble (dériver de la classe)).

Bien cordialement.
Détails
Catégories : Codes sources C#
Éditeur : VIEUX Nicolas   +
Licence : Gratuit
Date de mise en ligne : 2 juin 2013




Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 05/06/2013 à 10:10
Quelques petites remarques :

  • les delegates Generateur<T> et Afficheur<T> peuvent être supprimés, vu que tu utilises Func<int, T> et Action<T> à la place
  • la méthode Init ne vérifie pas l'unicité des éléments ; c'est vrai que ce n'est pas précisé dans l'énoncé, mais ça fait que la classe ne garantit plus son invariant...
  • dans la méthode Appartient, il vaudrait mieux utiliser EqualityComparer<T>.Default.Equals(...) pour vérifier l'égalité des éléments : en utilisant Object.Equals comme tu fais, si T est un type valeur (comme dans l'exemple avec l'ensemble d'entiers), les valeurs sont boxées à chaque appel, ce qui peut avoir un impact relativement important sur les performances si l'ensemble contient beaucoup d'éléments. Une pratique courante est de passer un comparateur en paramètre du constructeur pour indiquer une comparaison plus spécifique.
  • dans le set de l'indexeur, tu déclenches une exception même si la valeur affectée est la même que la valeur actuelle ; dans ce cas là il faudrait ne rien faire


Après je trouve que le design de la classe est un peu bancal, mais tu n'y es pas pour grand chose, vu que tu as correctement suivi l'énoncé...
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.
Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -