C# 尝试从方法检索成功/失败和对象时要选择哪种模式?
我正在和同事讨论不同的实现技术 备选方案AC# 尝试从方法检索成功/失败和对象时要选择哪种模式?,c#,coding-style,naming-conventions,design-patterns,out,C#,Coding Style,Naming Conventions,Design Patterns,Out,我正在和同事讨论不同的实现技术 备选方案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(use
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..");
ResultSet result=users.Get(1);
if(result.OK)
Console.WriteLine(user.ToString());
其他的
Console.WriteLine(“未能获取用户…”);
备选方案A的行为类似于int.Parse(字符串,输出值)
,并且易于扩展和读取。当成功看起来简单易读时,向输出添加更多对象
备选方案B似乎有点复杂,因为每行上有更多的代码。但是可以扩展为在结果集中包括其他信息以及返回的对象。返回多个对象或任何有关变通方法的想法是否更困难
使用这样的参数是否被认为是丑陋/糟糕的做法 一般来说,微软。一种适当的方法是,如果一个方法无法完成由其名称标识的作业,则抛出异常。在这种情况下,如果Get
方法无法获取数据记录,则应该存在异常。如果这种情况经常发生,您可以使用备选方案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;
}
这样,您就知道了失败的地方,并且有了更好的消息可以进一步登录到链的上游。为什么不在获取之前检查用户是否存在?