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
函數?現在我需要更改我的姓名排名功能。如果我使用內置的String類,我知道沒有任何注入這個函數會改變。