2010-11-23 2 views
4

일반적으로 여러 가지 방법에서 액세스 할 수있는 인스턴스 변수를 만들거나 단순히 해당 메서드에 대한 인수로 전달되는 인스턴스 변수를 만드는 것이 가장 좋은 방법입니다. 기능적으로 메소드는 여전히 변수를 사용하여 작업을 수행 할 수 있으므로 동등합니다. 변수를 업데이트하고 업데이트 된 값을 반환하려는 경우 이점을 볼 수는 있지만 특정 사례에서는 변수가 업데이트되지 않으므로 각 메서드가 어떻게 작동하는지 결정할 수 있습니다.어느 쪽이 더 낫습니까? Ruby에서 인스턴스 변수를 생성하거나 로컬 변수를 전달하는 방법은 무엇입니까?

예제 코드가 명확하기 :

class Test 
    @foo = "something" 

    def self.a 
    if @foo == "something" 
     puts "do #{@foo}" 
    end 
    end 

    a() 
end 

class Test 
    foo = "something" 

    def self.a(foo) 
    if foo == "something" 
     puts "do #{foo}" 
    end 
    end 

    a(foo) 
end 
+4

참고 : 클래스 수준에서'@foo = "something"을 선언하면 테스트 객체가 아닌 클래스 객체의 인스턴스 변수가됩니다. 그게 적어도 나 한테 줄 잡아 먹 혔어. – Jeremy

+0

나는 똑같은 것을 보았다. '@ foo'와'foo'는 당신이 원하는 것이 아닙니다. '@@ foo'가 더 적절할 것입니다. –

+0

변수가 클래스 전체에서 불변 인 경우에만 필요합니다. – philosodad

답변

1

당신이 언급 한 바와 같이 대,이 코드에 대한 작동하지 않는 문제입니다. 그걸 염두에두고 ...

전적으로 문맥에 달려 있기 때문에 이에 대한 최종 규칙을 내리기는 어렵습니다. 변수가 한 번 설정되고 잊어 버렸습니까? 아니면 지속적으로 업데이트됩니까? 얼마나 많은 메소드가 같은 변수를 공유합니까? 코드는 어떻게 사용됩니까?

내 경험상 개체의 동작을 유도하지만 거의 수정되지 않은 변수는 initialize 메서드에서 설정되거나 동작을 계단식으로 처리 할 메서드에 제공됩니다. 라이브러리와 리프 메소드는 변수가 전달되는 경향이 있습니다. 누군가가 분리하여 호출하기를 원할 것입니다.

먼저 모든 것을 전달한 다음 동일한 변수가 클래스 전체에 전달되는 것을 확인하면 리팩토링을 시작하는 것이 좋습니다.

0

인스턴스 수준에서 범위가 지정된 변수가 필요한 경우 initialize 메서드에서 설정된 인스턴스 변수를 사용합니다.

메서드 수준에서 범위가 지정된 변수 (즉, 한 메서드에서 다른 메서드로 전달되는 값)가 필요한 경우 메서드 수준에서 변수를 만듭니다.

귀하의 질문에 대한 답변은 "언제 내 변수가 범위 내에 있어야합니까?"이며 모든 코드를보고 계획을 수립하지 않으면 실제로 대답 할 수 없습니다.

개체 동작을 초기화 단계에서 정적으로 설정해야하는 경우 인스턴스 변수를 사용합니다.

2

저는 인스턴스 변수를 전달하지 않습니다. 그것들은 인스턴스의 상태 값입니다.

그 개체를 해당 개체의 DNA의 일부로 생각하면 항상 개체가 그 개체가되는 것의 일부가됩니다. 객체의 메서드를 호출하면 이미 전달 된 매개 변수를 통하지 않고 자체 DNA에 액세스하는 방법을 알게되고 내부적으로 처리합니다.

개체에 외래 인 내용을 적용하려면, 그러면 매개 변수를 통해 전달해야합니다.

관련 문제