대범하게

[클린코드] 19일차 - 클래스는 작게 그리고 하나의 책임만 줘라 본문

알아두면쓸데있는신기한잡학사전/독서일지

[클린코드] 19일차 - 클래스는 작게 그리고 하나의 책임만 줘라

대범하게 2023. 11. 13. 21:50
반응형

[클린코드] 19일차 - 클래스는 작게 그리고 하나의 책임만 줘라

클린코드 19일차 (p. 171~179(10장) )

10장 클래스

1장 ~ 9장 : 코드 행과 코드 블록을 올바로 작성하는 방법 + 함수를 올바로 구현하는 방법 + 함수가 서로 관련을 맺는 방식

하지만, 더 높은 차원의 단계까지 신경 쓰지 않으면 앞선 방법은 말짱도루묵  깨끗한 코드를 얻기 힘들다.

이 장에서는 깨끗한 클래스를 다룬다.

 

1. 클래스 체계

클래스를 정의하는 표준 자바 관례에 따르면,

 

- 가장 먼저 변수 목록이 나온다.

  1. 정적 static 공개 public 상수 (가 있다면 맨처음에 !)
  2. 정적 static 비공개 private 변수
  3. 비공개 인스턴스 변수
  4. (공개 변수가 필요한 경우 거의 X)

- 그 다음으로 함수 목록이 나온다.

  1. 공개 함수
  2. 비공개 함수 (자신을 호출하는 공개 함수 직후에 넣음)

즉, 추상화 단계가 순차적으로 내려간다.

 

2. 클래스는 작아야 한다!

- 클래스 만들 때 가장 중요한 규칙 : 클래스는 작아야 한다. 

- 클래스를 설계 시에도 함수와 마찬가지로 '작게' 가 기본 규칙이다.

 

- 클래스 이름해당 클래스 책임을 기술해야 한다.

- 즉, 작명은 클래스 크기를 줄이는 첫 번째 관문이다.

- 클래스 명 모호 == 클래스 책임 큼

- if / and / or / but 을 사용하지 않고 25단어 내외로

 

단일 책임 원칙 (Single Responsibility Principle)

- 클래스나 모듈을 변경할 이유가 단 하나뿐이어야 한다는 원칙.

- SRP는 객체 지향 설계에서 더욱 중요한 개념이다.

 

하지만 SRP는 클래스 설계자가 가장 무시하는 규칙 중 하나이다. 왜일까 ???

이유 1)

- 대다수는 "깨끗하고 체계적인 소프트웨어"보다는 "돌아가는 소프트웨어"에 초점을 맞춘다. (전적으로 올바른 태도다.)

- 문제는 대다수가 프로그램이 돌아가면 일이 끝났다고 여기기 때문이다.

- 단일 책임 클래스 여럿으로 분리하는 대신 다음 문제로 넘어간다...

 

이유 2)

- 또한 많은 개발자는 자잘한 단일 책임 클래스가 많아지면 큰 그림을 이해하기 어려워진다고 우려한다.

- 하지만 어느 시스템이든 익힐 내용은 그 양이 비슷하다.

 

"큰 클래스 몇 개가 아니라 작은 클래스 여럿으로 이뤄진 시스템이 더 바람직하다."

- 작은 클래스는 각자 맡은 책임이 하나며, 변경할 이유가 하나며, 다른 작은 클래스와 협력해 시스템에 필요한 동작을 수행한다.

 

응집도 Cohesion

- 클래스는 인스턴스 변수 수가 작아야 한다.

- 모든 인스턴스 변수를 메서드마다 사용하는 클래스는 응집도가 가장 높다...!

- (응집도가 높다는 말은 클래스에 속한 메서드와 변수가 서로 의존하며 논리적인 단위로 묶인다는 의미@@)

 

예시) 응집도가 높은 Stack 클래스 

public class Stack {
    private int topOfStack = 0;
    List<Integer> elements = new LinkedList<Integer>();
    
    public int size() {
    	return topOfStack;
    }
    
    public void push(int element) {
    	topOfStack++;
        elements.add(element);
    }
    
    public int pop() throws PoppedWhenEmpty {
    	if (topOfStack == 0){
        	throw new PoppedWhenEmpty();
        }
        int element = element.get(--topOfStack);
        element.remove(topOfStack);
        return element;
    }
}
// '함수를 작게, 매개변수 목록을 짧게'라는 전략을 따르다 보면 때때로 몇몇 메서드만이 사용하는 인스턴스 변수가 아주 많아진다.

 

 

응집도를 유지하면 작은 클래스 여럿이 나온다.

- 큰 함수를 작은 함수 여럿으로 쪼개다 보면 종종 작은 클래스 여럿으로 쪼갤 기회가 생긴다.

- 그러면서 프로그램에 점점 더 체계가 잡히고 구조가 투명해진다.

Comments