尝试从方法中检索成功/失败和对象时要选择的模式
本文关键字:对象 选择 模式 失败 方法 成功 检索 | 更新日期: 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命名约定(TryParse
、TryGetValue
等)。
这两种方法的问题是,您不知道为什么无法检索到用户。
例如,如果您的Get
或TryGet
方法如下。。。
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;
}
这样,你就知道什么是失败的,你就有了更好的信息来进一步登录链。