IntelliJ-IDEA 中有一个重构工具,它允许我从方法中提取参数对象。
这将执行以下操作:
public interface ThirdPartyPoint {
float getX();
float getY();
}
前:
class Main {
public static float distanceBetween(float x1, y1, x2, y2) {
return distanceBetween(x1, y1), x2, y2);
}
public static float distanceBetween(ThirdPartyPoint point1, ThirdPartyPoint point2) {
return distanceBetween(point1.getX(), point1.getY(), point2.getX(), point2.getY());
}
}
后:
class Main {
public static float distanceBetween(Point point1, Point point2) {
return Math.sqrt(Math.pow(point2.getX() - point1.getX(), 2) + Math.pow(point2.getY() - point1.getY(), 2));
}
public static float distanceBetween(ThirdPartyPoint point1, ThirdPartyPoint point2) {
return distanceBetween(new Point(point1.getX(), point2.getY()), new Point(point2.getX(), point2.getY()));
}
private static class Point {
private final float x;
private final float y;
private Point(float x, float y) {
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public float getY() {
return y;
}
}
}
为什么这比以前更好?
现在,如果我必须使用这个方法,我需要在每次调用它时创建一个新的点对象。而以前,我可以只使用原始类型。
我的感觉是方法签名通常应该朝相反的方向发展。例如,如果你有一些函数可以找出一个名字有多受欢迎,如下所示:
public int nameRanking(String name) {
// do something with name
}
然后你像这样提取一个参数对象:
public int nameRanking(Person person) {
// do something with person.getName()
}
这不是让事情变得更糟吗?例如,如果在Person
从重构菜单创建类之后,我决定删除该getName()
方法,因为我不希望该名称对所有人公开可用,但其他类使用了该nameRanking
函数,该怎么办?现在我需要更改我的 nameRanking 函数。如果我使用内置的 String 类,我知道注入这个函数的任何东西都不会改变。