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가 여러 레이어를 지나가게 할때 발생할 문제는..

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

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

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

민달군과 잠깐의 이야기를 나누어 보았다.

문득 생각난 방법이

자바에 최근 도입된 Generic과 Enum과 Map 이 3가지를 섞어 보면 가능할 것 같은 느낌이 들었다.

기본 아이디어는 위에 나왔고


Map<Enum, Object> param 을 파라미터로 넘겨주고

Enum에 대한 제약을 걸면 될 것 같다.

결국 내가 원하는 것은 param.put("param1",someObject)에 대한 지양이니깐

그 다음으로 걸리는 것은 제약을 걸 방법이다.

첫번째, contructor를 이용해서

param = new HashMap<Enum,Object>(ParamType1, ParamType2,ParamType3)

이렇게 그 Map이 받아 들일 수 있는 해시맵 구현체를 확장하는 방법

이 방법은 스프링 같은 프레임워크에 의존할 때 생성자에 대한 접근이 어렵다는 단점이 있다.

두번째 validate() 메소드 사용 : 일단 넣어보고 검증 후 사용?

세번째 빌더를 이용하는 것을 최종 목적으로 생각하는 것도 좋을 것 같다.

getList(ParameterBuilder.getBuilder(this).set(ParamType1,value1).set(ParamType2,value2).set(Param3,value3).getParams(),anotherParameter);

으흠 막상 써놓고 보니 좀 복잡하다는 느낌이 강하게 든다.

클래스 정의가 잘 된다면

marshalling() <-> unmarchalling()

같은 파라미터로 그 부분을 해결해 줄 수도 있을 것 같다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 허혁

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

저번주에 한참 코딩을 하다가

이런 코드를 발견했다.

List<SomeObject> getList(HashMap param);

이 메소드를 호출하고자 하니..

도대체 어떤 옵션들을 주어야 원하는 값을 얻을 수 있는지 도통 몰라서

랩퍼 메소를 하나 만들었다.

List<SomeObject> getList( int param1, int param2, String param3, String param4, boolean param5, Enum param6, Enum Param7, Enum param8, Enum param9, AnotherObject param10);

사용되는 모든 곳에서 파라미터들을 긁어 모아본 결과..

무려 10개의 파라미터를 전달해주어야 했는데

실제로 사용하는 코드가 다음과 같았기 때문에 냄새가 폴~폴 올라왔다.

businessLogic.getList(0,0,false,null,null,null,null,null,new Object(1,2),EnumType.TYPE1);


가독성 제로의 이상한 코드의 탄생이다.

마치 혹때려다가 혹 붙인 느낌이다.

이 문제를 해결하려고

파라미터라이즈 오브젝트를 사용해볼까?

빌더 패턴을 적용해볼까?

고민이 많이 되고 있었는데

내가 왜 이런 고민을 하고 있는지 더욱 의문이 들었다.

pythone 이나 C 처럼

기본값을 줄 수 없나?

아니 키워드 파라미터를 지원해준다면

내가 전달하고 싶은 키워드가 무엇인지 넘겨준다면

이런 고민은 하지 않아도 되는 것 아닌가?


다음 버전에 혹시 들어가나 싶어서

java keyword parameters 로 구글링을 시도해봤으나..

실패..

누구 좋은 방법 아시는 분 없으신가요?

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 허혁

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

  1. 정재훈
    2008/03/24 17:22
    댓글 주소 수정/삭제 댓글
    잘은 모르겠지만, getList() 작성하신 분께서 애초에 keyword 파라메터처럼 쓸려고 저런 method를 작성하신 듯 하네요.
    어쨌든 저런 스타일, 저도 싫어하는 스타일이긴 합니다.^^
  2. 2008/03/24 17:27
    댓글 주소 수정/삭제 댓글
    1번 방법이나 2번 방법이나

    둘다 언어의 한계를 벗어나보려는 시도이겠지요..

    제 3의 파라미터

    를 만들어봐야겠어요..
  3. 2008/03/26 10:31
    댓글 주소 수정/삭제 댓글
    으음 정말로 뭘 어떻게 이름을 주고 넣고 보내야할지 모르겠네요 -ㅅ-;
    저것만 봤을땐ㅋㅋ
  4. 2008/03/26 10:33
    댓글 주소 수정/삭제 댓글
    살짝 찾아보니까 자바에도 가변 인수가 있긴한데... 도움이 안되겠죠? -ㅅ-;
    http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html
    • 2008/03/26 16:36
      댓글 주소 수정/삭제
      가변 인수도 곧잘 쓰긴 하는데

      메소드당 한개만 가변인수로 쓸수 있다는 한계점때문에..

      기본 값을 지원하는 것도 아니고..


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

카테고리

분류 전체보기 (97)
direct (55)
indirect (22)
transmissive (12)
agenda (5)
idea (3)

달력

«   2008/08   »
          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 대한민국 라이선스에 따라 이용하실 수 있습니다.