Załóżmy, że istnieje operacja, która tworzy użytkownika. Ta operacja może zakończyć się niepowodzeniem, jeśli istnieje określony adres e-mail lub nazwa użytkownika. Jeśli się nie udało, trzeba dokładnie wiedzieć, dlaczego. Są trzy podejścia do tego, jak to widzę i zastanawiam się, czy istnieje wyraźny zwycięzca.Który projekt jest najkorzystniejszy: testuj, twórz, tworzyj, przechwytuj?
Więc oto użytkownik klasa:
class User
{
public string Email { get; set; }
public string UserName { get; set; }
}
I są 3 sposoby realizacji operacji tworzenia:
Test-Tworzenie
if (UserExists(user)) act on user exists error;
if (UsernameExists(user)) act on username exists error;
CreateUser(user);
Userexists i UsernameExists sprawiają żądanie db serwer do sprawdzania poprawności. Wywołania te powtarza się ponownie w CreateUser, aby zapewnić prawidłowe korzystanie z interfejsu API. W przypadku niepowodzenia sprawdzania poprawności generuję ArgumentOutOfRangeException w obu przypadkach. Jest więc hit wydajnościowy.
Try-Tworzenie
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;
}
}
Ten wzór robi walidacji tylko raz, ale uciekać się do korzystania z tzw kody błędów, które nie są uważane za dobrą praktykę.
Create-Złap
try
{
CreateUser(user);
}
catch(UserExistsException)
{
act on user exists error;
}
catch(UsernameExistsException)
{
act on username exists error;
}
nie używam tu kody błędów, ale teraz trzeba utworzyć oddzielną klasę wyjątku dla każdego przypadku. Mniej więcej w tym sensie należy używać wyjątków, ale zastanawiam się, czy warto stworzyć osobny wyjątek zamiast wpisywania.
Czy mamy zatem wyraźnego zwycięzcę, czy raczej kwestię gustu?
Możesz być zainteresowany postami na blogu Raymonda Chena ["Czystsze, bardziej eleganckie i złe"] (http://blogs.msdn.com/b/oldnewthing/archive/2004/04/22/118161.aspx) i ["Czystsze, bardziej eleganckie i trudniejsze do rozpoznania"] (http://blogs.msdn.com/b/oldnewthing/archive/2005/01/14/352949.aspx), w którym twierdzi, że kody błędów są lepsze niż wyjątki. – ruakh
Jakieś inne odniesienia zewnętrzne? Jestem bardzo zainteresowany. – QED