문제

명령 적으로, 대상의 erients 언어로, 변이 가능하거나 불변의 폐쇄를 갖는 것이 더 합리적일까요?

예를 들어:

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();

그렇다면, 돌연변이 또는 불변의 폐쇄를 갖는 것이 더 나을까요? 불변의 폐쇄는 구현하기가 더 쉬워 보이 므로이 시점에서 나는 그 이유가 없다면 그와 함께 갈 것이라고 생각합니다.

도움이 되었습니까?

해결책

필수 언어는 일반적으로 상태 개념을 중심으로 구축됩니다. 따라서 언어 기능이 폐쇄를 포함하여이를 반영하는 것이 더 의미가 있습니다. 그렇습니다.이 동작은 때때로 혼란 스러울 수 있지만 응용 프로그램에 상태가있는 문제의 일부입니다.

이 주장의 가장 좋은 증거는 폐쇄 지원이있는 가장 최근의 언어를 보는 것입니다. C#과 VB.NET, 명령 OO 언어는 모두 변경 가능한 폐쇄를 선택했습니다. 기능적 언어 인 F#은 불변의 폐쇄를 가지고 있지만 (주로 F#가 기본적으로 불변이라는 아이디어에서 파생됨).

또한 명령적인 언어로 불변의 폐쇄를하는 것이 실제로 무엇을 의미합니까? 대부분의 사람들은 이것을 c#의 readonly와 동등한 변수를 만드는 것으로 생각합니다. 확실한 값 유형은 수정으로부터 보호되지만 변이 가능한 기준 유형은 어떻습니까? 변수가 가리키는 곳에서 변경할 수는 없지만 돌연변이 기능을 호출하고 비슷한 효과를 얻을 수 있습니다. 예를 들어.

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

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

변수가 가리키는 위치를 실제로 수정하지 않으므로 불변의 폐쇄로 구현 될 수 있습니다. 그러나 나는 여전히 분명히 돌연변이 작업을하고 있습니다.

다른 팁

언어에는 값으로 캡처하거나 참조로 캡처하는 람다가 있어야합니까? 스스로 결정하지만 "람다, 포획 및 돌연변이"더 많은 논평을 위해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top