[클린코드] 6장. 객체와 자료구조
자료추상화
변수를 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 같은 자료구조 + 비즈니스 규칙 메서드
활성레코드는 자료구조로 취급하기 때문에 비즈니스 규칙을 담으면서 내부 자료구조를 숨기는 객체는 따로 생성하는 것이 좋다.
Author And Source
이 문제에 관하여([클린코드] 6장. 객체와 자료구조), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@0sunset0/클린코드-6장.-객체와-자료구조저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)