[클린코드] 19일차 - 클래스는 작게 그리고 하나의 책임만 줘라
클린코드 19일차 (p. 171~179(10장) )
10장 클래스
1장 ~ 9장 : 코드 행과 코드 블록을 올바로 작성하는 방법 + 함수를 올바로 구현하는 방법 + 함수가 서로 관련을 맺는 방식
하지만, 더 높은 차원의 단계까지 신경 쓰지 않으면 앞선 방법은 말짱도루묵 깨끗한 코드를 얻기 힘들다.
이 장에서는 깨끗한 클래스를 다룬다.
1. 클래스 체계
클래스를 정의하는 표준 자바 관례에 따르면,
- 가장 먼저 변수 목록이 나온다.
- 정적 static 공개 public 상수 (가 있다면 맨처음에 !)
- 정적 static 비공개 private 변수
- 비공개 인스턴스 변수
- (공개 변수가 필요한 경우 거의 X)
- 그 다음으로 함수 목록이 나온다.
- 공개 함수
- 비공개 함수 (자신을 호출하는 공개 함수 직후에 넣음)
즉, 추상화 단계가 순차적으로 내려간다.
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;
}
}
// '함수를 작게, 매개변수 목록을 짧게'라는 전략을 따르다 보면 때때로 몇몇 메서드만이 사용하는 인스턴스 변수가 아주 많아진다.
응집도를 유지하면 작은 클래스 여럿이 나온다.
- 큰 함수를 작은 함수 여럿으로 쪼개다 보면 종종 작은 클래스 여럿으로 쪼갤 기회가 생긴다.
- 그러면서 프로그램에 점점 더 체계가 잡히고 구조가 투명해진다.
'알아두면쓸데있는신기한잡학사전 > 독서일지' 카테고리의 다른 글
[클린코드] 21일차/22일차/23일차 - 11장 시스템 (1) | 2023.11.16 |
---|---|
[클린코드] 20일차 - 변경하기 쉬운 클래스 == SRP, OCP 준수 (0) | 2023.11.16 |
[클린코드] 17일차/18일차 - 적시에 빠르고, 독립적이며, 반복가능하여, 자가검증 하는 단위테스트 (2) | 2023.11.13 |
[클린코드] 16일차 - 소프트웨어 경계를 깔끔하게 처리하는 기법 (2) | 2023.11.12 |
[클린코드] 15일차 - 오류 처리 (부제: 프로그램 논리와 분리해 독자적인 사안으로 고려) (1) | 2023.11.10 |