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

이런 코드를 발견했다.

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
      댓글 주소 수정/삭제
      가변 인수도 곧잘 쓰긴 하는데

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

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

일단 처음 public 키워드가 키워드가 아닐지도 모른다는 의심이 든건 다음 코드를 본 직후였다.
class Example
def methodA
end

def methodP
end

private :methodP
end
마지막의 private 키워드가 마치 다음과 같이 보였다

private(:methodP)

어라 웬 Function?

구글링을 통한 조사 결과

위키북에서 그 실마리를 찾아 볼 수 있었다.

It is interesting that these are not actually keywords, but actual methods that operate on the class, dynamically altering the visibility of the methods.


그 아래 레퍼런스를 적어두었는데 링크는 깨져있었다.

혹시나 해서 레퍼런스를 찾아보니

Module#public 이라는 메소드가 나왔다

------------------------------------------------------------------- Module#public
public                 => self
public(symbol, ...)    => self
---------------------------------------------------------------------------------
With no arguments, sets the default visibility for subsequently defined methods to public. With arguments, sets the named methods to have public visibility.


아.. 루비에서 접근제한자는 키워드가 아니라 메소드였구나...

새로운 시각의 접근이라는 생각이 들었는데

또다시 떠오른 의문점은..

패턴이 똑같은

super 키워드 였다.

슈퍼 키워드의 사용법은 다음과 같다.

class Test
    def to_s
       super
    end
end

super라고 써도 되고
super(parameter)라고 써도 된다.

이것도 함수로 구현된 것은 아닐까?

그럼 역시 함수로 구현되었다는 증거를 찾아보았다.

API에는 Class#superclass라는 것은 있었지만 super는 없었다.

구글링에도 아무런 소득이 없어서

테스트 코드를 작성해보았다.

def to_s
super()
end

=> 정상동작

def to_s
self.super()
end

=> undefined method

this.super() => undefined local variable

System.super() => NameError: uninitialized constant Test::System

으흠

과연 어떻게 해야 알 수 있을런지..

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

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


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