2008-09-21 9 views
79

단어는 많은 문맥에서 사용 된 것으로 보입니다. 내가 생각할 수있는 가장 좋은 점은 변화 할 수없는 변수를 의미한다는 것입니다. 그건 상수/결승전이 아니야 (당신이 자바 야!)?불변성이란 무엇입니까?

+0

어쩌면 그들은 호출해야 그것은 비 변형 된? – johnny

답변

110

불변량은 변수보다 개념적입니다. 일반적으로 항상 true 인 프로그램 상태의 속성입니다. 불변성이 유지되는 것을 보장하는 함수 또는 메소드는 불변성을 유지한다고 말해진다.

예를 들어, 이진 검색 트리에는 모든 노드에 대해 노드의 왼쪽 자식 키가 노드의 자체 키보다 적지 만 불변 값을 가질 수 있습니다. 이 트리에 대해 올바르게 쓰여진 삽입 함수는 해당 불변성을 유지합니다.

여러분이 알 수 있듯이 변수에 저장할 수있는 종류가 아닙니다. 더 많은 내용이 입니다. 프로그램이 어떤 종류의 불변성을 유지해야 하는지를 파악하고 코드를 검토하여 실제로 불변성을 유지하는지 확인함으로써 코드의 논리적 오류를 피할 수 있습니다. 그것이 무엇인지에 이어

+0

이 위대한 예는 cero의 답변이 위키 백과 링크에 포함 된 경우 더 나을 것입니다. – ablarg

19

로직의 특정 위치에서 항상 사실로 알고 있고 디버깅이 잘못된 부분을 해결할 때를 확인할 수있는 조건입니다.

10

나는 알고리즘이나 구조면에서 더 많이 봅니다.

예를 들어, 각 반복의 시작 또는 끝에서 항상 true 일 수있는 루프 불변성을 가질 수 있습니다. 즉, 루프가 한 스택에서 다른 스택으로 객체 컬렉션을 처리해야한다면 루프 상단 또는 하단에 | stack1 | + | stack2 | = c라고 말할 수 있습니다.

불변성 검사에 실패하면 무언가 잘못되었음을 나타냅니다. 이 예에서, 등, 당신이 마지막 스택에 처리 된 요소를 밀어 잊었 의미 할 수

+0

그 좋은 예입니다 –

9

위키 피 디아의 마법 : 컴퓨터 과학에서 Invariant (computer science)

, 술어 그, true의 경우, 특정 작업 시퀀스에서 true로 유지되며 시퀀스에 불변 인 이 호출됩니다.

+0

링크? 기술적 특수 용어? 독서? * WTF *? ;) 진지하게 좋은 링크지만 약간의 요약은 좋을 것이다. – Dustman

+1

달콤한! 구출에 Shog9! – Dustman

1

, 불변는 불변이 코드는 쉽게 그 목표에 도달하기 위해 코드를 구성하는 방법을 결정할 수 있습니다 에 존재해야하는지 개념적으로 알고 있기 때문에, 깨끗한 코드를 작성하기에 매우 유용합니다. ealier에서 언급했듯이, 디버깅에 유용합니다. invariant가 유지되고 있는지 확인하는 것이 종종 수행하려고하는 조작이 실제로 원하는 것을 수행하는지 확인하는 좋은 방법입니다. 코드

항상 인스턴스 메소드의 실행 전에 후 참이어야 데이터 필드 (인스턴스 변수) 중
0

ADT 불변 specifes 관계 의 블록 내에서 변화하지 않는다

0

이 줄은 상태로 : 컴퓨터 과학에서

, true의 경우, 작업의 특정 순서를 통해 진정한 남아, 술어는 그 순서에 불변 (AN)라고합니다.

이 희망을 더 잘 이해하려면 C++의이 예제가 도움이됩니다.

당신이 어떤 값을 얻을 count로 불리는 변수에 이들의 총 수를 얻을 sum

(가) 다시는 더 같은 불변의 (로 불리는 변수에 추가 할 필요가 어디 시나리오를 고려 개념) :

// invariant: 
// we have read count grades so far, and 
// sum is the sum of the first count grades 

과 같이 위의 것이 무엇인가에 대한 코드,

int count=0; 
double sum=0,x=0; 
while (cin >> x) { 
++count; 
sum+=x; 
} 

위의 코드는 무엇을 수행합니까?

1) cin로부터 입력을 읽고 하나 개의 성공적인 판독 후 x

2)에이를두고, countsum = sum + x

3) (판독이 정지 될 때까지 즉, CTRL 1-2를 반복 증가 + D)

루프 불변는 :

불변는 항상 진정한해야합니다. 그래서 처음에는이 코드로 코드를 시작합니다.

while(cin>>x){ 
    } 

이 루프는 표준 입력에서 데이터를 읽고 x에 저장합니다. 좋습니다. 그러나 불변의은 처음으로 우리의 불변의 부분을 따르지 않았기 때문에 false가됩니다.

// we have read count grades so far, and 

불변의 사실을 유지하는 방법은 무엇입니까?

간단! 증가 카운트.

그래서 ++count;이 좋습니다. 이제 우리의 코드는

while(cin>>x){ 
++count; 
} 

그러나

, 이런 일이된다

지금도 우리의 지금 우리가 우리의 두 번째 부분을 만족하지 않았기 때문에 불변 (TRUE 여야 개념) False입니다 불변의.

// sum is the sum of the first count grades 

그럼 이제 어떻게해야합니까?

sum (sum+=x) 및 다음 시간에 cin>>x는 X에 새로운 값을 읽 sumx을 추가하고 저장합니다.

지금 우리의 코드는

while(cin>>x){ 
++count; 
sum+=x; 
} 

코드는 우리의 불변

// invariant: 
// we have read count grades so far, and 
// sum is the sum of the first count grades 

코드와 일치하는지 여부의이

을 확인하자, 이런 일이된다 :

while(cin>>x){ 
++count; 
sum+=x; 
} 

아! 이제 루프 불변 값은 이고 항상이고 코드는 정상적으로 작동합니다.

위의 예

촬영 및에서 수정 된 책 가 가속 C++ 앤드류-koening에 의해 바바라-E