IT/책

[Clean Code] 6장, 객체와 자료 구조

Terriermon 2021. 11. 5. 00:36

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