2009-04-04 4 views
1

필수적으로 오브젝트 오리엔테이션 언어에서 변경 가능하거나 변경 불가능한 클로저를 갖는 것이 더 합리적일까요?변경 가능 또는 불변 클로우즈

예를 들어

: 폐쇄가 변경 가능한

int i=5; 
function() f={print(i);}; 
f(); 
i=6; 
f(); 

경우이 인쇄 것입니다 :

5 
6 

를 불변 인 경우, 인쇄 할 것이다 :

5 
5 

내가 실현 불변 클로저를 사용하더라도 다음과 같이 할 수 있습니다.

class I {int i;} 
I i=new I(); 
i.i=5; 
function() f={ 
    I j=i; 
    print(j.i); 
}; 
f(); 
i.i=6; 
f(); 

그래서 가변성 또는 불변 클로저가 있거나 둘 다를위한 옵션이 있습니까? 변경할 수없는 클로저는 구현하기가 더 쉬운 것처럼 보입니다. 그렇기 때문에이 시점에서 그렇지 않으면 좋은 이유가없는 한 그걸로 갈 것입니다.

+0

변경 가능/변경 불능 클로저 용어는 최소한 모호하며, 클로저 자체를 참조하는 변수가 변경 가능/변경 불가능하다는 것을 의미 할 수도 있습니다. –

답변

4

명령형 언어는 일반적으로 state 개념을 기반으로합니다. 따라서 클로저를 포함하여 언어 기능이 그것을 반영하는 것이 더 합리적입니다. 예,이 동작은 때때로 혼란 스러울 수 있지만 응용 프로그램에서 상태를 유지하는 것이 문제와 이점의 일부입니다.

이 인수에 대한 가장 확실한 증거는 클로저를 지원하는 언어를 사용하는 것입니다. C#과 VB.Net 모두 명령형 OO 언어는 변경 가능한 클로저를 선택했습니다. 기능적 언어 인 F #은 불변 클로저를 가지고 있지만 (주로 F #이 기본적으로 불변이라는 아이디어로부터 파생됩니다).

또한 명령형 언어로 불변 클로저를 갖는 것이 실제로 의미할까요? 대부분의 사람들은 이것을 C#의 읽기 전용 변수와 같은 것으로 생각합니다. 확실한 값 유형은 수정되지 않도록 보호되지만 변경 가능한 참조 유형은 제외됩니다. 변수가 가리키는 곳을 변경할 수는 없지만 돌연변이 함수를 호출하여 비슷한 효과를 얻을 수는 있습니다. 예를 들어.

class Student { 
    public string Name { get; set; } 
} 

void Example() { 
    var student = new Student() { Name = "foo" }; 
    Action() del =() => 
    { student.Name = "bar"; }; 
    del(); 
} 

변수가 가리키는 곳을 실제로 수정하지 않으므로 불변 클로저로 구현할 수 있습니다. 그러나 분명히 돌연변이 수술을하고 있습니다.

3

해야 할 가치가있는 언어로 캡처하거나 참조로 캡처하는 람다가 언어에 있습니까? 직접 결정하고 더 많은 설명을 보려면 "On lambdas, capture, and mutability"을 참조하십시오.

+0

나는 마이크로 소프트가 QBasic의 기본값을 참조로 매개 변수를 전달하도록 기본 설정했다는 것을 알고 있으며 vb.net이 값으로 전달하는 것이 더 나은 기본값이라고 결정할 때까지 VB6을 통한 Visual Basic의 버전도 마찬가지 였지만 Microsoft가 클로저가 변수를 암시 적으로 잡아야한다고 결정 했음에도 불구하고 참조로. 솔직하게, 나는 암묵적으로 변수를 캡쳐하는 클로저에 대해 다소 모호하다 (캡쳐 할 변수의 명시적인 선언과 캡쳐해야하는 방법이 더 좋을 것 같다). 그러나 캡쳐가 호출 코드의 변수의 의미를 변경하는 것은 특히 위험한 것으로 보인다. – supercat

관련 문제