토론하기 : http://goo.gl/Uy3wZ6
저자는 책에서 클래스를 객체의 팩토리로 설명하고 있다.
객체지향의 사실과 오해를 읽으면서 타입과 클래스의 차이에 대해 고민해 본적이 있고, Java 라는 언어가 특히 타입과 클래스를 구분하기 어려운 측면이 존재한다.
잠시 이에 대해 예시를 들어 소개하자면 클래스는 Vectors
이고 타입은 Vector<String>
와 Vector<Integer>
. 즉 2가지 타입의 인스턴스는 동일한 클래스의 인스턴스 이지만 타입이 다른 것을 확인 할 수 있다.(자바는 raw type 이 있어 혼동을 준다)
위 설명을 보면 클래스를 객체의 팩토리로 설명하는 것을 이해 할 수 있다.
클래스는 단순히 기능에 기반해서 이름을 지어서는 안된다.
클래스는 협력을 하기 위해 책임을 가지고 메세지를 주고 받는다.
이러한 클래스는 단순히 공장의 기계가 아닌 스스로 자율성과 캡슐화를 지닌 하나의 능동적인 책임의 관리자로 바라보는 것이 바람직하다. 따라서 클래스의 이름은 관리자로써의 그 자체에 초점을 모아야 한다.
추가 : 토론하기에 들어가면 1장 부터 굉장히 의견이 분분하다.
토론하기 : http://goo.gl/brqhYS
(용어정리)주 생성자 : ctor
응집도가 놓고 견고한 클래스에는 적은 수의 메서드와 상대적으로 많은 수의 ctor 이 존재한다(객체는 행동기반 + 단일책임) - 많은 수의 ctor 은 유연성을 향상시킨다.
저자는 1개의 ctor 을 위치시키고 여러개의 부(secondary) ctor 이 주 ctor 을 호출하도록 만들라고 한다.
final class Cash {
private final int cents;
private final String currency;
public Cash() { // secondary
this(0);
}
public Cash(int cts) { // secondary
this(cts, "USD");
}
public Cash(int cts, String crn) { // primary
this.cents = cts;
this.currency = crn;
}
// methods here
}
'하나의 주 ctor 가 다수의 부 ctor(one primary, many secondaty)' 원칙의 핵심은 중복 코드를 방지하고 설계를 더 간결하게 만들기 때문에 유지 보수성이 향상되는 점이다
맞다. 바로 그점이 포인트이다.
토론하기 : http://goo.gl/DCMFDY
public final class EnglishName implements Name {
private final String name;
public EnglishName(final CharSequence text) {
this.name = text.toString().split(" ", 2)[0];
}
@Override
public String first() {
return this.name;
}
}
public final class EnglishName implements Name {
private final CharSequence text;
public EnglishName(final CharSequence txt) {
this.text = txt;
}
@Override
public String first() {
return this.text.toString().split("", 2)[0];
}
}
class Cash {
private int dollars;
Cash(float dlr) {
this((int) dlr);
}
Cash(String dlr) {
this(Cash.parse(dlr));
}
Cash(int dlr){
this.dollars = dlr;
}
}
토론하기를 보면 더 좋은 방법에 대한 고민이 무수히 많다.
1.1 : 객체는 책임과 캡슐화 능동성을 지닌 자율적인 존재 팩토리라 표현한다. 따라서 기능 종속적인 er 보다는 클래스 그 자체에 초점을 모은 네이밍을 사용하라
1.2 : 생성자 하나를 주 생성자로 만들어 코드 중복을 방지하고 설계를 단순화 하자
1.3 : 생성자에 코드를 넣지 말자. 실제 사용 시점까지 객체 변화 작업을 연기하자. 하지만 입력 변수의 타입변경은 부생성자에서 진행해도 괜찮을거같다(주 ctor 은 객체 초기화 프로세스를 시작하는 유일한 장소이므로)
엘레강트 오브젝트 - Yegor Bugayeno 저 | 조영호 역 | 지앤선