dem 등식 수술이란 무엇입니까?


답변:


964

컴퓨팅에서 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 월 이전에 작성된 아래 의견은 이전 개정판을 나타냅니다.


6
예 : 위의 답변 때문에 Idempotent operations are often used in the design of network protocols여기에 관련 예가 있습니다. ** GET은 서버의 아무것도 변경한다고 가정하지 않으므로 GET은 dem 등입니다. HTTP / 서블릿 컨텍스트에서 부정적인 결과없이 동일한 요청을 두 번 수행 할 수 있음을 의미합니다. ** POST는 dem 등성이 아닙니다.
KNU

1
"상태 비 저장"은 "idempotent"와 동의어입니까?
Michael Osofsky

2
@MichaelOsofsky : 아니요, set대답 의 Python 예제에서 set 객체에는 분명히 상태가 있으며와 같은 dem 등식 연산도 제공합니다 discard.
Greg Hewgill

1
@MichaelOsofsky discard는 상태를 반환 값에 포함하여 상태 비 저장 방식으로 구현할 수도 있습니다 discard([my_set, x]) = [my_new_set, x]. 그래서 당신은 할 수 있습니다 discard(discard([my_set, x])). 참고 [my_new_set, x]하나의 인수와 유형이 2 튜플이다.
Pacerier

2
@Green 발기 부전과 관련하여 동일한 효과 라는 용어를 사용 하는 경우 결과동작 이 아니라 동일 함을 의미합니다 . 호출 discard(x)세트가 더 이상 포함되지 않습니다 : 두 번째 것은 처음으로 호출하는 것과 같은 효과를 가질 것이다 x. i 등식 컴퓨팅 은 시스템의 견고성에 관한 것입니다. 장애가 발생하면 (예 : 네트워크 중단) 장애가 감지되면 어떻게 복구합니까? 가장 쉬운 복구는 다시 수행하는 것이지만 다시 수행하는 것이 dem 등원 인 경우에만 작동합니다. 예를 들어 discard(x)dem 등원이지만 pop()그렇지 않습니다. 모든 것이 오류 복구에 관한 것입니다.
Andreas

138

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 등식에 대해 이야기 합니다.


명확하고 간단합니다. 그러나 이것은 dem 등식에 대한 하나의 해석 일뿐 입니다.
Pacerier

10
"idempotence"는 웅장하게 들리며 sesquipedalian 검사를 통과하기에 충분한 문자를 가지고 있기 때문에 지나치게 과부하 된 단어입니다. Benjamin Peirce 가 더 단순한 소리를 선택 했다면 오늘이 질문도 없었을 것입니다.
Pacerier

2
그것을 이해하는 방법 : 마찬가지로 REST 리소스를 천 번 삭제하는 것은 한 번 삭제하는 것과 같습니다 . 이미 삭제 된 리소스는 다시 삭제할 수 없습니다.
Green

1
@Green이지만 처음으로 삭제 하지는 않습니다 . 당신은 삭제 요청을 보냅니다 . 중요한 점은 원하는만큼 요청을 보낼 수 있다는 것입니다.
Caleth

1
@JimFerrans 알겠습니다. POST가 할 수 없지만 걱정하지 않고 PUT을 다시 보낼 수있는 기능 관련 이유 (HTTP 자체에 내장)가있을 수 있다고 생각했습니다. 지금은 우리가 단순히 HTTP 표준을 준수하는 데 필요한 것으로 나타나고 동작은 완전히 서버가 구현되는 방법을 기반으로
mangusta

109

작업을 몇 번이나 호출하더라도 결과는 동일합니다.


8
dem 등식이 아래 중 하나 또는 둘 다로 정의 된 것을 들었습니다. 1) 주어진 입력 세트에 대해 항상 동일한 출력을 반환합니다. 2) 부작용이 없습니다. 내 질문은 함수가 # 1을 준수하지만 # 2를 준수하지 않으면 계산과 관련이없는 부작용을 초래하기 때문에 (예 : 데이터 저장소에 요청을 기록) 여전히 dem 등성으로 간주됩니까?
Keith Bennett

12
오퍼레이션 호출 결과에는 시스템 상태가 포함되어야하므로 오퍼레이션에 누적 부작용이있는 경우에는 i 등성이 아닙니다. 그러나 조작이 호출 된 횟수에 관계없이 부작용이 시스템을 동일한 상태로두면, dem 등성 일 수 있습니다.
Robert

4
짧고 달콤한, 나는 그런 종류의 대답을 좋아합니다. 왜이 용어를 지속적으로 찾아야하는지 잘 모르겠습니다. 그것은 단지 나와 함께 있지 않습니다.
Prancer

1
@KeithBennett, 두 번째 정의가 잘못되었습니다. "부작용 없음"은 dem 등성을 의미하지 않습니다. dem 등식 기능은 부작용이있을 수 있습니다. 예를 들어 MySQL truncatedelete.
Pacerier

결과는 동일하지만 (시스템 상태) 응답이 다를 수 있습니다 (예 : REST 서비스의 HTTP 상태 코드).
G. Steigert

