✍️ 악취 : 이해하기 힘든 이름
깔끔한 코드에서 가장 중요한 것은 좋은 이름이다.
좋은 이름을 위해 크게 세 가지 리팩토링을 활용할 수 있다.
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;
}
}
'리팩토링' 카테고리의 다른 글
[리팩토링] 악취 6 : 가변 데이터 (0) | 2022.11.27 |
---|---|
[리팩토링] 악취 5 : 전역 변수 (0) | 2022.11.13 |
[리팩토링] 악취 4. 긴 매개변수 목록 (0) | 2022.11.06 |
[리팩토링] 악취 3. 긴 함수 (0) | 2022.10.30 |
[리팩토링] 악취 2. 중복 코드 (0) | 2022.10.29 |