2008/03/24 - [direct] - Java와 Keyword Parameter : map을 이용한 파라미터 전달 혹은 수많은 파라미터를 넘겨줄 것 인가?

2008/03/24 - [direct] - 뭉쳐져 있는 파라미터와 펼쳐져 있는 파라미터 해결은?

에 이은 3번째 시간이다.

먼저 구현을 해보았는데

라이브러리화 시킬 수는 없는 패턴 정도의 추상화를 뽑아보았다.

아이디어는 Enum 객체와 Annotation 정도 인데

메소드에 어노테이션을 붙여서 필수 파라미터와 옵션 파라미터를 각각 정의 할 수 있도록 하는 정도까지 진행해보았는데

아무래도 Enum에 사용할 파라미터들을 소스 단계에서 선언해주어야 한다는 것이 부담이 되어서

팩토리로 생성 하는 것으로 변경을 고려 중이다.

<T> T getParam() 같이 몰랐던 문법도 있으니 소스를 첨부한다.


public enum P {
    KEYWORD, INDEX;
   
    private String name = this.name();
    private Object value;
   
    @Override
    public String toString() {
        return name;
    }
    public <T> T getParam(){
        return (T)(value);
    }

    public <T> P v(T parameterValue) {
        this.value = parameterValue;
        return this;
    }
    public static void validate(Class<? extends TestedClass> clazz,
            String methodName, P[] params) throws IllegalArgumentException{
        try {
            Method method = clazz.getMethod(methodName, P[].class);
            if(method.isAnnotationPresent(Parameters.class)){
                Parameters parameters = method.getAnnotation(Parameters.class);
                P[] required = parameters.required();
            }
        } catch (SecurityException e) {
            throw new UnsupportedOperationException(e);
        } catch (NoSuchMethodException e) {
            throw new UnsupportedOperationException(e);
        }
    }
    public static Map<P, Object> toMap(P[] params) {
        // TODO Auto-generated method stub
        return null;
    }
}
@Target(ElementType.METHOD)
public @interface Parameters {
    P[] required();
    P[] optional();
}
public class TestedClass {

    @Parameters(optional={P.KEYWORD}, required={P.INDEX})
    public void callMethod(P... params) {
        P.validate(this.getClass(),"callMethod",params);
        Map<P, Object> param = P.toMap(params);
        params[0].<Integer>getParam();
//        this.otherMethod((param.get(P.INDEX)),param.get(P.KEYWORD));
    }

    private void otherMethod(int index, String keyword) {
        // TODO Auto-generated method stub
      
    }

}

이 방식에서 더 진행을 한다고 하면

아마 validate 메소드를 컴파일 단계에서 처리할지, 런타임에서 처리할지 결정해야 할 것이다.




크리에이티브 커먼즈 라이선스
Creative Commons License

'direct' 카테고리의 다른 글

노트북 설정기  (0) 2008/04/07
파라미터 전달을 묶어서 보내고 싶다.  (2) 2008/04/01
Opera를 설치했습니다.  (0) 2008/03/28
Adapter Pattern  (2) 2008/03/27
Posted by 허혁

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2008/04/01 23:54
    댓글 주소 수정/삭제 댓글
    왠지 잘 정리하면 우아한 모델이 나올 것 같다는 느낌이 들어. 전에 고고씽하면서 잠시 보여준 내 Map코드가 부끄러워지는데 ㅋㅋ

    다만 읽고 나서 두 가지 의문점이 들었는데,
    (내가 정확히 이해한 게 맞는지는 모르겠지만)

    첫번째는 파라메터를 위해 Enum을 이용하는 것이 Parameter Object을 만들어 쓰는 것과 비교하여 어떠한 차이점이 있는 것인지?

    두번째는 메서드 위에 Annotation을 이용하면 P에 대한 제약 정보가 여러 곳에 중복되어 흩어지게 되는 결과를 초래하지 않을까? 예를 들면 P가 여러 레이어를 지나거나 경우 여러 곳에 동일한 제약 정보가 기술되어야 하는 것이 아닐까 생각 되어.
  2. 2008/04/02 13:59
    댓글 주소 수정/삭제 댓글
    첫번째 Enum을 사용한 이유는 Annotation에서 사용하기 위해서.( Parameter Object는 사용할 수가 없어..)

    두번째 P가 여러 레이어를 지나가게 할때 발생할 문제는..

    이 파라미터 압축(?)의 용도가 레이어 시작과 끝에서 사용하려는 것이 목적이라서 동일 제약 정보는 한번만 사용할 수 있도록 하는게 목적인데

    아직까지는 오용이 있을 수 있을 것 같아.

◀ PREV : [1] : ... [16] : [17] : [18] : [19] : [20] : [21] : [22] : [23] : [24] : ... [88] : NEXT ▶

BLOG main image
안녕하세요. 안정된 코딩, 여유로운 프로젝트, 떠오르는 코더 by 허혁

카테고리

분류 전체보기 (88)
direct (50)
indirect (21)
transmissive (10)
agenda (4)
idea (3)

달력

«   2008/07   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

최근에 달린 레몬펜 쪽지

Statistics Graph
Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.