[리팩토링] 악취 1. 이해하기 힘든 이름

 

✍️ 악취 : 이해하기 힘든 이름 

깔끔한 코드에서 가장 중요한 것은 좋은 이름이다.
좋은 이름을 위해 크게 세 가지 리팩토링을 활용할 수 있다.

1. 함수 선언 변경

2. 변수 이름 변경

3. 필드 이름 변경

 

악취 가득한 코드

@AllArgsConstructor
@Getter
public class Person {

    private String name;
    private int age;
}
@Getter
public class CustomerRepository {

    private static int sequenceId = 1;

    private List<String> names = new ArrayList<>();
    private List<Integer> ages = new ArrayList<>();
    private List<Integer> ids = new ArrayList<>();

    private void customer(Person person) {
        names.add(person.getName());
        ages.add(person.getAge());
        ids.add(sequenceId++);
    }

    public static void main(String[] args) {
        CustomerRepository repository = new CustomerRepository();

        Person person = new Person("Kang", 20);
        repository.customer(person);

        repository.getNames().forEach(System.out::println);
        repository.getAges().forEach(System.out::println);
        repository.getIds().forEach(System.out::println);
    }
}

 

🍊 함수 선언 변경

좋은 이름을 가진 함수는 이름만 보고도 구현을 예상할 수 있다.

좋은 이름을 찾는 방법은 함수에 주석을 달고 주석을 함수 이름으로 만들어본다.

 

함수의 매개 변수는 함수의 문맥을 결정한다. 때로는 정말 필요한 매개변수를 플랫하게 넘겨줄 수 있고, 매개 변수를 포함하는 오브젝트를 넘길 수 있다. 상황에 따라 결정해야 하며 정해진 답은 없다. 

public class CustomerRepository {

    private static int sequenceId = 1;

    private List<String> names = new ArrayList<>();
    private List<Integer> ages = new ArrayList<>();
    private List<Integer> ids = new ArrayList<>();

    // customer -> saveCustomer
    private void saveCustomer(Person person) {
        names.add(person.getName());
        ages.add(person.getAge());
        ids.add(sequenceId++);
    }
    
    ```

 

🌱 변수 이름 변경

변수의 스코프가 넓을수록 이름이 중요하다. 가령 람다식 혹은 루프에서 사용하는 변수는 심플하게 짓는 반면 전역변수는 명확한 의미를 갖도록 작성한다.

// name -> customerName
private void saveCustomer(Person customer) {
    names.add(customer.getName());
    ages.add(customer.getAge());
    ids.add(sequenceId++);
}

 

🍃 필드 이름 바꾸기

클래스의 필드는 어플리케이션 전반에 걸쳐 참조될 수 있으므로 명확한 의미를 갖도록 작성해야 한다. 경우에 따라 관련 있는 필드들은 클래스로 묶어서 관리할 수 있다.

@Getter
public class CustomerRepository {

    private static int sequenceId = 1;

    // names, ages, ids -> customers
    private List<Customer> customers = new ArrayList<>();

    private void saveCustomer(Person customer) {
        customers.add(new Customer(sequenceId++, customer.getName(), customer.getAge()));
    }


    public static void main(String[] args) {
        CustomerRepository repository = new CustomerRepository();

        Person person = new Person("Kang", 20);
        repository.saveCustomer(person);

        repository.getCustomers().forEach(System.out::println);
    }

    @AllArgsConstructor
    @Getter
    @ToString
    private static class Customer {
        private int id;
        private String name;
        private int age;
    }
}