본문 바로가기
ETC/개발 지식

[CleanCode] 6장 객체와 자료구조

by heekng 2022. 7. 2.
반응형

6장 객체와 자료구조

자료 추상화

// 구체적인 클래스
public class Point {
    public double x;
    public double y;
}
// 추상적인 클래스
public interface Point {
    double getX();
    double getY();
    void setCartesian(double x, double y);
    double getR();
    double getTheta();
    void setPolar(double r, double theta);
}
  • 변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지는 않는다.
    • 구현을 감추려면 추상화가 필요하다.
  • 자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다.
  • 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다.

자료/객체 비대칭

  • 객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며, 절차적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다.
    • 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다.
    • 절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다.
    • 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.
    • 객체 지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다.

디미터 법칙

  • 디미터 법칙: 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
    • 디미터 법칙을 어긴 예) ctxt.getOptions().getScratchDir().getAbsolutePath();

기차 충돌

// 기차 충돌 코드
ctxt.getOptions().getScratchDir().getAbsolutePath();
// 개선 코드
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
  • 디미터 법칙을 위반하는지 여부는 객체인지 자료구조인지에 달렸다.
  • 객체라면 내부 구조를 숨겨야 하므로 디미터 법칙을 위반한다.
  • 자료구조라면 당연히 내부 구조를 노출하므로 디미터 법칙이 적용되지 않는다.

잡종 구조

  • 때때로 절반은 객체, 절반은 자료구조인 잡종 구조가 나온다.
  • 이런 잡종 구조는 새로운 함수는 물론이고 새로운 자료 구조도 추가하기 어렵다.
  • 그러므로 잡종 구조는 되도록 패하는 편이 좋다.

구조체 감추기

  • 객체라면 뭔가를 하라고 말해야지 속을 드러내라고 말하면 안된다.
  • 절대경로를 달라 (X) -> 임시 파일을 생성해라 (O)

자료 전달 객체

  • 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다.
  • 자료 구조체를 때로는 자료 전달 객체(DTO)라 한다.

활성 레코드

  • 활성 레코드는 DTO의 특수한 형태다.
  • 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료구조지만, 대개 save나 find와 같은 탐색 함수도 제공한다.
  • 활성 레코드는 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과다.
  • 활성 레코드는 자료구조로 취급한다.
    • 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성한다.

객체는 동작을 공개하고 자료를 숨긴다.
그래서 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉬운 반면, 기존 객체에 새 동작을 추가하기는 어렵다.
자료구조는 별다른 동작 없이 자료를 노출한다.
그래서 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기는 어렵다.

반응형

'ETC > 개발 지식' 카테고리의 다른 글

빅오(Big-O) 표기법  (0) 2022.09.04
[CleanCode] 8장 경계  (0) 2022.07.04
[CleanCode] 7장 오류 처리  (0) 2022.07.02
[CleanCode] 5장 형식 맞추기  (0) 2022.06.30
[CleanCode] 4장 주석  (0) 2022.06.28
[CleanCode] 3장 함수 - 2  (0) 2022.06.26