[클린코드] 10장 깨끗한 클래스를 작성하는 방법

JUN·2024년 8월 19일
0

클린코드

목록 보기
10/14

클래스 체계

  • 클래스 정의 시 가장 먼저 변수 목록이 나와야 함.
  • 정적(public) 상수 → 정적(private) 변수 → 인스턴스(private) 변수 순으로 나열.
  • 공개 함수는 비공개 함수보다 먼저 나와야 하며, 비공개 함수는 호출하는 공개 함수 직후에 배치.

캡슐화

  • 변수와 유틸리티 함수는 가능한 공개하지 말아야 함.
  • 테스트 코드에서 접근이 필요한 경우 protected로 선언.
  • 캡슐화는 언제나 최후의 수단으로 풀어야 함.

클래스는 작아야 한다!

  • 클래스는 가능한 작게 설계해야 함.
  • 클래스의 크기는 물리적 크기보다는 책임의 수로 측정.
  • 클래스 이름이 모호하거나 길다면 책임이 많다는 신호.
  • 클래스 설명은 25단어 이내로 간결하게 작성.

단일 책임 원칙 (SRP)

  • 클래스는 변경할 이유가 하나만 있어야 함.
  • 책임이 많은 클래스는 작은 단일 책임 클래스로 분리.
  • 예를 들어, SuperDashboard 클래스는 버전 관리와 UI 관리를 동시에 담당하면 안 됨.

응집도 (Cohesion)

  • 클래스의 인스턴스 변수는 적을수록 좋음.
  • 메서드는 하나 이상의 인스턴스 변수를 사용해야 함.
  • 응집도가 높은 클래스는 논리적으로 관련된 메서드와 변수를 포함.

많은 책임을 가지고 있는 클래스를 쪼개는 방법

  1. 큰 함수를 작은 함수 여럿으로 나눈다:

    • 코드를 더 작고 이해하기 쉬운 단위로 나누어 가독성을 높입니다.
  2. 함수의 지역 변수를 인스턴스 변수로 승격시킨다:

    • 필요한 경우, 함수의 지역 변수를 인스턴스 변수로 승격시켜 함수 간의 데이터를 공유할 수 있게 합니다. 그러나 아주아주 신중하게!

    why?

    특정 함수에서만 사용되는 인스턴스 변수가 많아지면, 클래스의 응집도가 낮아질 수 있기 때문이다.

    • 아래 부분은 함수를 쪼개서 새로운 클래스로 만들기에 충분한 크기가 되지 않았다면 시도해볼 방법.
      1. 헬퍼 클래스나 유틸리티 클래스를 사용:

        • 응집도가 낮은 여러 작은 함수들을 하나의 헬퍼 클래스나 유틸리티 클래스로 모아둘 수 있습니다. 이는 함수들을 논리적으로 그룹화하는 좋은 방법이 될 수 있습니다.
        java코드 복사
        public class StringHelper {
            public static String concatenate(String a, String b) {
                return a + b;
            }
        
            public static boolean isEmpty(String str) {
                return str == null || str.isEmpty();
            }
        }
        
      2. 내부 클래스 사용:

        • 특정 클래스 내부에서만 사용되는 기능이라면, 내부 클래스로 정의하여 응집도를 높일 수 있습니다.
        java코드 복사
        public class OuterClass {
            private String value;
        
            public OuterClass(String value) {
                this.value = value;
            }
        
            public void performOperation() {
                InnerClass inner = new InnerClass();
                inner.helperMethod();
            }
        
            private class InnerClass {
                public void helperMethod() {
                    System.out.println("Value: " + value);
                }
            }
        }
        
      3. 적절한 클래스 크기 유지:

        • 클래스의 크기가 작아서 클래스로 만들 만한 크기가 되지 않더라도, 일관성과 응집도를 위해 작은 크기의 클래스를 유지하는 것이 좋습니다. 이는 이후 기능이 확장될 때 유리할 수 있습니다.
      4. 메서드 응집도 유지:

        • 클래스 내에서 메서드들이 동일한 데이터와 논리적으로 관련된 기능을 다루도록 하여 응집도를 유지합니다. 불필요하게 메서드와 변수를 분리하지 않도록 주의합니다.
  3. 응집도가 낮아지면 클래스를 단일 책임으로 나눈다:

    • 응집도가 낮아졌다고 판단되면, 클래스의 책임을 단일 책임으로 나누어 각 클래스가 하나의 역할만 수행하도록 한다.

결론

  • 클래스를 작게 유지하고 단일 책임 원칙을 따르는 것이 중요하다.
  • 응집도를 높여 관련된 메서드와 변수를 함께 묶는게 중요하다.
  • 리팩토링을 통해 프로그램을 논리적으로 분리하고 가독성을 높이는 것이 바람직하다.
profile
순간은 기록하고 반복은 단순화하자 🚀

0개의 댓글