假设有一个创建用户的操作。如果指定的电子邮件或用户名存在,此操作可能会失败。如果失败,则需要确切知道原因。在我看来,有三种方法可以做到这一点,我想知道是否有明显的赢家。
所以,这是一个类用户:
class User
{
public string Email { get; set; }
public string UserName { get; set; }
}
并且有 3 种方式来完成创建操作:
测试创建
if (UserExists(user)) act on user exists error;
if (UsernameExists(user)) act on username exists error;
CreateUser(user);
UserExists 和 UsernameExists 向数据库服务器发出请求以进行验证。这些调用在 CreateUser 中再次重复,以确保正确使用 API。如果验证失败,我在这两种情况下都会抛出 ArgumentOutOfRangeException。因此,性能受到了影响。
尝试创建
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;
}
}
这种模式只进行一次验证,但我们求助于使用所谓的错误代码,这不被认为是一种好的做法。
创造捕获
try
{
CreateUser(user);
}
catch(UserExistsException)
{
act on user exists error;
}
catch(UsernameExistsException)
{
act on username exists error;
}
我在这里不使用错误代码,但我现在必须为每种情况创建一个单独的异常类。或多或少应该如何使用异常,但我想知道创建一个单独的异常而不是枚举条目是否值得。
那么,我们有明确的赢家还是更多的是品味问题?