尝试从方法中检索成功/失败和对象时要选择的模式

本文关键字:对象 选择 模式 失败 方法 成功 检索 | 更新日期: 2023-09-27 18:26:31

我正在与同事讨论不同的实现技术

备选方案A

User user;
if (users.TryGet(1, out user))
    Console.WriteLine(user.ToString()); 
else
    Console.WriteLine("Failed to get user.."); 

备选方案B

ResultSet<User> result = users.Get(1); 
if(result.OK)
    Console.WriteLine(user.ToString()); 
else
    Console.WriteLine("Failed to get user.."); 

备选方案A在行为上与int.Parse(string, out value)相似,并且易于扩展和读取。当成功看起来容易且可读时,向输出中添加更多对象。

备选方案B似乎有点复杂,因为每行上都有更多的代码。但是可以扩展为包括CCD_ 2中的其他信息以及对象返回。返回多个对象或任何关于解决方法的想法是否更困难?

使用这样的参数是否被认为是丑陋/糟糕的做法?

尝试从方法中检索成功/失败和对象时要选择的模式

通常,Microsoft不鼓励在公共方法中使用out参数。如果一个方法未能完成由其名称标识的工作,则抛出异常是一种正确的方法。在这种情况下,如果Get方法无法获取数据记录,则应该存在异常。如果这种情况经常发生,您可以使用Alternative B来稍微提高性能,而不是每次都抛出异常。
对于备选方案A,在这种情况下,方法应命名为TryGet,以符合FCL命名约定(TryParseTryGetValue等)。

这两种方法的问题是,您不知道为什么无法检索到用户。

例如,如果您的GetTryGet方法如下。。。

public bool TryGet(int userId, out User user) {
    try {
        var conn = CreateDbConnection();
        var myUser = GetUser(userId, conn);
        user = myUser;
        return true;
    }
    catch {
        return false;
    }
}

那么在检索用户时,您就无法知道什么失败了。可能无法创建DB连接,可能不存在具有指定ID的用户,等等。

一个更好的方法可能是:

public MyUser GetUser(int userId) {
    MyDbConnection conn;
    try {
        conn = CreateDbConnection();
    }
    catch (Exception ex) {
        throw new Exception("The DB connection could not be created.", ex);
    }
    MyUser myUser = GetUser(userId, conn);
    if (myUser == null)
        throw new Exception("No user exists with the ID '" + userId + "'.");
    return myUser;
}    

这样,你就知道什么是失败的,你就有了更好的信息来进一步登录链。