[클린코드] 6장. 객체와 자료구조

노을·2022년 1월 31일
1

cleancode

목록 보기
6/8
post-thumbnail

자료추상화

변수를 private으로 설정해놓고 조회, 설정 함수로 비공개 변수를 외부에 노출하면 안된다.

조회함수와 설정함수로 변수를 다룬다고 클래스가 되지는 않는다. 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 클래스다.

//구체적
public class Point {
  private double x;
  private double y;
}

//추상적 - 함수로 구현을 숨김 (직교 좌표계인지 극 좌표계인지 알 수 없음)
public interface Point {
  double getX();
  double getY();
  void setCatesian(double x, double y);
  double getR();
  double getTheta();
  void setPolar(double r, double theta);
}

그리고 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다.

(ex. 연료 상태를 구하는 메서드 - 구체적인 숫자를 구하는게 아니라 백분율과 같은 추상적인 개념으로 알려주면 어떻게 구현했는지 예상할 수 없음)


자료/객체 비대칭

객체

  • 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다.
  • 새 자료구조를 추가하기 쉽다 (함수를 수정하지 않아도 돼서)
  • 새로운 함수를 추가하기 어렵다 (모든 클래스를 수정해야 하기 때문)

자료구조

  • 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.
  • 새 함수를 추가하기 쉽다.(함수 추가해도 자료 구조 클래스 수정 필요 X)
  • 새로운 자료 구조를 추가하기 어렵다 (모든 함수를 고쳐야 하기 때문)


디미터 법칙

모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙

<클래스 Demeter 의 메서드 example가 호출할 수 있는 객체의 메서드>

class Demeter {
	private A a;

   	private int func() { return 0; }

    public void example(B b) {
        C c = new C();
        int f = func(); // Demeter의 메서드
        b.invert(); // 인수로 넘어온 객체의 메서드
        a = new A();
        a.setActive(); // Demeter인스턴스 변수에 저장된 객체의 메서드
        c.print(); // example이 생성한 객체의 메서드
    }
}

  • 기차충돌은 피하기

    //기차 충돌
    final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
    
    //기차 충돌 피하기
    Options opts = ctxt.getOptions();
    File scratchDir = opts.getScratchDir();
    final String outputDir = scratchDir.getAbsolutePath();
  • 구조체 감추기

    객체라면 뭔가를 하라고 말해야지 속을 드러내라고 말하면 안된다.

    //안좋은 얘시
    ctxt.getAbsolutePathOfScratchDirectoryOption(); //공개해야 하는 메서드가 너무 많아짐
    ctxt.getScratchDirectoryOption().getAbsolutePath();
    
    //좋은 예시
    BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName); 
    //내부 구조를 드러내지 않으며 모듈에서 해당 함수는 여러 객체를 탐색할 필요가 없다.



자료 전달 객체 (DTO)

공개변수만 있고 함수는 없는 클래스, 자료구조체를 말한다.

활성레코드 = DTO의 특수한 형태로 bean 같은 자료구조 + 비즈니스 규칙 메서드

활성레코드는 자료구조로 취급하기 때문에 비즈니스 규칙을 담으면서 내부 자료구조를 숨기는 객체는 따로 생성하는 것이 좋다.

0개의 댓글