1. 알고자 하는 것
- 짧은 메서드 vs 긴 메서드, 무엇이 더 좋은 코드인가?
- 짧은 메서드를 만들기 위한 메서드 추출 (Extract method)
2. 알게된 것
짧은 메서드 vs 긴 메서드, 무엇이 더 좋은 코드인가?
- (긴 메서드) 메서드가 길수록 코드의 가독성이 떨어진다.
- (짧은 메서드) 짧고 많은 메서드로 구성되어 문맥 전환이 많아진다.
- "과거에는" 과도한 서브루틴 호출로 오버헤드가 존재했다.
- 현재는 서브루틴 호출으로 인한 오버헤드까지 고려하며 코드를 짤 필요는 없다.
- 짧은 메서드에 대해 "좋은 이름 (= 가독성이 좋은 이름)"을 사용했다면 해당 메서드의 코드를 보지 않아도 의미를 이해할 수 있다.
- 기억하자. '구현'을 나타내야 하는 것이 아니라, '의미'를 나타내는 것이 좋은 메서드이다.
짧은 메서드를 만들기 위한 메서드 추출 (Extract method)
- 짧은 메서드를 만들기 위해, 기존의 긴 코드에 대해 특정 기능 block 단위로 메서드를 추출하여 리팩토링하자. (Extract Method)
private void printParticipants(int eventId) throws IOException {
// Get github issue to check homework
GitHub gitHub = GitHub.connect();
GHRepository repository = gitHub.getRepository("HunSeongPark/HunSeongPark");
GHIssue issue = repository.getIssue(eventId);
// Get participants
Set<String> participants = new HashSet<>();
issue.getComments().forEach(c -> participants.add(c.getUserName()));
// Print participants
participants.forEach(System.out::println);
}
- 위와 같이 기능이 주석 단위로 구현되어 있다면, 주석 단위를 하나의 block으로 묶어 메서드를 추출한다.
private void printParticipants(int eventId) throws IOException {
GHIssue issue = getGhIssue(eventId);
Set<String> participants = getUsernames(issue);
print(participants);
}
private Set<String> getUsernames(GHIssue issue) throws IOException {
Set<String> usernames = new HashSet<>();
issue.getComments().forEach(c -> usernames.add(c.getUserName()));
return usernames;
}
private GHIssue getGhIssue(int eventId) throws IOException {
GitHub gitHub = GitHub.connect();
GHRepository repository = gitHub.getRepository("HunSeongPark/HunSeongPark");
GHIssue issue = repository.getIssue(eventId);
return issue;
}
private void printReviewers() throws IOException {
GHIssue issue = getGhIssue(30);
Set<String> reviewers = getUsernames(issue);
print(reviewers);
}
private static void print(Set<String> reviewers) {
reviewers.forEach(System.out::println);
}
- 이제 printParticipants() 메서드는 issue를 가져오고 / usernames를 가져오고 / 이를 출력하는 코드로 가독성이 명확해진다.
3. 정리
- 메서드는 '구현'이 아닌 '의미'를 나타내도록 작성하여 가독성을 높이는 것이 중요하다.
- 이를 위해, 긴 코드는 기능 단위를 block으로 나누어 메서드를 추출하여 짧은 여러개의 메서드로 나누어 리팩토링한다.
Reference
'Clean Code' 카테고리의 다른 글
Java 리팩토링 - 조건문 분해하기 (0) | 2023.10.31 |
---|---|
Java 리팩토링 - 함수를 명령(Command)으로 바꾸기 (0) | 2023.10.06 |
Java 리팩토링 - 메서드 추출 시 매개변수가 많아질 경우 [3. 객체 통째로 넘기기] (0) | 2023.09.26 |
Java 리팩토링 - 메서드 추출 시 매개변수가 많아질 경우 [2. 매개변수 객체 만들기] (0) | 2023.06.20 |
Java 리팩토링 - 메서드 추출 시 매개변수가 많아질 경우 [1. 임시 변수를 질의 함수로 바꾸기] (0) | 2023.06.20 |