Setter方法违反了不变性并添加了意外耦合!
重构步骤:
- 找到 setter 的用法
- 如果您正在设置基本属性,请将它们移动到构造函数并删除该方法
- 如果你需要改变一个偶然的属性,它不是一个 setter。删除 setXXX 前缀
public class Point { protected int x; protected int y;
public Point() { this.x = 0; this.y = 0; }
public void setX(int x) { this.x = x; }
public void setY(int y) { this.y = y; } }
Point location = new Point(); //At this momment, it is not clear which points represent //It is coupled to constructor decision. //Might be null or some other convention
location.setX(1); //Now we have point(1,0)
location.setY(2); //Now we have point(1,2)
|
重构后的代码:
//1. We locate setters usage location.setX(1);
location.setY(2);
//2. If you are setting essential properties move //them to the constructor and remove the method public class Point { public Point(int x, int y) { this.x = x; this.y = y; //We remove the setters }
Point location = new Point(1, 2);
|
另外一个案例:
public class Car { protected int speed;
public Car() { }
public void setSpeed(Speed desiredSpeed) { this.speed = desiredSpeed; } }
Car tesla = new Car(); //We have no speed??
tesla.setSpeed(100 km/h); //Now our car runs fast
|
重构后的代码:
public class Car { protected int speed;
public Car() { this.speed = 0 km/h; }
public void speed(Speed desiredSpeed) { this.speed = desiredSpeed; } }
//1. Locate the setters usage //3. If you need to change an accidental property // it is not a setter. Remove the setXXX prefix
Car tesla = new Car(); //Our car is stopped
tesla.speed(100 km/h); //We tell the desired speed. We don't set anything //We don't care if the car stores its new speed. //if it manages through the engine //if the road is moving etc
|
我们应该用我们的 IDE 检测 setter(除非他们使用元编程)。
如果我们有良好的覆盖率,我们也可以删除它们并查看哪些测试失败