2008년 07월 25일
Scalaris 소스 공개
# by | 2008/07/25 14:01 | Erlang | 트랙백(1) | 덧글(1)
# by | 2008/07/23 23:58 | 트랙백 | 덧글(3)
# by | 2008/07/23 00:26 | 트랙백 | 덧글(0)
# by | 2008/07/23 00:07 | 트랙백(1) | 덧글(5)
좋은 놈, 나쁜 놈, 이상한 놈
송강호,이병헌,정우성 / 김지운
나의 점수 : ★★★★★
# by | 2008/07/18 00:03 | 트랙백 | 덧글(2)
Value Object는 상태가 변하지 않기 때문에 몇가지 장점이 있다. 자바빈즈(JavaBeans) 규약을 따르는 iBatis 등은 외부에서 읽은 데이터를setter를 통해 객체에 넣어준다. 외부에서 데이터를 읽을 때만 setter를 제공하고 그 외에는 Value Object로 사용할 수 있으면 좋겠다.
ValueObject 패턴에 따라 상태가 변하지 않는 Immutable 클래스를 구현하고, 이를 상속 받아 setter를 추가한Mutable 클래스를 구현하여 setter가 필요한 API에서는 Mutable 클래스를 사용하고 그 외에는 Immutable클래스를 사용한다.
보통 자바빈즈 규약을 따르는 클래스는 다음과 같이 구현한다.
public class Person extends ObjectSupport {
private String name;
private int age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public void older() { age += 1; }
}
자바빈즈 규약을 따르는 API들로 name, age값을 읽거나 쓸 수 있다. 외부에서 객체를 읽을 때 말고는 setter를 이용해값을 바꾸는 경우는 드물지만 자바빈즈 규약을 따르는 API를 사용해야 한다면 어쩔 수 없이 setter를 제공해야 한다. 객체를어떤 메서드의 파라메터로 전달 했을 때 setter가 제공되기 때문에 어디서나 예기치 않게 값이 바뀔 수도 있다. 예기치 않게값이 바뀌는 것을 원하지 않지만 자바빈즈 규약을 따르는 API에는 setter를 제공해야 한다. 어떻게 해야할까?
책임을 분리하면 된다. Immutable 인터페이스와 Mutable 인터페이스를 분리해서 제공한다.
public class Person extends ObjectSupport {
protected String name;
protected int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
public Person older() {
return age > 100
? new DeadPerson(name, age)
: new Mutable(this).setAge(getAge() + 1);
}
public static class Mutable extends Person {
public Mutable(Person prototype) { this(prototype.name, prototype.age); }
public Mutable() { }
public Mutable setName(String name) { this.name = name; return this; }
public Mutable setAge(int age) { this.age = age; return this; }
}
}
일반적인 경우는 다음과 같이 사용한다.
Person one = new Person("Eung-ju PARK", 29);
Person olderOne = one.older();
...
iBatis에서는 다음과 같이 ResultMap을 정의하고 DAO를 구현한다.
<resultMap id="result" class="package.Person$Mutable">
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
public Person find(String name) {
return (Person)getSqlMapClientTemplate().queryForObject("Person.find", name);
}
이제 한 번 만들어진 객체는 값이 변경되지 않는다! 멀티 쓰레드 환경에서도 캐시를 써도 이제 전혀 불안하지 않다. 혹Mutable로 업캐스팅 해서 몰래 값을 바꾼다고 해도 Mutable을 참조하는 곳을 찾으면 어디서 바꾸는지 쉽게 제거할 수있다.
Separating concerns... 초기 아이디어.
MethodChaining Mutable의 setter가 Mutable을 돌려주어 편리하게 사용할 수 있도록 변경했다. Google ProtocolBuffer Message.Builder 보다가 생각났다.
iBatis 3.0 Configuration with XML iBatis 3.0에서는 생성자를 이용해 객체에 값을 넣어주는 방법이 추가될 예정이다.
# by | 2008/07/14 01:03 | 트랙백(1) | 덧글(4)
크로우즈 제로
오구리 ,야마다 다카유키,야베 쿄스케 / 미이케 타카시
곱게 생긴 애들이 간지 폭풍 고딩들 많이 등장한다.
스트레인져 무황인담
액션이 볼만하다. 잔인하지도 않다.
플레넷 테러
극장 가서 보려고 열 두시 넘기를 기다리다 피곤해서 안보러 갔다. 극장에서 봤어야 했다.
# by | 2008/07/12 22:22 | 트랙백 | 덧글(4)
# by | 2008/07/10 23:02 | 트랙백 | 덧글(7)