Clean Code - 로버트 C.마틴
6장, 객체와 자료 구조
변수를 비공개(private)로 정의하는 이유: 변수에 의존하지 않게 만들기 위해
그렇다면 왜 get, set을 사용하여 공개(public)할까?
1. 자료 추상화
- 추상 인터페이스를 제공하여 사용자가 구현을 모른 채 자료의 핵심을 조작 할 수 있어야 함
- 자료를 세세하게 공개하기 보다 추상적인 개념으로 표현
Bad Code
public class Point{
public double x;
public double y;
}
> 구현을 외부로 노출하는 함수 ( private로 선언하더라도 get, set을 이용하면 외부에 노출하는 것과 마찬가지)
Clean Code
public interface Point{
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}
> 자료구조를 명백하게 표현
> 좌표를 읽을 때, 각 값을 개별적으로 읽어야 함
2. 자료/객체 비대칭
- 객체 = 추상화 뒤로 자료를 숨긴 채 함수만 공개
- 자료구조 = 자료를 그대로 공개, 별다른 함수 제공 X
- 자료구조를 사용하는 절차적 코드는 기존 자료 구조를 변경하지 않고 새 함수를 추가하기 쉬움
▶️ 새로운 자료 구조를 추가하기 어려움: 모든 함수를 고쳐야 함
- 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉬움
▶️ 새로운 함수를 추가하기 어려움: 모든 클래스를 고쳐야 함
📌 때로는 절차지향 코드가 적합한 상황도 있다.
3. 디미터 법칙: 모듈은 자신이 조작하는 객체의 속사정을 몰라야한다.
- 디미터 법칙이 어긋난 코드
1) 기차 충돌 코드
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
> 기차처럼 늘어지는 코드는 조잡하다고 여겨짐
> 각각의 함수가 어떤 객체를 리턴하는지 알 수 없음
Clean Code
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
> 각각 함수가 어떤 객체를 리턴하는지 확실하게 알 수 있음
> 만약 ctxt, option, ScratchDir이 자료구조라면 노출하는 것이 맞음
💡 그러나 자료 구조가 아닌 이유
- 자료구조는 함수 없이 공개 변수만 포함
//자료구조일 경우 finalt String outputDir = ctxt.options.scratchDir.absolutePath;
2) 잡종 구조: 절반은 객체, 절반은 자료 구조인 구조
3) 구조체 감추기
- 왜 dir의 절대 경로가 필요한가? ➡️ 임시 파일을 생성하기 위해
- ctxt가 절대 경로를 가져오지 않고, 임시 파일 생성을 하면 해결할 수 있음
4. 자료 전달 객체(DTO)
- 자료 구조체(DTO): 공개 변수만 있고 함수가 없는 클래스
> 데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 단계에서 가장 처음 사용하는 구조체
- 자료 구조체 = 빈(bena): private 변수를 조회/설정 함수로 조작
- 활성 레코드: DTO의 특수한 형태
> 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료구조
> save, find와 같은 탐색 함수도 제공
'IT > 책' 카테고리의 다른 글
[Clean Code] 8장, 경계 (0) | 2021.11.07 |
---|---|
[Clean Code] 7장, 오류 처리 (0) | 2021.11.07 |
[Clean Code] 5장, 형식 맞추기 (0) | 2021.10.30 |
[Clean Code] 4장, 주석 (0) | 2021.10.30 |
[Clean Code] 3장, 함수 (0) | 2021.10.28 |