2009-11-24 2 views
1

Ruby에서 사용하는 도구에 대한 API를 작성하는 그룹에서 일하고 있습니다. API 메소드를 작성할 때 많은 팀원은 메소드의 유일한 매개 변수로 해시 테이블을 사용하지만 지정된 각 값을 사용하여 메소드를 작성합니다.해시 테이블을 함수 입력으로 사용

class Apple 
    @commonName 
    @volume 
    @color 
end 

나는 방법으로 클래스를 인스턴스화 것입니다 : 예를 들어

, 클래스 애플로 정의

:

Apple.new(commonName, volume, color) 

내 팀 동료가 그렇게을 작성 방법처럼 보였다

Apple.new({"commonName"=>commonName, "volume"=>volume, "color"=>color) 

해시 테이블을 입력으로 사용하는 것을 좋아하지 않습니다. 나에게 불필요하게 부피가 커 보이고 코드에 명확성을 추가하지 않는다. 이 예제에서 큰 문제는 아니지만 일부 메소드에는 10 개 이상의 매개 변수가 있으며 다른 해시 테이블 내부에 해시 테이블이 중첩되어 있습니다. 나는 또한 이런 식으로 해시 테이블을 사용하는 것이 공개 API에서 매우 드문 것으로 나타났습니다 (net/telnet이 지금 당장 생각할 수있는 유일한 예외입니다).

질문 : 입력 매개 변수로 해시 테이블을 사용하지 않기 위해 팀원에게 어떤 인수를 내릴 수 있습니까? 코드의 부피가 충분하지 않다는 것 (200-400 자의 문자를 쓰는 것을 두려워하지 않음) 과도한 메모리/프로세싱 오버 헤드는 우리 도구가 사용되는 방식에 문제가되지 않기 때문에 효과가 없습니다 .

+0

후기 바인딩 언어의 문제 중 하나에 부딪 혔습니다. 매개 변수를 강제 적용하는 유일한 방법은 이름을 지정하는 것입니다. 루비에서 매개 변수의 이름을 지정하는 유일한 방법은 큰 오래된 blobby 해시 테이블을 보내는 것입니다. 너는 나의 동정심을 가지고있다. –

답변

4

실제로 메소드에 인수가 10 개 이상 있으면 클래스를 다시 디자인하거나 흙을 먹고 해시를 사용해야합니다. 4 개 이상의 인수를 사용하는 모든 메소드의 경우, 메소드를 호출하는 동안 일반적인 인수를 사용하는 것이 반 직관적 일 수 있습니다. 왜냐하면 순서를 올바르게 기억해야하기 때문입니다.

필자는 최선의 해결책은 단순히 이러한 방법을 재 설계하고 빌더 또는 유창한 패턴을 사용하는 것이라고 생각합니다.

3

먼저 해시 키의 기호 대신 문자열을 사용하도록 설정해야합니다.

해시를 사용할 때의 한 가지 문제는 적절한 키가 모두 들어 있는지 확인해야한다는 것입니다. 이것은 선택적 매개 변수에 유용하지만, 필수 매개 변수에 대해서는 언어의 기본 기능을 사용하지 않는 이유는 무엇입니까? 나는이 할 경우 예를 들어, 자신의 방법으로, 무슨 일이 발생합니다 반면

Apple.new({"commonName"=>commonName, "volume"=>volume}) 

Apple.new(commonName, volume)와 함께, 당신은 당신이하면 ArgumentError를 얻을 수 있습니다 알고 있습니다.

0

명명 된 매개 변수는 더 많은 자체 문서화 코드를 만듭니다. 그러나 그 외에는 많은 차이가 없습니다. 해시 (Hash)는 더 많은 유연성을 제공합니다. 특히 어떤 앨리어싱 방법을 사용하기 시작하면 더욱 그렇습니다. 또한 ActiveSupport의 다양한 Hash 메소드는 기본값을 설정하고 입력을 매우 쉽게 확인할 수 있습니다. 나는 이것이 아마 당신이 찾고 있던 대답이 아니었을 것 같아요.

관련 문제