본문 바로가기
독서에서 한걸음

Split Variable

by oncerun 2022. 12. 5.
반응형

 

데이터를 변경하다 보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생한다. 

이를 보통 사이드 이펙트라고 하는데, 특정 부분의 변경이 외부에서도 영향을 끼쳐 의도하지 않은 버그가 발생하는 것이다. 

 

함수형 프로그래밍 언어는 참조가 아닌 복사본을 전달한다. 하지만 그 밖의 프로그래밍 언어는 데이터 변경을 허용하고 있다. 따라서 변경되는 데이터를 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다.

 

 

변수 쪼개기 ( Split Variable )

어떤 변수가 여러 번 재할당 되어도 적절한 경우

 

 - 반복문에서 순회하는데 사용하는 변수 또는 인덱스

 - 값을 축적시키는데 사용하는 변수

 

그밖에 경우에 재할당 되는 변수가 있다면 해당 변수는 여러 용도로 사용되는 것이며 변수를 분리해야 더 이해하기 좋은 코드를 만들 수 있다.

 

즉 변수 하나 당 하나의 책임을 지도록 만들고, val, final, const 등을 통해 상수를 활용하자.

 

public void updateGeometry(double height, double width) {
    double temp = 2 * (height + width);
    System.out.println("Perimeter: " + temp);
    perimeter = temp;

    temp = height * width;
    System.out.println("Area: " + temp);
    area = temp;
}

 

temp라는 변수는 두 번 할당된다. 둘레를 구하는 값과 넓이를 구하는 값이다. 

 

이 코드를 가독성 좋게 만들고 싶다면 다음과 같이 변경해볼 수 있다.

 

double perimeter = 2 * (height + width);
System.out.println("Perimeter: " + perimeter);
this.perimeter = perimeter;

double area = height * width;
System.out.println("Area: " + area);
this.area = area;

 

비슷한 코드를 한 번더 고쳐보자.

public double distanceTravelled(int time) {
    double result;
    double acc = primaryForce / mass;
    int primaryTime = Math.min(time, delay);
    result = 0.5 * acc * primaryTime * primaryTime;

    int secondaryTime = time - delay;
    if (secondaryTime > 0) {
        double primaryVelocity = acc * delay;
        acc = (primaryForce + secondaryForce) / mass;
        result += primaryVelocity * secondaryTime + 0.5 * acc * secondaryTime + secondaryTime;
    }

    return result;
}

 

코드를 한번 보자. 

 

힘을 질량으로 나누어서 가속도를 할당한다 ( double acc =primaryForce / mass;)

 

총 걸린 시간과 delay시간을 계산해서 최소 값을 구해서 첫 번째 가속도에 걸린 시간을 구하는다. 

 

최종 이동한 거리를 구한다. ( result = 0.5 * acc * primaryTime * primartTime)  나중에 위치에서 처음 위치를 뺀 실제 이동 거리를 구하기 위해  1/2 * at^2을 해준 걸로 보인다. 

 

갑분 물리공식이 나와버리네?

 

두 번째 시간을 구하고 0보다 크다면 현재 속력을 구하고 다시 가속도를 재계산한다. 

초기 속력에 남은 시간만큼 이동한 거리를 구하는 코드로 보입니다.

 

결국엔 result에 값이 두 번 할당되고, 가속도 (acc)에 두 번 값이 할당됩니다.

 

result는 값을 축적시키는데 사용하기 때문에 여러 번 할당되는 것은 타당하다고 생각한다. 

public double distanceTravelled(int time) {
    double result;
    double primaryAcceleration = primaryForce / mass;
    int primaryTime = Math.min(time, delay);
    result = 0.5 * primaryAcceleration * primaryTime * primaryTime;

    int secondaryTime = time - delay;
    if (secondaryTime > 0) {
        double primaryVelocity = primaryAcceleration * delay;
        double secondaryAcceleration = (primaryForce + secondaryForce) / mass;
        result += primaryVelocity * secondaryTime + 0.5 * secondaryAcceleration * secondaryTime + secondaryTime;
    }

    return result;
}

 

그리고 final을 주면 더욱 더 이해하기가 쉬워집니다.

public double distanceTravelled(int time) {
    double result;
    final double primaryAcceleration = primaryForce / mass;
    int primaryTime = Math.min(time, delay);
    result = 0.5 * primaryAcceleration * primaryTime * primaryTime;

    int secondaryTime = time - delay;
    if (secondaryTime > 0) {
        final double primaryVelocity = primaryAcceleration * delay;
        final double secondaryAcceleration = (primaryForce + secondaryForce) / mass;
        result += primaryVelocity * secondaryTime + 0.5 * secondaryAcceleration * secondaryTime + secondaryTime;
    }

    return result;
}

 

 

 

 

반응형

댓글