2013-05-09 2 views
0

아래에는 sample1을 살펴 보시기 바랍니다 :인스턴스 변수와 지역 변수의 혼란

Public Class LocalVariable 

    Public Sub Run() 
     Dim TestVariable As Integer 
     TestVariable = Method1(TestVariable) 
     TestVariable = Method2(TestVariable) 
     TestVariable = Method3(TestVariable) 
    End Sub 

    Private Function Method1(ByVal x As Integer) As Integer 
     Return x + 1 
    End Function 

    Private Function Method2(ByVal x As Integer) As Integer 
     Return x + 2 
    End Function 

    Private Function Method3(ByVal x As Integer) As Integer 
     Return x + 3 
    End Function 

End Class 

아래 예제 2 :

Public Class InstanceVariable 

    Dim TestVariable As Integer 

    Public Sub Run() 
     Method1() 
     Method2() 
     Method3() 
    End Sub 

    Private Sub Method1() 
     TestVariable = TestVariable + 1 
    End Sub 

    Private Sub Method2() 
     TestVariable = TestVariable + 2 
    End Sub 

    Private Sub Method3() 
     TestVariable = TestVariable + 3 
    End Sub 

End Class 

각 프로그램이 실행 된 후 결과가 분명 동일 즉 TestVariable = 6 . 내가 온라인에서 찾고 직장에서 사용하는 모든 예제는 샘플 1을 사용합니다. 확실히 이것은 TestVariable이 여러 함수에서 공유되어야하므로 인스턴스 변수의 오용입니다. 따라서 인스턴스 변수를 사용해야합니다.

+0

샘플 1에는 지역 변수가 있습니다. 특정 기능에 국한되어 있습니다. 샘플 2에는 유형의 특정 인스턴스에 범위가 있기 때문에 인스턴스 변수가 있습니다. 나는 아마 당신의 용어가 거꾸로 생각합니다. 샘플 1의 어떤 시점에서도 TestVariable은 "기능을 넘어서 공유"되었습니다. 값 유형으로 각 함수 호출마다 사본이 작성됩니다. ByRef가 전달 된 경우에도 구조화 된 프로그래밍 규칙으로 인해 한 번에 하나의 메서드에만 적용됩니다. 다음에 호출되기 전에 반환됩니다. –

+0

@ Joe Coehoorn, 감사합니다. 나는 더 명확하게하려고 질문을 편집했다. 그것은 의미가 있습니까? – w0051977

+0

for 루프를 제거하십시오. 그들은 당신이하고있는 것을 혼란스럽게 만들고 결과가 두 샘플 모두에서 명백히 틀릴 것이라는 추측을하게됩니다. 주된 방법으로 Method의 1-3을 한 번만 호출하십시오. 또한 떠돌아 다니는 것은 떠돌아 다니는 것입니다. 궁금하려면 뭔가 궁금해하는 것입니다. –

답변

4

두 샘플이 같은 것을 의미하지는 않습니다.

차이점은 프로그램 수명 기간 동안 Run()을 두 번 이상 호출하면 발생합니다. 샘플 2의 Run() 메서드는 TestVariable을 다시 설정하지 않으므로 계속 커지고 커집니다. 예제 1에서 TestVariable은 함수를 호출 할 때마다 새로운 변수이므로 결과는 항상 6입니다. 더 정확한 것은 전체적으로에 달려 있습니다.

세 번째 옵션에게 있습니다

모든 다른 동일하다면, 나 또한 그 두 가지 옵션에서 샘플 (1) 접근 방식을 권장합니다. 그러나 인스턴스 변수와 지역 변수는 구별되지 않습니다. 샘플 1에서 이러한 메소드 정의로 인스턴스 변수를 사용할 수없는 이유는 없습니다. 그래서 우리의 세 번째 옵션은 다음과 같을 것이다 :

Public Class InstanceVariableWithSampleOneFunctions 

    Dim TestVariable As Integer 

    Public Sub Run() 
     TestVariable = Method1(TestVariable) 
     TestVariable = Method2(TestVariable) 
     TestVariable = Method3(TestVariable) 
    End Sub 

    Private Function Method1(ByVal x As Integer) As Integer 
     Return x + 1 
    End Function 

    Private Function Method2(ByVal x As Integer) As Integer 
     Return x + 2 
    End Function 

    Private Function Method3(ByVal x As Integer) As Integer 
     Return x + 3 
    End Function 
End Class 

이 샘플 1의 방법과 샘플 2에서 인스턴스 변수를 사용하여 내가 3.

이의 심장에 더 인하 샘플 전화 할게 귀하의 질문, 지금 샘플 3 샘플 2와 동일한 동작을하기 때문에 1 또는 2를 선택해야하는지 여부는 필요한 행동에 따라 다릅니다. 그러나 2 또는 3을 선택해야할지 여부는 코딩 스타일의 장점에 달려 있습니다. 2와 3 모두 Run() 메서드의 인스턴스 변수에 의존하지만 2는 추가 메서드에서 인스턴스 변수를 사용하고 3은 로컬 변수를 사용합니다.

이 시점에서 2와 3을 비교하면 분명히 샘플 3을 선호한다고 말할 수 있습니다. 샘플 3의 메소드는 더 많은 기능 스타일을 가지고 있습니다. 입력을 받아들이고 출력을 반환합니다. 이것은 그들에게 더 높은 수준의 추상화를 제공하여 샘플 3을 리팩터링하여 다른 곳으로 이동하는 것과 같은 일을 할 수있게 해줍니다. 예를 들어 유틸리티 클래스에서 샘플 세트 1과 3 모두와 메소드 세트를 공유 할 수 있습니다. 당신은 스레딩을 언급했는데, 일반적으로이 스타일은 멀티 스레딩을 올바르게 수행하는 것을 더 어렵지 않게 만듭니다.

이 메서드 스타일이 더 좋은 구체적인 예가 구성 가능입니다. 이 속성을 사용하면 샘플 3의 Run() 메소드를 다음과 같이 다시 작성하고 동일한 결과를 얻을 수 있습니다.

Public Sub Run() 
    TestVariable = Method3(Method2(Method1(TestVariable))) 
End Sub 
+0

감사합니다. 코드가 형태로되어 있다는 사실은 부적합합니다. 질문에서 코드를 편집했습니다. 다른 모습을 보여줄 수 있습니까? 다시 한번 감사드립니다. – w0051977

+0

수정 사항을 반영하여 답변을 업데이트했습니다. –

+0

감사합니다. 그렇다면 인스턴스 변수의 요점은 무엇입니까? – w0051977

관련 문제