반응형
목차
자료 추상화
변수를 함수를 통해 계층을 추가한다고 해서 구현이 저절로 감춰지지는 않는다.
추상 인터페이스를 제공해 사용자가 구현을 모르는 채 자료의 핵심을 조작할 수 있어야 클래스라고 할 수 있다.
Bad :
// 해당 클래스에 getX, getY 메서드를 추가한다 해도 사용자는 x, y를 반환할 뿐일 것이라고 추측이 가능하다
// 이것은 전혀 추상화되지 않은 상태이다
public class Point {
public double x;
public double y;
}
Good :
// x, y가 실제 직교 좌표계인지, 극좌표계인지 알 수 없다
// 내부에서 변수가 바뀌던, 로직이 바뀌던 클라이언트는 상관이 없다
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}
자료/객체 비대칭
객체 vs 자료 구조
- 객체
추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개 - 자료 구조
자료를 그대로 공개
별도의 함수는 제공하지 않음
객체 지향 코드 vs 절차 지향 코드
- 객체 지향 코드
기존 함수를 변경하지 않으면서 새 클래스를 추가하기 용이
새로운 함수를 추가하기가 어려움 - 절차 지향 코드
기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 용이
새로운 자료구조를 추가하기 어려움
필요에 따라 자료구조 + 절차 지향 코드가 객체 지향 코드보다 나을 수 있다. 필요에 따라 사용하자.
디미터 법칙
모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
한 객체의 메서드가 반환하는 객체의 메서드를 호출하면 안됨
기차 충돌
Bad : 기차 충돌 상황final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath(); String outFile = outputdir + "/" + className.replace('.', '/') + ".class"; FileOutputStream fout = new FileOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(fout);
Better :
Options opts = ctxt.getOptions(); File scratchDir = opts.getScratchDir(); final String outputDir = scratchDir.getAbsolutePath();
기차 충돌 상황보다는 낫지만 각 메서드가 반환하는 값이 객체인지 자료 구조인지에 따라 디미터 법칙 위반여부가 결정됨
객체라면 내부 구조를 getter를 통해 노출시키는 것이므로 디미터 법칙을 위반하는 것
getter가 객체인지 자료 구조인지 알 수 없게 혼동을 주므로 아래와 같이 명확하게 한다.Good :
final String outputDir = ctxt.options.scratchDir.absolutePath;
잡종 구조
공개 변수가 있으면서 공개 조희/설정 함수가 있고 기능을 수행하는 함수도 있는 구조구조체 감추기
기차 충돌 예시에서 ctxt, opts, scratchDir이 진짜 객체라면?
내부의 객체를 가져다 쓰는 것이 아닌 메세지를 보내 필요한 정보를 반환 받도록 해야 한다.// outputDir의 목적이 무엇인지를 확인하여 수정한다. BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
자료 전달 객체
Data Transfer Object(DTO) - 공개 변수만 있고 함수가 없는 클래스
데이터베이스와 통신하거나 소켓에서 받은 메세지의 구문을 분석할 때 유용
- bean 구조
private 변수와 생성자, gettter만 존재 - 활성 레코드
DTO의 일반적인 형태에 save, find와 같은 탐색 함수도 제공
데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과
비즈니스 규칙 메서드를 직접 추가하지 않도록 조심해야 함
반응형
'Dev > Books' 카테고리의 다른 글
[CleanCode] 8장. 경계 (0) | 2020.05.18 |
---|---|
[CleanCode] 7장. 예외 처리 (0) | 2020.05.16 |
[CleanCode] 5장. 형식 맞추기 (0) | 2020.05.12 |
[CleanCode] 4장. 주석 (0) | 2020.05.12 |
[CleanCode] 3장. 함수 (0) | 2020.05.06 |