Nehmen wir an, es gibt eine Operation, die einen Benutzer erstellt. Dieser Vorgang kann fehlschlagen, wenn eine angegebene E-Mail-Adresse oder ein Benutzername existiert. Wenn es fehlgeschlagen ist, ist es erforderlich, genau zu wissen, warum. Es gibt drei Ansätze, dies so zu tun, wie ich es sehe, und ich frage mich, ob es einen klaren Gewinner gibt.Welches Design ist am meisten zu bevorzugen: Test-Create, Try-Create, Create-Catch?
So, hier ist ein Klasse-Benutzer:
class User
{
public string Email { get; set; }
public string UserName { get; set; }
}
Und es gibt 3 Möglichkeiten von Operation auszuführen erstellen:
Test erstellen
if (UserExists(user)) act on user exists error;
if (UsernameExists(user)) act on username exists error;
CreateUser(user);
userexists und UsernameExists machen Anfrage Datenbankserver, um eine Validierung durchzuführen. Diese Aufrufe werden in CreateUser erneut wiederholt, um sicherzustellen, dass die API korrekt verwendet wird. Falls die Validierung fehlgeschlagen ist, werfe ich ArgumentOutOfRangeException in beiden Fällen aus. Es gibt also einen Leistungseinbruch.
Try-Create
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;
}
}
Dieses Muster hat die Validierung nur einmal, sondern wir greifen den so genannten Fehlercodes verwendet, die keine gute Praxis betrachtet wird.
Create-Fang
try
{
CreateUser(user);
}
catch(UserExistsException)
{
act on user exists error;
}
catch(UsernameExistsException)
{
act on username exists error;
}
I Fehlercodes nicht hier, aber ich habe jetzt eine separate Ausnahmeklasse für jeden Fall zu schaffen. Es ist mehr oder weniger wie Ausnahmen verwendet werden sollen, aber ich frage mich, ob es sinnvoll ist, eine separate Ausnahme anstelle des Enumerationseintrags zu erstellen.
Haben wir also einen klaren Gewinner oder ist es mehr eine Frage des Geschmacks?
Sie könnten an Raymond Chens Blog-Posts interessiert sein ["Cleaner, eleganter und falscher"] (http://blogs.msdn.com/b/oldnewthing/archive/2004/04/22/118161.aspx) und ["Cleaner, eleganter und schwerer zu erkennen"] (http://blogs.msdn.com/b/oldnewthing/archive/2005/01/14/352949.aspx), wo er einen Fall, dass Fehlercodes macht sind besser als Ausnahmen. – ruakh
Weitere externe Referenzen? Ich bin sehr interessiert. – QED