我有一个方法,我认为if语句非常重要,我决定在Resharper的帮助下重构它,后来发现它是我遇到的很多错误的原因。
private bool isValid(User user)
{
if (user == null)
return false;
if (user.IsBot)
return true;
if (user.GetClient() == null)
return false;
if (user.GetClient().GetData() == null)
return false;
if (user.GetClient().GetData().CurrentRoomId != _room.RoomId)
return false;
return true;
}
我重构了这个
private bool isValid(User user)
{
return user?.GetClient() != null && user.GetClient().GetData() != null && user.GetClient().GetData().CurrentRoomId == _room.RoomId;
}
将重构版本返回到原始版本后,所有错误都消失了。仅仅为了自我改善的目的,有人可以告诉我我做错了什么吗?我看不到任何东西,但很明显它打破了很多东西,所以它一定有所作为。
答案 0 :(得分:5)
原始版本更具可读性,在您的重构期间,您引入了一个错误。缺少IsBot
项检查。
您可以将方法重构为:
private bool isValid(User user)
{
if (user == null)
return false;
if (user.IsBot)
return true;
return user.GetClient()?.GetData()?.CurrentRoomId == _room.RoomId;
}
仍然可读,但更短,更重要。
答案 1 :(得分:0)
如果我理解正确,如果用户对象不为null,则必须检查bot。如果用户对象为null,则必须检查GetClient,GetData等后续内容。
我会把它写成:
static bool IsValid(User user)
{
// if the user is not null and IsBot flag is true, return true
if (user != null && user.IsBot)
return true;
// either the user is null or the IsBot flag is false here, hence check the following calls
return !(user.GetClient() == null || user.GetClient().GetData() == null || user.GetClient().GetData().CurrentRoomId != _room.RoomId);
}
请注意,您必须根据您的要求更改代码,无论您是想要true还是false,都要在哪种情况下返回。
答案 2 :(得分:0)
使用lambdas定义规则的备用和功能方法,然后检查所有规则是否为true
:
private Func<User, bool>[] Requires = { get; } = new []
{
user => user?.isBot == true,
// Comparing the expression returning Nullable<bool> with true
// implicitly converts it to bool
user => (user?.GetClient()?.GetData()?.CurrentRoomId == room.RoomId) == true
}
public bool IsValid(User user) => Requires.All(r => r(user))
这也可以重构如下:
public bool isValid(User user) =>
user?.isBot == true
&&
(user?.GetClient()?.GetData()?.CurrentRoomId == room.RoomId) == true