Whiteship's Note


[구글 Visualization API] Fluent Interface 적용하기

모하니?/Coding : 2010.03.11 14:18


http://martinfowler.com/bliki/FluentInterface.html

이름은 좀 멋지지만 별거 아니라는...

        Statistics statistics = new Statistics(StatisticsChartType.MOTION, "스터디 참석자 통계 그래프");
        statistics.addColumn(StatisticsColumnType.STRING, "스터디 이름");
        statistics.addColumn(StatisticsColumnType.DATE, "모임 날짜");
        statistics.addColumn(StatisticsColumnType.NUMBER, "참석자 수");
        statistics.addColumn(StatisticsColumnType.NUMBER, "모임 횟수");
        statistics.addColumn(StatisticsColumnType.NUMBER, "참석율");
        statistics.addColumn(StatisticsColumnType.STRING, "스터디 상태");
        statistics.addColumn(StatisticsColumnType.STRING, "모임명 이름");

이 코드는 얼마전에 봄싹 사이트에 Statistics 메뉴를 추가하면서 코딩한 것인데 오늘 보다가 갑자기 Fluent Interface가 떠올랐습니다. 그래서 적용해봤지요.

        Statistics statistics = new Statistics(StatisticsChartType.MOTION, "스터디 참석자 통계 그래프")
            .withColumn(StatisticsColumnType.STRING, "스터디 이름")
            .withColumn(StatisticsColumnType.DATE, "모임 날짜")
            .withColumn(StatisticsColumnType.NUMBER, "참석자 수")
            .withColumn(StatisticsColumnType.NUMBER, "모임 횟수")
            .withColumn(StatisticsColumnType.NUMBER, "참석율")
            .withColumn(StatisticsColumnType.STRING, "스터디 상태")
            .withColumn(StatisticsColumnType.STRING, "모임명 이름");

조금 fluent 하게 보이나요??ㅋ 객체를 다 만든 다음에 추가하는게 아니라 객체 만들 때 메서드를 연달아 호출하는 모양이여서 메서드 이름을 add -> with로 변경했습니다. 메서드 리턴 타입도 당연히 바꿨지요.

장점은 저렇게 조금 API가 이쁘고 사용하기 편해진다는 것이고 단점은 디버깅할 때 조금 불편할 수 있다는데.. 머.. 글쎄요. 그다지...
top


EasyMock - Changing Behavior for the Same Method Call

모하니?/Coding : 2008.03.01 23:41


같은 메소드가 여러번 호출 될 때, 매번 예측되는 결과가 다르다면..

memberDao.add(member); // Member 객체가 무사히 저장된다.
memberDao.add(member); // 예외가 발생한다.

이런 경우에 그냥 fluent interface로 계속해서 andReturn() 이나 andThrow()를 호출하여 recording 할 수 있습니다.

memberDao.add(member)
    .andReturn(resultMember);
    .adndThrow(new DuplicatedEmailException());

테스트 클래스 내부에서 의존하는 객체를 여러번 호출할 때, 각각이 다른 행위를 해야 한다면 유용하겠습니다.
top


Fluent Interface

Hibernate/study : 2007.01.24 00:14


참조 : http://www.martinfowler.com/bliki/FluentInterface.html
번역 : http://younghoe.info/1

오늘 OpenSeed 스터디를 통해서 알게 된 단어이자 어떻게 해석해야 할지 막막한 '흐르는 듯한 인터페이스'라고 하면 어울리려나..

code를 보시면 감이 팍 올 것 같습니다.

before
private void makeNormal(Customer customer) {
Order o1 = new Order();
customer.addOrder(o1);
OrderLine line1 = new OrderLine(6, Product.find("TAL"));
o1.addLine(line1);
OrderLine line2 = new OrderLine(5, Product.find("HPK"));
o1.addLine(line2);
OrderLine line3 = new OrderLine(3, Product.find("LGV"));
o1.addLine(line3);
line2.setSkippable(true);
o1.setRush(true);
}
after
   private void makeFluent(Customer customer) {
customer.newOrder()
.with(6, "TAL")
.with(5, "HPK").skippable()
.with(3, "LGV")
.priorityRush();
}

멋지지 않나요? DSL(Domain Specific Language)과도 관계가 있고 Value Object 이야기가 나오는걸 보니 DDD(Domain Driven Design)와도 관계가 있는 글 같습니다.

가독성 좋고, 코드 길이가 짧아져서 좋은 것 같습니다. 본문에 단점이라고 꼽은 것으로는 메소드 그 자체만 보면 의아해 할 수도 있다는 내용이 있었습니다. setter에 리턴타입이 표기 되기 때문에 그럴 수 있지요. 따라서 "연속되는 행위"에 활용이 되면 좋겠다는 내용이 있습니다.

Anyway 멋지네요.

'Hibernate > study' 카테고리의 다른 글

DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
top