50

dem 등성은 작업을 한 번 적용하거나 여러 번 적용하는 것이 동일한 효과를 의미합니다.

예 :

  • 0으로 곱하기 몇 번이나 수행하더라도 결과는 여전히 0입니다.
  • 부울 플래그 설정 몇 번을하더라도 플래그는 계속 설정되어 있습니다.
  • 주어진 ID를 가진 데이터베이스에서 행을 삭제합니다. 다시 시도해도 행은 여전히 ​​사라집니다.

들면 순수한 함수 (부작용이없는 기능)을 멱등는 F (X) = F (F (X)) = F (F (F (X))) = F (F (F (F (X)))을 의미 ) = ...... x의 모든 값에 대해

부작용이있는 기능의 경우 , dem 등원은 또한 첫 번째 적용 후에 추가적인 부작용이 발생하지 않음을 의미합니다. 원하는 경우 세계 상태를 함수에 대한 추가 "숨김"매개 변수로 간주 할 수 있습니다.

동시 작업이 진행중인 세계에서는 dem 등원이라고 생각한 작업이 중단되는 것을 알 수 있습니다 (예를 들어, 다른 스레드가 위 예제에서 부울 플래그 값을 설정 해제 할 수 있음). 기본적으로 동시성과 변경 가능한 상태가있을 때마다 i 등원에 대해 훨씬 더 신중하게 생각해야합니다.

dem 등성은 종종 강력한 시스템을 구축하는 데 유용한 속성입니다. 예를 들어, 제 3 자로부터 중복 메시지를 수신 할 위험이있는 경우, 메시지 핸들러가 dem 등원 작업으로 작동하여 메시지 효과가 한 번만 발생하도록하는 것이 도움이됩니다.


1
순수 함수의 경우 f(x) = f(f(x)), 당신은 그 의미합니까 f(x){return x+1;}순수 함수가 아니다? 왜냐하면 f(x) != f(f(x)): f(1)2 동안 f(2)3 을 준다.
Pacerier

1
@Pacerier 아니요, @mikera는 순수 하고 dem 등함을 의미 한다고 말합니다 f(x) = f(f(x)). 그러나 @GregHewgill이 언급했듯이,이 정의가 의미를 갖기 위해서는 x객체와 객체 f의 상태를 변경하는 작업으로 간주 해야합니다 (예 : 출력은 fmutated입니다 x).
저스틴 J 스타크


16

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

10

dem 등원 (Idempotent) 작업은 초기 응용 프로그램을 넘어서 결과, 즉 시스템 상태를 변경하지 않고 여러 번 적용 할 수있는 작업, 작업 또는 요청입니다.

예 (WEB APP 컨텍스트) :

개선 사항 : 여러 개의 동일한 요청을 만드는 것은 단일 요청을 만드는 것과 동일한 효과를 갖습니다. 이메일 메시징 시스템의 메시지가 열리고 데이터베이스에서 "열림"으로 표시됩니다. 메시지를 여러 번 열 수는 있지만이 반복 된 작업은 해당 메시지가 "열린"상태 일뿐입니다. 이것은 dem 등식입니다. 리소스와 일치하지 않는 정보 (시스템 상태)를 사용하여 리소스에 대한 업데이트를 처음 PUT하면 리소스가 업데이트됨에 따라 시스템 상태가 변경됩니다. 하나의 PUT이 동일한 업데이트를 리소스에 반복적으로 반복하면 업데이트의 정보가 모든 PUT마다 시스템에 이미있는 정보와 일치하며 시스템 상태에 대한 변경은 발생하지 않습니다. 동일한 정보를 가진 반복되는 PUT은 dem 등원입니다.

NON-IDEMPOTENT : 동일한 메시지를 반복해서 사용자에게 POST하는 등의 작업으로 인해 항상 상태가 변경되어 매번 데이터베이스에 새 메시지가 전송 및 저장되는 경우 작업이 NON-IDEMPOTENT라고합니다.

NULLIPOTENT : 데이터베이스 변경없이 웹 페이지에 정보를 표시하는 등의 부작용이없는 경우 (즉, 데이터베이스를 읽기만하는 경우) 작업이 NULLIPOTENT라고합니다. 모든 GET은 nullipotent 여야합니다.

시스템 상태에 대해 이야기 할 때 로깅 및 진단과 같은 무해하고 피할 수없는 영향을 무시하고 있습니다.


9

dem 등식 작업 : 여러 번 실행될 경우 부작용이없는 작업.
: 데이터 리소스에서 값을 검색하여 I

등식아닌 작업을 인쇄하는 작업 : 여러 번 실행하면 약간의 피해를 줄 수있는 작업입니다. (일부 값이나 상태가 변경 될 때)
예 : 은행 계좌에서 인출하는 작업


3
실제로 잘못된 답변입니다! "부작용이 없다"고 말하는 dem 등식 수술이 옳지 않다. "일부 해를 끼치다"라고 말하는 비등 전성 작전의 경우 혼란스러운 답이된다.
Saeed Mohtasham

