【问题标题】:How can I simplify/more readable this by using calls to InOrder (code below)如何通过使用对 InOrder 的调用来简化/更具可读性(下面的代码)
【发布时间】:2020-12-16 04:47:39
【问题描述】:

如何通过调用 InOrder(下面的代码)来简化/提高可读性。 代码的目的是检查一个 Rectangle 是否包含一个 Point。 下面是 Rectangle 类的代码,下面是 InOrder 类的代码。 我很难找到使代码更具可读性的方法,我想尽可能地简化它。

// Construct a rectangle from two arbitrary points
public class Rectangle {
private int x1;
private int y1;
private int x2;
private int y2;

public Rectangle(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}

public boolean contains(int x, int y) {
if(x1 <= x2) {
    if(x1 <= x && x <= x2) {
    if(y1 <= y2) {
        return y1 <= y && y <= y2;
    } else {
        return y2 <= y && y <= y1;
    }
    }
} else {
    if(x2 <= x && x <= x1) {
    if(y1 <= y2) {
        return y1 <= y && y <= y2;
    } else {
        return y2 <= y && y <= y1;
    }       
    }       
}

return false;
}
}



public class InOrder {
//Don't change this
public boolean OutOfOrder(int n1, int n2, int n3) {
return (n1 > n2) || (n2 > n3);
}

//The original and messy InOrder, leave this as an example of what not to do
public boolean inOrder(int n1, int n2, int n3) {
if (n2 > n1) {
  if (n3 > n2) {
    return true;
  } else {
    return false;
  }
} else if (n2 == n1) {
  if (n3 == n1) {
    return true;
  } else {
    return false;
  }
} else {
  return false;
}
}
}

【问题讨论】:

    标签: java if-statement return boolean conditional-statements


    【解决方案1】:

    方法inOrder可以这样重构:

    // InOrder
    public static boolean inOrder(int min, int n, int max) {
        if (n > min) {
            return max > n;
        } else if (n == min) {
            return n == max;
        }
        return false;
    }
    

    最好将inOrder 设为静态以避免不必要地创建InOrder 实例。

    然后Rectangle::contains 可能会被重构以定义最小值和最大值,然后重用修改后的InOrder::inOrder:

    // class Rectangle
    public boolean contains(int x, int y) {
        int minx = x1 < x2 ? x1 : x2;
        int maxx = x1 > x2 ? x1 : x2;
        int miny = y1 < y2 ? y1 : y2;
        int maxy = y1 > y2 ? y1 : y2;
        return InOrder.inOrder(minx, x, maxx) && InOrder.inOrder(miny, y, maxy);
    }
    

    也可以对Math.min / Math.max 方法以及inOrder 使用静态导入,然后Rectangle::contains 可以重写为单行:

    import static java.lang.Math.min;
    import static java.lang.Math.max;
    import static InOrder.inOrder;
    
    // class Rectangle
    public boolean contains(int x, int y) {
        return inOrder(min(x1, x2), x, max(x1, x2)) && inOrder(min(y1, y2), y, max(y1, y2));
    }
    
    

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多