用Resharper和bug进行重构,为什么?

时间:2018-03-30 09:01:57

标签: c# .net resharper

我有一个方法,我认为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;
}

将重构版本返回到原始版本后,所有错误都消失了。仅仅为了自我改善的目的,有人可以告诉我我做错了什么吗?我看不到任何东西,但很明显它打破了很多东西,所以它一定有所作为。

3 个答案:

答案 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