이 글에서는 클린코드 3장 함수에서 다룬 플래그 인수 관련 리팩토링을 다룹니다.
책에서는 함수에 플래그 인수를 넘기는 것에 대해 하기의 단점을 언급했습니다.
render(true);
render(false);
true
, false
에 따라 함수 동작이 어떻게 달라지는지 이해하려면 내부 코드를 이해해야만 합니다.클라이언트 코드에서 함수의 의미를 알기 어려울 뿐더러, 메서드 내부 코드 자체도 필수적으로 분기문을 넣어 처리해야 하므로 함수를 분리하는 것이 더 좋은 코드라는 의견에 공감했습니다. 다음은 유저의 테스트 관련 통계를 조회하는 메서드입니다.
public ReadUserTestingStats readUserTestingStats(Long targetUserId, Long myUserId, String type) {
User targetUser = findUserByIdOrThrowIfNonexistentUser(targetUserId);
int uploadBoardCount = getUploadBoardCountBy(targetUserId);
ReadRankQuery readRankQuery = getRankAndCompletedTestStatsBy(targetUserId);
int completedTestCount = 0;
Integer rank = null;
if (readRankQuery != null) {
completedTestCount = readRankQuery.getCompletedTestCount();
rank = readRankQuery.getRank();
}
String nickname = targetUser.getNickname();
// 다른 유저 정보의 경우에는 서로 도움 횟수까지 Response
if (type.equals(USER_INFO_REQUEST_TYPE_ANOTHER)) {
long interactionCounts = userInteractionStatusRepository.countUserInteractionStatusByUserId(myUserId, targetUserId);
return new ReadUserTestingStats(completedTestCount, uploadBoardCount, rank, nickname, interactionCounts);
}
return new ReadUserTestingStats(completedTestCount, uploadBoardCount, rank, nickname, null);
}
public ReadUserTestingStats readMyTestingStats(Long userId) {
User user = findUserByIdOrThrowIfNonexistentUser(userId);
return readUserTestingStats(user, null);
}
public ReadUserTestingStats readAnotherTestingStats(Long targetUserId, Long myUserId) {
User targetUser = findUserByIdOrThrowIfNonexistentUser(targetUserId);
long interactionCounts = getInteractionCountBy(targetUserId, myUserId);
return readUserTestingStats(targetUser, interactionCounts);
}
public ReadUserTestingStats readUserTestingStats(User user, Long interactionCounts) {
int uploadBoardCount = getUploadBoardCountBy(user.getId());
ReadRankQuery readRankQuery = getRankAndCompletedTestStatsBy(user.getId());
int completedTestCount = extractCompletedTestCount(readRankQuery);
Integer rank = extractRank(readRankQuery);
String nickname = user.getNickname();
return new ReadUserTestingStats(completedTestCount, uploadBoardCount, rank, nickname, interactionCounts);
}
readAnotherTestingStats
메서드만 수정하면 됩니다.위 리팩토링 과정을 진행해 보면서 하나의 역할을 하는 함수라면 네이밍도 쉬워질 뿐 아니라, 의미 전달도 명확해 진다고 느껴졌습니다. 또한, 함수를 분리하여 공통적인 부분은 별도의 함수를 만들어 재사용이 가능하니 더 간결한 함수 작성이 가능했습니다. 함수가 간결해지고, 의미가 명확해지니 코드 상으로 자신을 조회할 때와 다른 유저를 조회할 때의 차이점도 빠르게 확인할 수 있었습니다.
피드백은 언제나 환영입니다! 🙇🏻♂️