Imaginons qu'il y est une opération qui crée un utilisateur. Cette opération peut échouer si spécifié e-mail ou nom d'utilisateur existe. Si elle a échoué, il est nécessaire de savoir exactement pourquoi. Il existe trois approches de le faire comme je le vois et je me demande s'il est un gagnant clair.
Donc, voici une classe utilisateur:
class User
{
public string Email { get; set; }
public string UserName { get; set; }
}
Et il y a 3 façons d'accomplir l'opération de création:
Test-Créer
if (UserExists(user)) act on user exists error;
if (UsernameExists(user)) act on username exists error;
CreateUser(user);
UserExists et UsernameExists faire la demande au serveur de base de données pour faire une validation. Ces appels sont de nouveau répété dans CreateUser pour s'assurer de l'API est utilisé correctement. En cas de validation a échoué, je jette ArgumentOutOfRangeException dans les deux cas. Il y a donc un gain de performance.
Essayez-Créer
enum CreateUserResultCode
{
Success,
UserAlreadyExists,
UsernameAlreadyExists
}
if (!TryCreate(user, out resultCode))
{
switch(resultCode)
{
case UserAlreadyExists: act on user exists error;
case UsernameAlreadyExists: act on username exists error;
}
}
Ce modèle effectue la validation qu'une seule fois, mais nous avons recours à l'utilisation de la dite codes d'erreur qui n'est pas considéré comme une bonne pratique.
Créer Des Captures
try
{
CreateUser(user);
}
catch(UserExistsException)
{
act on user exists error;
}
catch(UsernameExistsException)
{
act on username exists error;
}
Je n'utilise pas de codes d'erreur ici, mais maintenant, je dois créer une classe d'exception pour tous les cas. C'est plus ou moins comment les exceptions sont censé être utilisé, mais je me demande si la création d'une autre exception au lieu d'enum entrée en vaut la peine.
Donc, nous avons un gagnant clair ou c'est plus une question de goût?