Refactoring & CleanCode

기이한 이름 (Mysterious Name)

Tommy__Kim 2023. 4. 5. 11:02

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

 

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

냄새와 관련한 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. 접근자의 이름 변경

'Refactoring & CleanCode' 카테고리의 다른 글

전역 데이터 (Global Data)  (0) 2023.04.10
중복코드 (Duplicated Code)  (0) 2023.04.05