08. 기능 이동

8.1 함수 옮기기#

  • 좋은 설계의 핵심은 모듈화가 얼마나 잘되어 있는가를 뜻하는 모듈성 이다
    • 모듈성은 수정할 때 관련 기능과 깊이를 작은 일부만 이해해도 가능하게 해주는 능력
  • 프로그램의 이해도가 높아질수록 요소들을 더 잘 묶는 새로운 방법을 알게됨
  • 객체 지향 프로그래밍의 핵심 모듈화 컨텍스트는 클래스
  • 필요에 따라 새로운 컨텍스트를 만들어야할 때도 있음

함수를 옮겨야 하는 신호#

  • 어떤 함수가 자신이 속한 A 요소보다 B 요소를 더 많이 참조할 때
  • 다음 업데이트 때 바뀌리라 예상되는 위치가 생각날 때

옮길 장소를 정하기 어려울 때#

  • 옮겨야 할 대상 함수의 현재 컨텍스트와 후보 컨텍스트를 둘러보면 도움
  • 살펴보면 도움되는 요소
    • 대상 함수를 호출하는 곳
    • 대상 함수가 호출하는 함수들
    • 대상 함수가 사용하는 데이터
  • 정 어려우면 한 컨텍스트에 일단 몰아보기, 이후 인사이트를 얻을 확률이 높음

함수 옮기기 리팩터링 절차#

  1. 옮길 대상 함수가 현재 컨텍스트에 사용 중인 모든 프로그래밍 요소를 살펴보기. 요소 중 같이 옮길 것이 있는지 고민
  2. 선택한 함수가 다형 메서드인지 확인 (같이 옮겨줘야 하므로)
  3. 옮겨질 컨텍스트(target context)로 선택한 함수를 복붙. 타겟 함수가 타겟 컨텍스트에 어울리도록 다듬기 (이름변경, 파라미터 변경 등)
    • target function: 복붙된 함수
    • source function: 기존 옮겨질 대상 함수
  4. 정적 분석
  5. 소스 컨텍스트에 타겟 함수를 참조할 방법을 찾아 반영
  6. 소스 함수를 타겟 함수의 위임 함수가 되도록 수정
  7. 테스트
  8. 소스 함수를 인라인할지 고민
    • 제거하는 편이 맞지만 너무 많은 의존성이 있으면 다 파악하기 어려움

8.2 필드 옮기기#

  • 프로그램의 진짜 힘은 데이터 구조에서 나온다
  • 데이터 구조를 잘못 선택하면
    • 아귀가 맞지 않는 데이터를 다루기 위한 코드로 범벅
    • 데이터 구조 자체의 역할도 파악하기 어려움
  • 경험과 도메인 주도 설계 같은 기술이 가장 적합한 데이터 구조를 만들어낼 때 도움
  • 현재 데이터 구조가 적절치 않음을 깨달으면 바로 수정

필드를 옮겨야하는 신호#

  • 함수에 어떤 레코드를 옮길 때 마다 따라 붙는 필드가 있을 때
  • 한 레코드를 변경하려 할 때 다른 레코드도 변경할 때

필드 옮기기 리팩터링 절차#

  1. 소스 필드가 캡슐화되어 있지 않다면 캡슐화
  2. 테스트
  3. 타겟 객체에 필드, 접근자 메서드 생성
  4. 정적 검사
  5. 소스 객체에 타겟 객체를 참조할 수 있는지 확인
    • 간단치 않다면 타겟 객체를 저장할 새필드를 소스 객체에 생성
  6. 접근자들이 타겟 객체를 사용하도록 수정
  7. 테스트
  8. 소스 필드 제거
  9. 테스트

8.3 문장을 함수로 옮기기#

Move Statements into Function

  • 문장이라고 표현해서 헷갈리는데, 여기서 말하는 문장은 Statement 라고 해석하자
  • 중복 제거 방법 중 하나
  • 해당 리팩터링을 했는데 여러 변형이 다시 나눠야하는 순간이 오면 다시 역으로 문장을 호출하는 곳으로 옮기면 된다 (8.4)
  • 문장을 함수로 옮기려면 대상 함수의 일부라는 확신이 있어야함
  • 애매하다면 매당 문장들과 피함수를 통째로 하나의 함수로 추출할 수 있다 (6.1)

문장을 함수로 옮겨야하는 신호#

  • 특정 함수를 호출하는 코드가 나올 때 마다 그 앞이나 뒤에 똑같은 코드가 발생할 때

8.4 문장을 호출한 곳으로 옮기기#

Move Statements to Callers

  • 8.3 과 반대 리팩터링
  • 초기엔 응집도가 높고 한 가지 일만 수행하던 함수가 둘 이상의 다른 일을 수행하게 바뀔 수 있다
  • 단순하게는 호출자로 일부 문장을 넘길 수 있다
  • 책임이 불분명해지거나 할 땐, 호출자와 호출 대상의 경계를 다시 그어야 할 때도 있음
    • 이럴 땐 함수 인라인 (6.2) 후, 문장 슬라이드 (8.6) + 함수 추출하기 (6.1) 로 더 적합한 경계를 설정할 수 있다

문장을 호출한 곳으로 옮겨야 하는 신호#

  • 한가지 일을 수행하던 함수가 둘 이상의 다른 일을 수행하게 될때 고려 가능
  • 여러 곳에서 사용하던 함수가 일부 호출자에서 다르게 동작하도록 바뀌어야 할 때
Last updated on