💻 6-1
아래 두 코드는 2차원 점을 표현한다.
public class Point { public double x; public double y; }
첫번째 코드는 변수를 private로 선언하더라도 값마다 get/set 함수를 제공하기 때문에 구현을 외부로 노출된다. 따라서 추상 인터페이스를 사용할 필요가 있다. 형식 논리에 치우쳐 조회 함수와 설정 함수로 변수를 다룬다고 클래스가 되지는 않는다.
public interface Point { double getX(); double getY(); void setCartesian(double x, double y); double getR(); double getTheta(); void setPolar(double r, double theta); }
두번째 코드는 자료 추상화를 통해 구현을 숨긴다. 이처럼 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스라고 할 수 있다.
새로운 자료타입이 필요할 경우 클래스와 객체 지향 방법이 적합
새로운 함수가 필요할 경우 절차적인 코드와 자료구조가 적합
디미터 법칙은 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙을 의미한다.
클래스 C의 메서드 F는 다음과 같은 객체의 메서드만 호출해야 한다.
하지만 위 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안된다.
아래와 같은 코드를 기차 충돌이라고 한다. 이는 디미터 법칙을 어기는 코드이다.
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
해당 코드는 지양해야 하며 아래와 같이 나누는 편이 좋다.
Options opts = ctxt.getOptions();
File scratchDir = opts.getScartchDir();
final String outputDir = scratchDir.getAbsolutePath();
절반은 객체, 절반은 자료 구조인 것을 의미한다. 객체와 자료 구조의 특성이 모두 있기 때문에 새로운 함수와 새로운 자료 구조를 추가하기 어렵다. 그러므로 되도록 피하는 게 좋다.
자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스이다. 이러한 자료 구조체를 때로는 자료 전달 객체라고 한다.
활성 레코드는 자료구조로 취급한다. 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성한다.