클래스 설계 : 모든 것과 연결되는 설계 기반
바람직한 클래스 설계하기를 드라이기에 빗대어 설명할 수 있다.
클래스는 인스턴스 변수
와 메소드
로 구성된다.
클래스는 자기 방어
를 해야한다.
class Money {
final int amount; // 인스턴스 변수를 immutable 하게 final로 제한
final Currency currency;
Money(int amount, Currency currency) { // 생성자 정의
validate(amount, currency); // guard
this.amount = amount;
this.currency = currency;
}
Money add1(final int amount) { // 계산 로직은 클래스 내부 메소드로 구현
return new Money(this.amount + amount, currency); // 값을 변경하려면 새로운 인스턴스를 만들어내라
}
Money add2(final Money money) { // 독자적인 자료형을 파라미터로 전달해라
validateCurrency(money.getCurrency());
return new Money(this.amount + money.getAmount(), currency);
}
}
생성자로 정상적인 값을 설정해라
생성자 내부에 validation 역할의 guard 코드를 정의해라
클래스 변수에 관련된 계산 로직을 클래스 메소드로 구현해라
인스턴스 변수를 immutable하게 만들어라
메소드의 매개변수와 지역변수를 모두 immutable하게 만들어라
엉뚱한 값을 전달하지 않기 위해 기본 자료형이 아닌 독자적인 자료형을 정의하여 파라미터로 전달해라
의미없는 메소드를 추가하지 말아라!!
응집도가 높은 구조로 만들거나, 잘못된 상태로부터 프로그램을 방어하는 설계 방법을 디자인 패턴
이라고 한다.
이 책에서 소개하는 몇 가지 디자인 패턴
완전 생성자
: 인스턴스를 잘못된 상태로부터 보호값 객체
: 특정한 값과 관련된 로직의 응집도를 높임완전 생성자 (complete constructor)
잘못된 상태로부터 클래스를 보호하기 위한 디자인 패턴이다
값 객체 (value object)
값을 클래스로 나타내는 디자인 패턴이다.
완전 생성자 & 값 객체는 객체 지향 설계에서 폭 넓게 사용되는 기법이다.