“변수 캡슐화하기 (Encapsulate Variable)”를 적용해서 접근을 제어하거나 어디서 사 용하는지 파악하기 쉽게 만들 수 있다.
파라켈수스의 격언, “약과 독의 차이를 결정하는 것은 사용량일 뿐이다.”
리팩토링 17. 변수 캡슐화하기(Encapsulate Variable)
메소드는 점진적으로 새로운 메소드로 변경할 수 있으나, 데이터는 한번에 모두 변경해야 한다.
데이터 구조를 변경하는 작업을 그보다는 조금 더 수월한 메소드 구조 변경 작업으로 대체 할 수 있다.
데이터에 직접 접근해서 사용하는 코드의 경우 메서드로 감싸서 사용하면 변경에 보다 유연하게 대처가 가능하다.
데이터가 사용되는 범위가 클수록 캡슐화를 하는 것이 더 중요해진다.
함수를 사용해서 값을 변경하면 보다 쉽게 검증 로직을 추가하거나 변경에 따르는 후속 작업을 추가하는 것이 편리하다.
불변 데이터의 경우에는 이런 리팩토링을 적용할 필요가 없다.
Before
public class Thermostats {
public static Integer targetTemperature = 70;
public static Boolean heating = true;
public static Boolean cooling = false;
public static Boolean fahrenheit = true;
}
public class Home {
public static void main(String[] args) {
System.out.println(Thermostats.targetTemperature);
Thermostats.targetTemperature = -1111600;
Thermostats.fahrenheit = false;
}
}
public 이기 때문에 어디에서든 Thermostats.targetTemperature 과 같이 접근하여 값을 변경할 수 있다
Setter 의 경우 validation 로직을 추가해주면 이상한 값이 대입되는걸 막을 수 있다
public class Home {
public static void main(String[] args) {
System.out.println(Thermostats.getTargetTemperature());
Thermostats.setTargetTemperature(68);
Thermostats.setFahrenheit(false);
}
}
냄새 5. 전역데이터(Global Data)
리팩토링 17. 변수 캡슐화하기(Encapsulate Variable)
Before
public
이기 때문에 어디에서든Thermostats.targetTemperature
과 같이 접근하여 값을 변경할 수 있다After
private final
로 지정하여Getter
와Setter
로 감싸 사용한다.