J'écris un plug-in pour un programme de modélisation géométrique, et j'ai une classe abstraite basée sur un objet Curve. La courbe n'est considérée valide que si elle est plane, fermée et ne s'intersecte pas. J'ai alors une chaîne d'autres méthodes qui font référence à cette courbe pour faire une surface, ou l'extruder dans un volume. Ces méthodes lèveront une exception si elles sont appelées lorsque BaseCurve n'est pas valide. À l'heure actuelle, mon programme se bloque simplement si l'utilisateur invalide l'une des courbes, et j'essaie de trouver la meilleure façon d'avoir mon programme gérer cette entrée invalide.Comment gérer les entrées utilisateur invalides dans ce cas?
Voici ce que ma classe ressemble à:
public abstract class AbsCurveBasedObject
{
public abstract Curve BaseCurve
{
get;
}
public bool BaseCurveIsValid
{
get
{
Curve c = this.BaseCurve;
...
//checks that curve is valid
...
return true/false;
}
}
public Surface GetSurface()
{
Curve c = this.BaseCurve();
...
//magic that converts c to a surface
//exception is thrown if c is invalid
...
return surface;
}
public Surface GetVolume()
{
Surface s = this.GetSurface();
...
//magic that converts s into a volume
...
return volume;
}
}
Je ne sais pas si GetSurface() doit revenir NULL si la courbe est invalide ou si je devrais jeter une exception.
Il n'est pas inattendu que la courbe de base soit invalide car je sais que l'utilisateur finira par créer une courbe invalide lors de l'utilisation de mon programme. Je crois comprendre que les exceptions ne devraient normalement être levées que lorsque le programme atteint un point où il se produit quelque chose d'inattendu et ne sait pas comment continuer. Dois-je simplement retourner NULL de GetSurface() si la courbe n'est pas valide et que toutes les méthodes basées sur GetSurface() retournent aussi null si GetSurface() le fait? Cela semble être plus difficile à déboguer. Je sais que je vais finir par oublier de vérifier si une valeur de retour quelque part est NULL et se retrouver avec quelques ArgumentNullException qui pistes tout le chemin du retour à AbsCurveBasedObject.GetSurface()
Alors serait-il préférable d'avoir si/else ou d'essayer/catch bloque tout le suivi de la place à gérer lorsque l'utilisateur invalide quelque peu la propriété de la courbe de base?
Il y a une très bonne discussion à ce sujet dans l'excellent ouvrage Framework Design Guidelines 2nd Ed. Il passe en revue les avantages et les inconvénients du modèle Tester-Doer (voir la réponse d'Eric Lippert - les problèmes d'enfilement sont liés au filetage) et le modèle Try-Parse, ainsi que de nombreuses directives d'exception. Le retour de null n'est généralement pas recommandé. – TrueWill