重构 001 - 删除Java的Setter方法


Setter方法违反了不变性并添加了意外耦合!
重构步骤:

  1. 找到 setter 的用法
  2. 如果您正在设置基本属性,请将它们移动到构造函数并删除该方法
  3. 如果你需要改变一个偶然的属性,它不是一个 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(除非他们使用元编程)。
如果我们有良好的覆盖率,我们也可以删除它们并查看哪些测试失败