답변:
컴퓨팅에서 dem 등원 연산은 동일한 입력 매개 변수로 두 번 이상 호출되는 경우 추가 효과가없는 연산입니다. 예를 들어, 세트에서 항목을 제거하는 것은 세트에서 dem 등원 작업으로 간주 될 수 있습니다.
수학에서 dem 등식 연산은 f (f (x)) = f (x) 인 연산입니다 . 예를 들어 abs()
함수는 abs(abs(x)) = abs(x)
모두 dem 등원 x
입니다.
수학 정의에서 x 는 객체의 상태를 나타내고 f 는 해당 객체를 변형시킬 수있는 연산이라는 점 을 고려하여 약간 다른 정의를 조정할 수 있습니다 . 예를 들어, 파이썬set
과 그 discard
방법을 고려하십시오 . 이 discard
메소드는 세트에서 요소를 제거하고 해당 요소가 없으면 아무 것도 수행하지 않습니다. 그래서:
my_set.discard(x)
동일한 작업을 두 번 수행하는 것과 정확히 동일한 효과가 있습니다.
my_set.discard(x)
my_set.discard(x)
dem 등원 (Idempotent) 작업은 종종 네트워크 프로토콜 설계에 사용되는데, 여기서 작업 수행 요청은 적어도 한 번 발생하지만 두 번 이상 발생할 수도 있습니다. 조작이 dem 등원이면 조작을 두 번 이상 수행해도 아무런 해가 없습니다.
자세한 내용은 idempotence에 대한 Wikipedia 기사 를 참조하십시오.
위의 답변에는 이전에 잘못되고 오도 된 예가있었습니다. 2014 년 4 월 이전에 작성된 아래 의견은 이전 개정판을 나타냅니다.
set
대답 의 Python 예제에서 set 객체에는 분명히 상태가 있으며와 같은 dem 등식 연산도 제공합니다 discard
.
discard
는 상태를 반환 값에 포함하여 상태 비 저장 방식으로 구현할 수도 있습니다 discard([my_set, x]) = [my_new_set, x]
. 그래서 당신은 할 수 있습니다 discard(discard([my_set, x]))
. 참고 [my_new_set, x]
인 하나의 인수와 유형이 2 튜플이다.
discard(x)
세트가 더 이상 포함되지 않습니다 : 두 번째 것은 처음으로 호출하는 것과 같은 효과를 가질 것이다 x
. i 등식 컴퓨팅 은 시스템의 견고성에 관한 것입니다. 장애가 발생하면 (예 : 네트워크 중단) 장애가 감지되면 어떻게 복구합니까? 가장 쉬운 복구는 다시 수행하는 것이지만 다시 수행하는 것이 dem 등원 인 경우에만 작동합니다. 예를 들어 discard(x)
dem 등원이지만 pop()
그렇지 않습니다. 모든 것이 오류 복구에 관한 것입니다.
dem 등원 (Idempotent) 연산은 임의의 횟수로 반복 될 수 있으며 결과는 한 번만 수행 된 것과 동일합니다. 산술에서 숫자에 0을 추가하는 것은 dem 등입니다.
RES 등식은 "RESTful"웹 서비스의 맥락에서 많이 이야기됩니다. REST는 HTTP를 최대한 활용하여 프로그램에 웹 컨텐츠에 대한 액세스 권한을 부여하려고하며 일반적으로 HTTP 요청 및 응답 내에서 원격 프로 시저 호출 스타일 서비스를 터널링하는 SOAP 기반 웹 서비스와 대조적으로 설정됩니다.
REST는 웹 애플리케이션을 "자원"(Twitter 사용자 또는 Flickr 이미지 등)으로 구성한 다음 POST, PUT, GET 및 DELETE의 HTTP 동사를 사용하여 해당 자원을 작성, 업데이트, 읽기 및 삭제합니다.
Idempotence는 REST에서 중요한 역할을합니다. REST 리소스의 표현 (예 : Flickr에서 jpeg 이미지 가져 오기)을 가져오고 작업이 실패한 경우 작업이 성공할 때까지 GET을 반복해서 반복 할 수 있습니다. 웹 서비스에서는 이미지를 몇 번이나 얻었는지는 중요하지 않습니다. 마찬가지로 RESTful 웹 서비스를 사용하여 Twitter 계정 정보를 업데이트하는 경우 웹 서비스에서 확인을 받기 위해 새 정보를 여러 번 PUT 할 수 있습니다. 천 번 퍼팅하는 것은 한번 퍼팅하는 것과 같습니다. 마찬가지로 REST 자원을 천 번 삭제하는 것은 한 번 삭제하는 것과 같습니다. dem 등성 (Idempotence)은 통신 오류에 탄력적 인 웹 서비스를 훨씬 쉽게 구성 할 수있게합니다.
추가 자료 : Richardson과 Ruby의 RESTful Web Services (103-104 페이지의 토론 력)와 Roy Fielding의 REST에 대한 박사 학위 논문 . Fielding은 HTTP 1.1, RFC-2616의 저자 중 한 명으로, 9.1.2 절에서 dem 등식에 대해 이야기 합니다.
작업을 몇 번이나 호출하더라도 결과는 동일합니다.
truncate
과 delete
.
dem 등성은 작업을 한 번 적용하거나 여러 번 적용하는 것이 동일한 효과를 의미합니다.
예 :
들면 순수한 함수 (부작용이없는 기능)을 멱등는 F (X) = F (F (X)) = F (F (F (X))) = F (F (F (F (X)))을 의미 ) = ...... x의 모든 값에 대해
부작용이있는 기능의 경우 , dem 등원은 또한 첫 번째 적용 후에 추가적인 부작용이 발생하지 않음을 의미합니다. 원하는 경우 세계 상태를 함수에 대한 추가 "숨김"매개 변수로 간주 할 수 있습니다.
동시 작업이 진행중인 세계에서는 dem 등원이라고 생각한 작업이 중단되는 것을 알 수 있습니다 (예를 들어, 다른 스레드가 위 예제에서 부울 플래그 값을 설정 해제 할 수 있음). 기본적으로 동시성과 변경 가능한 상태가있을 때마다 i 등원에 대해 훨씬 더 신중하게 생각해야합니다.
dem 등성은 종종 강력한 시스템을 구축하는 데 유용한 속성입니다. 예를 들어, 제 3 자로부터 중복 메시지를 수신 할 위험이있는 경우, 메시지 핸들러가 dem 등원 작업으로 작동하여 메시지 효과가 한 번만 발생하도록하는 것이 도움이됩니다.
f(x) = f(f(x))
, 당신은 그 의미합니까 f(x){return x+1;}
순수 함수가 아니다? 왜냐하면 f(x) != f(f(x))
: f(1)
2 동안 f(2)
3 을 준다.
f(x) = f(f(x))
. 그러나 @GregHewgill이 언급했듯이,이 정의가 의미를 갖기 위해서는 x
객체와 객체 f
의 상태를 변경하는 작업으로 간주 해야합니다 (예 : 출력은 f
mutated입니다 x
).
dem 등원 (Idempotent) 연산은 동일한 매개 변수를 전달하는 경우 한 번 이상 호출하더라도 동일한 상태로 결과를 생성합니다.
dem 등식을 보여주는 실제 사용 사례를 버리고 싶었습니다. JavaScript에서 MVC 모델과 같이 여러 모델 클래스를 정의한다고 가정하십시오. 이것이 종종 구현되는 방식은 기능적으로 다음과 같습니다 (기본 예).
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
그런 다음 다음과 같이 새 클래스를 정의 할 수 있습니다.
var User = model('user');
var Article = model('article');
그러나 코드의 다른 곳에서을 User
통해 클래스를 얻으려고하면 model('user')
실패합니다.
var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');
이 두 User
생성자는 다를 수 있습니다. 그건,
model('user') !== model('user');
dem 등원으로 만들려면 다음과 같은 일종의 캐싱 메커니즘을 추가하십시오.
var collection = {};
function model(name) {
if (collection[name])
return collection[name];
function Model() {
this.name = name;
}
collection[name] = Model;
return Model;
}
캐싱을 추가하면 수행 model('user')
할 때마다 동일한 개체가되므로 dem 등성이 있습니다. 그래서:
model('user') === model('user');
dem 등원 (Idempotent) 작업은 초기 응용 프로그램을 넘어서 결과, 즉 시스템 상태를 변경하지 않고 여러 번 적용 할 수있는 작업, 작업 또는 요청입니다.
예 (WEB APP 컨텍스트) :
개선 사항 : 여러 개의 동일한 요청을 만드는 것은 단일 요청을 만드는 것과 동일한 효과를 갖습니다. 이메일 메시징 시스템의 메시지가 열리고 데이터베이스에서 "열림"으로 표시됩니다. 메시지를 여러 번 열 수는 있지만이 반복 된 작업은 해당 메시지가 "열린"상태 일뿐입니다. 이것은 dem 등식입니다. 리소스와 일치하지 않는 정보 (시스템 상태)를 사용하여 리소스에 대한 업데이트를 처음 PUT하면 리소스가 업데이트됨에 따라 시스템 상태가 변경됩니다. 하나의 PUT이 동일한 업데이트를 리소스에 반복적으로 반복하면 업데이트의 정보가 모든 PUT마다 시스템에 이미있는 정보와 일치하며 시스템 상태에 대한 변경은 발생하지 않습니다. 동일한 정보를 가진 반복되는 PUT은 dem 등원입니다.
NON-IDEMPOTENT : 동일한 메시지를 반복해서 사용자에게 POST하는 등의 작업으로 인해 항상 상태가 변경되어 매번 데이터베이스에 새 메시지가 전송 및 저장되는 경우 작업이 NON-IDEMPOTENT라고합니다.
NULLIPOTENT : 데이터베이스 변경없이 웹 페이지에 정보를 표시하는 등의 부작용이없는 경우 (즉, 데이터베이스를 읽기만하는 경우) 작업이 NULLIPOTENT라고합니다. 모든 GET은 nullipotent 여야합니다.
시스템 상태에 대해 이야기 할 때 로깅 및 진단과 같은 무해하고 피할 수없는 영향을 무시하고 있습니다.
dem 등식 작업 : 여러 번 실행될 경우 부작용이없는 작업.
예 : 데이터 리소스에서 값을 검색하여 I
등식 이 아닌 작업을 인쇄하는
작업 : 여러 번 실행하면 약간의 피해를 줄 수있는 작업입니다. (일부 값이나 상태가 변경 될 때)
예 : 은행 계좌에서 인출하는 작업
매우 상세하고 기술적 인 답변. 간단한 정의 만 추가하면됩니다.
dem 등원 = 재실행 가능
예를 들어,
Create
작업 자체가 두 번 이상 실행될 경우 오류없이 실행될 수 없습니다. 그러나 작업이 있으면 CreateOrUpdate
재실행 가능성 (등 전성)이 표시됩니다.
세트에 대한 dem 등원 (Idempotent) 작업은 한 번 이상 적용될 때 멤버를 변경하지 않은 채로 둡니다.
x는 양의 정수 세트에 속하는 absolute (x) 와 같은 단항 연산 일 수 있습니다 . 여기에서 absolute (absolute (x)) = x.
자체와 집합을 통합하는 것과 같은 이진 연산 이 항상 동일한 집합을 반환합니다.
건배
내 5c : 통합 및 네트워킹에서 dem 등원은 매우 중요합니다. 실제 몇 가지 예 : 데이터를 대상 시스템에 전달한다고 상상해보십시오. 일련의 메시지로 전달되는 데이터. 1. 시퀀스가 채널에서 혼합되면 어떻게됩니까? (네트워크 패키지는 항상 :)). 대상 시스템이 dem 등원 인 경우 결과는 달라지지 않습니다. 대상 시스템이 순서에 따라 올바른 순서에 의존하는 경우 대상 사이트에서 올바른 순서를 복원하는 리 시퀀서를 구현해야합니다. 2. 메시지가 중복되면 어떻게됩니까? 대상 시스템의 채널이 적시에 승인하지 않으면 소스 시스템 (또는 채널 자체)은 일반적으로 메시지의 다른 사본을 보냅니다. 결과적으로 대상 시스템 측에 중복 메시지가있을 수 있습니다. 대상 시스템이 dem 등원 인 경우 그것을 처리하고 결과는 다르지 않습니다. 대상 시스템이 dem 등성이 아닌 경우 채널의 대상 시스템 측에 중복 제거기를 구현해야합니다.
재시도 안전.
일반적으로 컴퓨터 과학에서 그 의미를 이해하는 가장 쉬운 방법입니다.
Idempotent operations are often used in the design of network protocols
여기에 관련 예가 있습니다. ** GET은 서버의 아무것도 변경한다고 가정하지 않으므로 GET은 dem 등입니다. HTTP / 서블릿 컨텍스트에서 부정적인 결과없이 동일한 요청을 두 번 수행 할 수 있음을 의미합니다. ** POST는 dem 등성이 아닙니다.