우리는 남들이 변수에 의존하지 않게 만들고 싶기 때문에 변수를 비공개로 정의한다. 하지만 프로그래머들은 getter, setter를 이용해서 변수를 공개하곤 한다.
자료를 세세하게 공개하기 보단 추상적인 개념으로 표현하는 것이 낫다.
// 직교 좌표계라는 것 드러남
public class Point {
public double x;
public double y;
}
// 직교 좌표계인지 알 수 없음
// 접근 정책을 강제
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
.
.
.
}
getter, setter는 구현을 외부로 노출하게 한다. 구현을 감추기 위해서 추상 인터페이스를 이용해야 한다.
// 구체적 숫자값 반환
public interface Vehicle {
double getFuelTankCapactiryInGallons();
double getFallonsOfGasoline();
}
// 백분율이라는 추상적인 개념 사용
public interface Vehicle {
double getPercentFuelRemainig();
}
객체 : 자료를 숨기고 자료를 다루는 함수만 공개
자료 : 자료를 그대로 공개
// 절차 지향
public double area(Object shape) throws NoSuchShapeException
{
if (shape instanceof Square) {
// 정사각형 넓이 구하는 코드
}
else if (shape instanceof Rectangle) {
// 직사각형 넓이 구하는 코드
}
else if (shape instanceof Circle) {
// 원 넓이 구하는 코드
}
}
// 객체 지향
public class Square implements Shape {
private Point topLeft;
private double side;
public double area() {
// 정사각형 넓이 구하는 코드
}
}
절차적인 코드 : 자료 구조 변경 어렵. 새 함수 추가 쉬움.
객체지향 코드 : 새 함수 추가 어렵. 자료 구조 변경 쉬움.
: 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다.
클래스 C의 메서드 f가 호출할 수 있는 메서드의 범위 :
// 디미터 법칙 어김
ctxt.getOptions().getScratchDir().getAbsolutePath();
// ctxt가 자료구조라면 변수 바로 호출
ctxt.options.scratchDir.absolutePath;
// ctxt가 너무 많은 정보를 알고 있음
ctst.getAbsolutePathOfScratchDirectoryOption();
// 객체는 정보 제공보다 뭔가를 해야 함
ctxt.createScratchFileStream(classFileName);
활성 레코드
는 DTO의 특수한 형태
DTO에 save, find 등의 비즈니스 규칙 메서드를 추가
이를 자료 구조로 취급하면 안된다!
-> 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체를 따로 선언해야 한다.