ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Refactoring] 9장 : 데이터 조직화
    책/Refactoring 2판 2024. 2. 14. 11:35
    반응형

    변수 쪼개기

    // before
    let temp = 2 * (height + width);
    console.log(temp);
    temp = height * width;
    console.log(temp);
    
    // after
    const perimeter = 2 * (height + width);
    console.log(perimeter);
    
    const area = height * width;
    console.log(area);
    • 변수는 하나의 역할만 수행해야한다.
    • 만약 두가지 이상의 역할을 수행한다면, 변수를 쪼개고 적절한 이름을 붙여준다.
    • 참고 : 변수는 웬만하면 선언 후 바로 초기화 → 상수화하는 것이 좋다.

    필드 이름 바꾸기

    // before
    class Organization {
        get str() {}
    }
    
    // after
    class Organization {
        get title() {}
    }
    • 예시가 좀 과장되긴 했지만, 필드명 또한 애매하게 작성하면 안된다.
    • 만약 애매한게 있다면, 명확하게 바꿔주자

    파생 변수를 질의 함수로 바꾸기

    // before
    get discountedTotal() {return this.discountedTotal;}
    set discount(number) {
        const old = this.discount;
        this.discount = number;
        this.discountedTotal += old - number;
    }
    
    // after
    get discountedTotal() { return this.baseTotal - this.discount; }
    set discount(number) {
        this.discount = number;
    }
    • 위 경우 discountedTotal이라는 가변 필드가 존재하고, set discount를 할 때마다 갱신이 된다.
    • 가변 데이터는 소프트웨어의 작동 방식을 이상하게 만든다.
    • 따라서 가변 데이터를 가능한 한 줄이고, 더 줄일 수 없다면 유효 범위를 최소화해야한다.
    • 위의 경우 discountedTotal의 값은 충분히 다른 변수들로부터 계산이 가능하다.
    • 따라서 해당 필드를 지우고, 이를 만들어내는 수식을 활용하여 리턴한다.

    참조를 값으로 바꾸기

    // before
    class SomeClass {
        someFunc(arg) {
            this.someObject.field -= arg;
        }
    }
    
    // after
    class SomeClass {
        someFunc(arg) {
            this.someObject = new SomeObject(this.someObject.arg - arg);
        }
    }
    • 객체 안의 내부 객체의 경우 참조 혹은 값으로 취급할 수 있다.
    • 참조 : 내부 객체의 필드를 수정할 때 내부 객체는 그대로 둔 채 그 객체의 속성을 갱신 (위의 방식)
    • 값 : 내부 객체의 필드를 수정할 때 새로운 필드를 담은 객체로 기존 내부 객체를 통째로 대체
    • 값으로 사용하는 경우 불변임을 만족할 수 있다. 즉, 한 객체가 생성되었을 때의 상태가 절대 변하지 않는 것이다.
      • 이러한 불변 데이터는 내부로의 영향을 걱정할 필요가 없다.
      • 분산 시스템과 동시성 시스템에서 좋다.
    • 그러나, 특정 객체를 여러 객체에서 공유하고 있는 상태에서, 공유 객체의 값을 변경했을 때 이를 관련 객체 모두에 알려줘야 한다면 공유 객체를 참조로 다뤄야함 (뭔소린지 모르겠다..)

    값을 참조로 바꾸기

    // before
    let customer = new Customer(customerData);
    
    // after
    let customer = customerRepository.get(customerData.id);
    • 참조 객체를 값으로 다루는 것은 불변식을 제공하므로 동시성에 좋다.
    • 그러나 해당 상태를 갱신할 필요가 있을 때, 값으로 사용했다면 모두 찾아 바꿔야 한다.
    • 만약 참조로써 사용했다면 해당 참조의 필드만 수정하면 전부 바뀌므로 이점이 있다.
    • 참조로써 사용한다는 것은 그 객체가 단 하나임을 이용하는 것이므로, 싱글톤을 의미한다.
    • 이 방식을 사용하고 싶을 경우, 그 객체를 직접 생성하는 것이 아닌 repository, factory 등을 통해 받아오는 저장소가 필요해진다.
      • 싱글톤의 최대 단점은 전역 데이터를 사용할 때와 동일하다.
      • 또한 set 을 사용할 경우 null일 때 참조를 할 수도 있다.
        • 그래서 생성자 주입이 좋은 것 같다.

    매직 리터럴 바꾸기

    // before
    function potentialEnergy(mass, height) {
        return mass * 9.81 * height;
    }
    
    // after
    const STANDARD_GRAVITY = 9.81;
    
    function potentialEnergy(mass, height) {
        return mass * STANDARD_GRAVITY * height;
    }
    • 매직 리터럴 : 소스 코드에서 등장하는 일반적인 리터럴 값
    • 만약 이 값이 꽤나 중요한 의미를 가지고 있다면, 상수를 부여하여 가독성과 의미를 더해주는 것이 매우 중요하다.
    • 가급적 리터럴을 직접 쓰는 일을 줄이고 상수로써 사용해주는 게 좋다.

     

    https://product.kyobobook.co.kr/detail/S000001810241

    반응형
Designed by Tistory.