9

매우 상세하고 기술적 인 답변. 간단한 정의 만 추가하면됩니다.

dem 등원 = 재실행 가능

예를 들어, Create작업 자체가 두 번 이상 실행될 경우 오류없이 실행될 수 없습니다. 그러나 작업이 있으면 CreateOrUpdate재실행 가능성 (등 전성)이 표시됩니다.


3
이것은기만적인 정의입니다. 재실행 가능성이 dem 등성을 보장하지는 않습니다. 작업을 다시 실행할 수 있으며 각 실행에서 결과에 추가 효과를 추가하여 dem 등원이되지 않도록 할 수 있습니다.
Saeed Mohtasham

7

세트에 대한 dem 등원 (Idempotent) 작업은 한 번 이상 적용될 때 멤버를 변경하지 않은 채로 둡니다.

x는 양의 정수 세트에 속하는 absolute (x) 와 같은 단항 연산 일 수 있습니다 . 여기에서 absolute (absolute (x)) = x.

자체와 집합을 통합하는 것과 같은 이진 연산 이 항상 동일한 집합을 반환합니다.

건배


dem 등원 연산은 f (f (x)) = f (x) 인 연산입니다. "구성원을 변경하지 않은 채로 둔다"는 정답이 아닙니다.
Saeed Mohtasham

7

n 번째 결과마다 결과가 첫 번째 결과 값과 일치하는 작업입니다. 예를 들어 -1의 절대 값은 1입니다. -1의 절대 값의 절대 값은 1입니다. -1의 절대 값의 절대 값의 절대 값은 1입니다.

참조 : 재귀를 사용하기에 정말 어리석은 시간은 언제입니까?


1
10 년이 지난 후에도 오만한 대답입니다. +1
snr

3

dem 등원 작동을 이해하는 좋은 예는 원격 키로 자동차를 잠그는 것일 수 있습니다.

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

lockdem 등식 작업입니다. lock깜빡임과 같이 주행 할 때마다 부작용 이 있어도 몇 번이나 잠금 조작을하든 차는 여전히 동일한 잠금 상태입니다.


1

내 5c : 통합 및 네트워킹에서 dem 등원은 매우 중요합니다. 실제 몇 가지 예 : 데이터를 대상 시스템에 전달한다고 상상해보십시오. 일련의 메시지로 전달되는 데이터. 1. 시퀀스가 ​​채널에서 혼합되면 어떻게됩니까? (네트워크 패키지는 항상 :)). 대상 시스템이 dem 등원 인 경우 결과는 달라지지 않습니다. 대상 시스템이 순서에 따라 올바른 순서에 의존하는 경우 대상 사이트에서 올바른 순서를 복원하는 리 시퀀서를 구현해야합니다. 2. 메시지가 중복되면 어떻게됩니까? 대상 시스템의 채널이 적시에 승인하지 않으면 소스 시스템 (또는 채널 자체)은 일반적으로 메시지의 다른 사본을 보냅니다. 결과적으로 대상 시스템 측에 중복 메시지가있을 수 있습니다. 대상 시스템이 dem 등원 인 경우 그것을 처리하고 결과는 다르지 않습니다. 대상 시스템이 dem 등성이 아닌 경우 채널의 대상 시스템 측에 중복 제거기를 구현해야합니다.


다른 요청 (또는 시스템 상태를 변경하는 다른 작업)과 분리하여 전송 된 단일 요청의 dem 등성 (Idempotency)은 요청을 다시 정렬하는 것과 다릅니다. HTTP PUT 요청과 HTTP DELETE 요청은 모두 개별적으로 dem 등원이어야하지만 동일한 URL에서 PUT 및 DELETE를 호출하는 순서는 중요하지 않습니다. 이는 PUT 요청에 부작용이있을 수 있기 때문입니다!
Robin Green

1

요컨대 , dem 등원 (Idempotent) 연산은 dem 등원 (Idempotent) 연산을 몇 번이나 조작하더라도 조작으로 인해 다른 결과가 발생하지 않음을 의미합니다.

예를 들어, HTTP 사양의 정의에 따라 GET, HEAD, PUT, and DELETEdem 등원 (imdempotent) 연산이 있습니다. 그러나 POST and PATCH그렇지 않습니다. 그렇기 때문에 때때로 POST로 대체됩니다 PUT.


-4

재시도 안전.

일반적으로 컴퓨터 과학에서 그 의미를 이해하는 가장 쉬운 방법입니다.


1
재 시도는 처음 또는 이전에 실패한 것을 의미합니다. 동일하지 않습니다.
Lasse V. Karlsen

누가 내 질문을 편집하고 다운 투표권을 얻었습니까? 내가 게시 한 텍스트가 아닙니다 ??
teknopaul

"X 시간 전에 편집"또는 이와 유사한 답변 아래의 링크를 클릭하여 편집 로그를 확인할 수 있습니다.
Lasse V. Karlsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.