2 분 소요

코드를 명료하게 설명하는 요소 중 하나는 이름이다.

그렇기 때문에 함수, 모듈, 변수, 클래스 들은 이름만 보고도 각각 무슨 일을 하고 어떻게 사용해야 하는지 명확하게 알 수 있어야 한다.

냄새와 관련한 Refactoring 기술은 다음과 같다.

  • 함수 선언 바꾸기
  • 이름 바꾸기
  • 필드 이름 바꾸기

함수 선언 바꾸기

함수란 프로그램을 작은 부분으로 나누는 주된 수단이다.

함수 선언은 각 부분이 서로 맞물리는 방식을 표현하고, 소프트웨어에서는 연결부 역할을 한다.

연결부를 잘 정의하면 시스템에 새로운 부분을 추가하기 쉽지만, 잘못 정의하게 되면 요구사항이 바뀔 때

적절히 수정하기 어렵게 된다.

이러한 연결부에서 가장 중요한 요소는 함수의 이름이다.

예를들어 게시글들을 가져오는 method가 있다고 가정하자.

{1}
private List<Post> po(){
  ... 
}

{2}
private List<Post> getPostList(){
  ...
}

{1}의 경우 게시글과 관련한 method 인지는 파악할 수 있지만 어떠한 동작을 하는 것인지 알기가 어렵다.

이에 반해 {2}의 경우 post의 list를 가져오는 method 인 지 바로 파악을 할 수 있다.

이처럼 이름이 좋으면 함수명만 보고 바로 어떠한 일을 하는 지 알 수 있다.

함수의 매개변수도 마찬가지로 연결부에서 중요한 요소이다.

예를 들어, 전화번호 포매팅 함수가 매개변수로 사람을 받는다고 하자. 이러한 경우 회사 전화번호 포매팅에는 활용을 할 수가

없다. 만약 사람 대신에 전화번호 값 자체 를 받는다면 이 함수의 활용도를 높일 수 있다.

함수 바꾸기에는 간단한 절차와 마이그레이션 절차가 있다.

[간단한 절차]

  1. 매개변수를 제거하려고 할 때에는 함수 본문에서 제거 대상 매개변수를 참조하는 곳이 없는지 확인한다.
  2. 메서드 선언을 원하는 형태로 바꾼다.
  3. 기존 메서드 선언을 참조하는 부분을 모두 찾아 바뀐 형태로 수정한다.
  4. 테스트

[마이그레이션 절차]

  1. 이어지는 추출단계를 수월하게 만들어야 한다면 함수 본문을 적절히 리팩터링 한다.
  2. 함수 본문을 새로운 함수로 추출한다.
    • 만약 함수의 이름이 기존 함수와 같다면, 임시 이름을 붙여둔다.
  3. 추출한 함수에 매개변수를 추가해야 한다면 [간단한 절차]를 따라 추가한다.
  4. 테스트
  5. 기존 함수를 인라인 시킨다.
  6. 이름을 임시로 붙여두었다면 이름을 되돌린다.
  7. 테스트

변수 이름 바꾸기

이름의 중요성은 사용 범위에 영향을 많이 받는다.

한줄짜리 람다식에서 사용하는 변수는 대체로 쉽게 파악이 가능하다. 마찬가지로 간단한 함수의 매개변수 이름도 짧게 지어도 될 때가 많다. 하지만 함수 호출 한번으로 끝나지 않고 값이 영속되는 필드라면 이름에 신경써야한다.

[절차]

  1. 폭넓게 쓰이는 변수라면 변수 캡슐화를 고려한다.
  2. 이름을 바꿀 변수를 참조하는 곳을 모두 찾아 하나씩 변경한다.
  3. 테스트

필드 이름 바꾸기

Record 자료 구조의 필드 이름은 프로그램 전반에 걸쳐 참조될 수 있기 때문에 매우 중요하다.

Record 자료구조란? 특정 데이터와 관련있는 필드를 묶어놓은 자료 구조.

예를 들어 Record 에 학생과 관련한 데이터들이 있다고 할 때

{1}
public record Student(String nm, int grade, Enum<Gender> gender) {
}

{2}
public record Student(String name, int grade, Enum<Gender> gender) {
}

1의 경우 nm이 무엇인지 데이터를 보지 않고는 알기 힘들다. 그렇기 때문에 2와 같이 작성을 해야한다.

[절차]

  1. 레코드의 유효범위가 제한적이라면 필드에 접근하는 모든 코드를 수정한 후 테스트.
    • 이후 단계는 필요 없다.
  2. 레코드가 캡슐화 되지 않았다면 레코드 캡슐화 진행
  3. 캡슐화된 객체 안의 private 필드명을 변경하고, 내부 메서드들을 수정
  4. 테스트
  5. 생성자의 매개변수 중 필드와 이름이 겹치는게 있다면 함수 선언 바꾸기로 변경
  6. 접근자의 이름 변경

댓글남기기