[language-agnostic] dem 등식 수술이란 무엇입니까?

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



답변

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


답변

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 등성은 작업을 한 번 적용하거나 여러 번 적용하는 것이 동일한 효과를 의미합니다.

예 :

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

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

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

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

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


답변

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 여야합니다.

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