티스토리 뷰

개발서적

[CleanCode] 함수 인수

seungwonlee 2024. 8. 7. 23:24

함수에서 이상적인 인수 개수는 0개(무항)다. 다음은 1개(단항)이고, 다음은 2개(이항)이다. 3개(삼항)는 가능한 피하는 편이 좋다. 4개 이상(다항)은 특별한 이유가 필요하다. 특별한 이유가 있어도 사용하면 안 된다.

로버트 C. 마틴, 《클린코드》, 박재호·이해영 옮김, 인사이트, 2013, 50쪽

 

함수의 인수가 많아질수록 코드의 복잡성이 증가하고 유지보수성이 떨어지기 때문에, 인수가 많은 함수는 일반적으로 바람직하지 않습니다. 이는 특히 이항 함수와 삼항 함수에서 더욱 중요할 수 있습니다. 주요 이유는 다음과 같습니다.

 

1. 가독성 저하

  • 인수가 많은 함수는 읽고 이해하기 어렵습니다. 함수의 목적과 동작을 이해하는데 더 많은 시간이 필요합니다.
public void process(String name, int age, String address, String phone, String email, boolean isActive) {
    // 복잡한 처리
}

2. 유지보수 어려움

  • 인수가 많은 함수는 변경이 발생할 경우 유지보수가 어렵습니다. 인수 중 하나를 변경하거나 추가하면 함수 호출부도 모두 수정해야 합니다.

3. 테스트 복잡성 증가

  • 인수가 많을수록 다양한 인수 조합을 테스트해야 하므로 테스트 케이스 작성이 복잡해지고, 모든 경우를 테스트하기 어려워질 수 있습니다.

4. 재사용성 감소

  • 인수가 많은 함수는 특정 상황에만 적합한 경우가 많아 재사용성이 떨어집니다. 다른 상황에서는 필요한 인수만큼만 사용하고 싶어도, 모든 인수를 제공해야 합니다.

5. 코드 스멜

  • 인수가 많은 함수는 코드 스멜로 간주됩니다. 이는 코드가 비효율적이거나 잘못 설계되었음을 나타낼 수 있습니다. 이는 리팩토링의 신호가 될 수 있습니다.

해결 방법

1. 인수 객체 사용

  • 인수가 많을 경우, 관련된 데이터를 객체로 묶어 전달할 수 있습니다.
public class UserInfo {
    private String name;
    private int age;
    private String address;
    private String phone;
    private String email;
    private boolean isActive;

    // 생성자, 게터 및 세터
}

public void process(UserInfo userInfo) {
    // 처리
}

2. 메서드 분할

  • 한 가지 작업에 집중하도록 함수를 작은 단위로 분할하여 각각의 함수가 적은 인수를 받도록 합니다.
public void processUser(String name, int age) {
    // 사용자 기본 정보 처리
}

public void processContact(String address, String phone, String email) {
    // 연락처 정보 처리
}

public void processStatus(boolean isActive) {
    // 상태 처리
}

3. 빌더 패턴 사용

  • 객체 생성 시 여러 인수를 단계적으로 설정할 수 있도록 빌더 패턴을 사용할 수 있습니다.
public class UserInfo {
    private String name;
    private int age;
    private String address;
    private String phone;
    private String email;
    private boolean isActive;

    public static class Builder {
        private String name;
        private int age;
        private String address;
        private String phone;
        private String email;
        private boolean isActive;

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setAge(int age) {
            this.age = age;
            return this;
        }

        public Builder setAddress(String address) {
            this.address = address;
            return this;
        }

        public Builder setPhone(String phone) {
            this.phone = phone;
            return this;
        }

        public Builder setEmail(String email) {
            this.email = email;
            return this;
        }

        public Builder setIsActive(boolean isActive) {
            this.isActive = isActive;
            return this;
        }

        public UserInfo build() {
            return new UserInfo(this);
        }
    }

    private UserInfo(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
        this.phone = builder.phone;
        this.email = builder.email;
        this.isActive = builder.isActive;
    }
}

public void process(UserInfo userInfo) {
    // 처리
}

결론

이러한 방법들을 통해 함수의 인수를 최소화하면 코드가 더 명확하고, 유지보수가 쉬워지며, 테스트와 재사용이 용이해집니다. 이는 소프트웨어 품질을 높이고 개발 속도를 향상하는 데 큰 도움이 됩니다.

 

끝.

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함