BackEnd/Refactoring

[Refactoring] 전역 데이터 (Global Data)

샤아이인 2022. 2. 24.

백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다.

 

5. 전역 데이터

전역 데이터(Java의 Public static 변수)는 아무 곳 에서나 변경될 수 있기 때문에 문제가 된다.

어떤 코드로 인하여 어디서 변경된것 인지? 한눈에 파악하기가 매우 어렵다.

이는 Class의 필드에서 또한 같은 문제가 발생할 수 있다.

 

이를 해결하는 한가지 방법으로, 변수를 캡슐화하여 사용하면 접근을 제어할 수 있고 어디서 사용하는지 파악하기 쉽다.

 

1. 변수 캡슐화하기(Encapsulate Variable)

데이터를 변경할 경우 이를 사용하는 모든 곳에 수정을 한 번에 다 해주어야 한다.

이에 반해, 메서드는 기존 메서드를 그대로 둔 상태에서 새로운 메서드를 만들고 코드의 일부분이 그 새로운 메서드를 사용하게 만든다면, 점진적으로 변경할 수 있다는 장점이 있다.

 

변수를 직접 접근하여 사용하는 부분이 있다면 이를 메서드로 감싸주자!

함수를 사용해서 값을 변경하면 보다 쉽게 검증 로직을 추가하거나 변경에 따르는 후속 작업을 추가하기 편하다.

 

또한 데이터의 사용 Scope가 커지면 커질수록 캡슐화 하는 것 이 더 좋다.

 

다만, 불면데이터 같은 경우 변경이 되지 않기 때문에 이러한 리팩토링을 적용하지 않아도 된다.

 

예를 들어 다음 코드를 살펴보자.

public class Thermostats {

    public static Integer targetTemperature = 70;
    public static Boolean heating = true;
    public static Boolean cooling = false;
    public static Boolean readInFahrenheit = true;
    
}

위 코드의 변수는 다른 코드 어디에서나 Thermostats.heating 과 같은 형식으로 접근하여 수정이 가능하다.

이를 메서드로 감싸면 다음과 같아진다.

package me.whiteship.refactoring._05_global_data._17_encapsulate_variable;

public class Thermostats {

    private static Integer targetTemperature = 70;
    private static Boolean heating = true;
    private static Boolean cooling = false;
    private static Boolean readInFahrenheit = true;

    public static Integer getTargetTemperature() {
        return targetTemperature;
    }

    public static void setTargetTemperature(Integer targetTemperature) {
        // 온도 거증 과정
        Thermostats.targetTemperature = targetTemperature;
        // 후처리 과정
    }

   // 나머지 getter, setter 생략
}

변수들은 모두 private로 변경되었고, 오작 메서드를 통해서만 접근, 수정할 수 있게 변경되었다.

또한 메서드를 통해 사용함으로써, 해당 변수를 사용하기 전의 검증과정(전처리) 나 사용한 후의 clean up 과정 (후처리)등이 가능해진다.

댓글