2010-07-09 7 views
5

rubygem 저는 쓰고 있어요. 그리고 그것은 텍스트에서 단어 어커런스를 세는 데 유용합니다. 나는 클래스 생성자에 3 개의 매개 변수를 넣기로합니다.클래스 생성자에서 매개 변수를 사용할 수 있습니까?

코드가 작동하지만 정교함을 위해 리팩토링하고 싶습니다. 경험상, params가없고 setter/getters 메서드가 많은 생성자 또는이 매개 변수와 같은 코드를 생성자의 모든 매개 변수와 함께 사용하여 읽기/mantain/use를 쉽게 수행 할 수 있습니까?

TIA

파올로

def initialize(filename, words, hide_list) 

    if ! filename.nil? 
    @filename = filename 
    @occurrences = read 
    else 
    @filename = STDIN 
    @occurrences = feed 
    end 

    @hide_list = hide_list 
    @sorted = Array(occurrences).sort { |one, two| -(one[1] <=> two[1]) } 
    @words = words 

end 
+1

적어도 다른 언어로 생성자에 매개 변수를 갖는 이점 중 하나는 해당 유형을 불변으로 만들 수 있다는 것입니다. 모든 것을 별도로 설정하면 그렇게 할 수 없습니다. 루비에 적용되는지 여부는 모르겠다. 이것이 왜 답변이 아니라 주석인지 이유 다. –

+0

@ 존 : http://stackoverflow.com/questions/408208/ruby-immutable-objects 당신이 불변의 객체를 루비로 처리 할 수 ​​있는지 여부를 설명합니다 (불변의 타입과 다를 수 있습니다). –

답변

3

당신은 그것을 레일 옵션이 해시에 주어진 방법, 할 수있는 :

def initialize(filename = nil, options = {}) 
    @hide_list = options[:hide_list] 
    @words = options[:words] 

    if filename 
    @filename = filename 
    @occurrences = read 
    else 
    @filename = STDIN 
    @occurrences = feed 
    end 

    @sorted = Array(occurrences).sort { |one, two| -(one[1] <=> two[1]) } 

end 

그런 다음이처럼 호출 할 수

WC.new "file.txt", :hide_list => %w(a the to), :words => %w(some words here) 

나이 :

wc = WC.new 
wc.hide_list = %w(a the is) 
wc.words = %w(some words here) 
+0

이 코드 조각을 아주 좋아 보인다. –

0

나는 그것이 루비에 잘 모릅니다 만, 다른 언어는 일반적으로 유효한 상태로 객체를 초기화하는 데 필요한 생성자 서명에 그 인수를 넣어 . 다른 모든 상태는 setter를 통해 설정할 수 있습니다.

+0

이 경우 매개 변수는 클래스를 사용자 정의하는 옵션입니다 그 일을 해고 할 때의 행동. 개체를 초기화 할 필요는 없습니다. –

+0

@ thesp0nge Ruby가 선택적 인수를 지원하면 선택적 인수를 사용하여 선택적 성을 나타낼 수 있습니다. 또는 옵션에 대한 설정자를 추가하십시오. 다른 사람들이 말한 mutability에 대해서도 고려해야합니다. – Gordon

3

필자의 경험에 비추어 볼 때, 클래스 인스턴스 생성의 용이성을 높이는 것 외에도 대부분의 언어에서 생성자 매개 변수를 허용하는 이유는 API를 쉽게 사용할 수 있다는 것입니다.

getter/setter 인스턴스화보다 생성자를 사용하면 객체를 생성자로 철저히 작성하고 나중에 해당 속성을 수정할 수 없도록하는 데에도 도움이됩니다.

+0

_apart는 클래스 인스턴스화의 용이성을 높이기 위해 API_를 사용하기 쉽도록 만드는 것입니다. "API를 사용하기 쉽게"하는 것을 설명 할 수 있습니까? – zuba

관련 문제