반복적으로 호출 될 때 한 번 호출하는 것과 동일한 효과를 갖는 함수의 용어는 무엇입니까?


96

(단일 스레드 환경 가정)

이 기준을 충족시키는 기능은 다음과 같습니다.

bool MyClass::is_initialized = false;

void MyClass::lazy_initialize()
{
    if (!is_initialized)
    {
        initialize(); //Should not be called multiple times
        is_initialized = true;
    }
}

본질적 으로이 함수를 여러 번 호출 할 수 있으며 여러 번 초기화 MyClass하는 것에 대해 걱정할 필요가 없습니다.

이 기준을 충족하지 않는 기능은 다음과 같습니다.

Foo* MyClass::ptr = NULL;

void initialize()
{
    ptr = new Foo();
}

initialize()여러 번 호출 하면 메모리 누수가 발생합니다

동기

이 기준을 충족시킬 것으로 예상되는 기능에 대한 주석을 달 수 있도록이 동작을 설명하는 간결한 단어를 갖는 것이 좋습니다 (특히 재정의 될 것으로 예상되는 인터페이스 기능을 설명 할 때 유용함)


67
가까운 유권자에게 : 모든 "이름있는 것"질문의 99.999 % (대략 추정치)는 주제에 맞지 않으며, 단 하나의 정확하고 모호하지 않으며 객관적인 답변이 없기 때문에 주제가 맞지 않습니다. 이름은 순전히 주관적인과 의견을 기반으로,이는 않습니다 영업 자신에 의해 주어진 하나의 올바른 명확한 객관적인 답을 보유하고 있습니다.
Jörg W Mittag

30
그것을 여러 번 호출하면 않는 사이에 'VAR을'변경 다른 코드가있을 수 등의 효과가 있습니다.
RemcoGerlich

7
OP가 질문 할 당시의 답변 알고 있다면 왜이 질문을 받았 는가? 담당자 / 포인트 / 카르마 빌딩 이외의 다른 이유가 있습니까?
dotancohen

13
@dotancohen Q / A 스타일 자체 응답은 StackExchange의 주요 개념 중 하나입니다.
glglgl

17
@glglgl : 장점에 대한 질문에 동의합니다 . 이 질문에는 어떤 장점이 있습니까? 모든 CS 101 질문에 대해 OP가 요청하고 즉시 답변을, 모든 단일 CS 용어가 OP에 의해 요청 및 즉시 정의를 시작하고, 모든 기본 알고리즘의 장단점이 질문을 받고 OP에 의해 즉시 답변 될 것입니다. 반드시이 OP는 아닙니다). 그것이 softwareengineering.SE가 원하는 사이트입니까?
dotancohen

답변:


244

이러한 유형의 기능 / 작동을 Idempotent 라고합니다

Idempotence (영국 : / ˌɪdɛmˈpoʊtəns /, [1] US : / ˌaɪdəm-/) [2]는 수학 및 컴퓨터 과학에서 특정 작업의 속성으로 초기 응용 프로그램을 넘어서 결과를 변경하지 않고 여러 번 적용 할 수 있습니다.

수학에서 이는 f 가 dem 등원 인 경우 f ( f (x)) = f (x)이며 이는 ff = f 라고 말하는 것과 같습니다 .

컴퓨터 과학에서 이는 i f(x);등원 인 f(x);경우와 동일 함을 의미합니다 f(x); f(x);.

참고 : 이러한 의미는 다르게 보이지만 상태의미 적 의미에서 "등전위"라는 단어는 실제로 수학과 컴퓨터 과학에서 동일한 의미를 갖습니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
maple_shaft

51

이에 대한 정확한 용어는 ( 우파가 언급했듯이 ) dem 등식 입니다. 나는 당신이 당신의 func1메소드를 dem 등원이라고 부를 수는 있지만 순수한 함수 라고 부를 수는 없다고 덧붙였다 . 순수 함수의 속성은 두 가지입니다. 즉, dem 등원이어야하며 부작용이 없어야합니다. 즉, 로컬 정적 변수, 로컬이 아닌 변수, 변경 가능한 참조 인수 또는 I / O 스트림의 돌연변이가 없습니다.

내가 언급 한 이유는 부작용이있는 idempotent 함수가 좋지 않기 때문입니다. 기술적으로 idempotent는 부작용이 아닌 함수의 반환 출력을 참조하기 때문입니다. 따라서 func2입력에 따라 출력이 변경되지 않으므로 기술적 으로 i 등법입니다.

순수한 기능을 원한다고 지정하려고합니다. 순수한 함수의 예는 다음과 같습니다.

int func1(int var)
{
    return var + 1;
}

더 많은 정보는 Wikipedia article "Pure function"에서 찾을 수 있습니다 .


37
나는 dem 등분에 대한 당신의 정의가 너무 좁거나 다른 방법으로 생각하면, 당신은 프로그래밍이 아닌 dem 등분의 수학적 정의를 사용하고 있습니다. 예를 들어, PUTDELETEHTTP 메소드가 호출되어 멱등 정확하게 때문에 그들의 부작용을 여러 번 실행함으로써 번만를 실행하는 것과 같은 효과를 갖는다. 당신은 "idempotency means f∘f = f" 라는 말을 하는 반면, 프로그래밍에서는 "실행 f하는 것과 같은 효과가 실행된다 f; f" 는 것을 의미 합니다. "world"매개 변수를 추가하여 두 번째 의미를 이전 의미로 쉽게 변환 할 수 있습니다.
Jörg W Mittag

23
@Neil "등 전성은 엄밀히 수학적인 용어입니다." 아닙니다. 네트워킹 및 클라이언트 서버 통신 / 분산 시스템에서도 사용되며 JörgWMittag가 설명합니다. 원래 메시지의 설정을 변경하지 않고 동일한 작업 / 메시지로 서버 / 클라이언트에 여러 요청을 허용하기 때문에 유용한 개념입니다. 통신이 불안정 할 때 유용하며 클라이언트 메시지가 삭제되었거나 서버가 응답했기 때문에 명령을 재 시도해야합니다.
opa

7
순수와 dem 등의 차이점에 대해 자세히 설명해야합니다. func1 예제는 dem 등성이 아닙니다 func1(1) != func1(func1(1)).
Tezra

5
순도와 dem 등성은 다릅니다. 순수한 함수는 수학적인 의미에서 dem 등식 일 필요는 없습니다 (아무것도 없기 때문에 부작용 측면에서 i 등식입니다). OP에서 제공하는 예와 같이 programming 등식 (프로그래밍 의미에서) 기능은 순수 할 필요는 없습니다. 또한, 불투명도가 언급 한 바와 같이,, 등성은 순도와는 완전히 다른 용도로 유용한 특성이다. 순도에 대해 "등 전성이 있고 부작용이 없음"으로 정의한 것은 잘못되었거나 적어도 오도의 소지가 있습니다.
Frax

5
프로그래밍과 관련하여 "부작용"은 없지만이를 포함하도록 정의를 확장하는 경우 dem 등원 함수와 순수한 함수는 같은 것을 의미합니다. 아니요, 그들은 전혀 같은 의미가 아닙니다. 순수하지 않은, 등식 : void f(int var) { someGlobalVariable = var; }. dem 등성이 아닌 순수함 : int func1(int var) { return var + 1; }.
JLRishe

6

용어는 I 등식 입니다. Idempotent 함수 (재귀 적으로 호출; 두 번째 코드 블록 및 수학 정의)와 기능적 Idempotence (동일한 입력으로 반복적으로 호출; 첫 번째 코드 블록 및 종종 프로그래밍에서 의미하는 용어) 사이에는 뚜렷한 차이가 있습니다.

부작용이있는 함수 f는 순차적 인 구성 f에서 dem 등원이라고한다. f 동일한 인수 목록으로 두 번 호출 된 경우 두 번째 호출에 부작용이없고 첫 번째 호출과 동일한 값을 반환하는 경우 [인용 필요] (첫 번째 호출의 끝과 시작 사이에 다른 프로 시저가 호출되지 않은 것으로 가정) 두 번째 전화).

예를 들어 다음 Python 코드를 고려하십시오.

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

여기서, setx에 대한 두 번째 호출 (같은 인수로)은 가시적 인 프로그램 상태를 변경하지 않기 때문에 setx는 dem 등적입니다. x는 첫 번째 호출에서 이미 5로 설정되었고 두 번째 호출에서 다시 5로 설정되어 같은 가치. 이것은 함수 구성 f ∘ f에서 dem 등성과는 다르다는 점에 유의하십시오. 예를 들어 함수 구성에서 절대 값은 i 등수입니다.

def abs(n):
    if n < 0:
        return -n
    else:
        return n

abs(-5) == abs(abs(-5)) == abs(5) == 5

3

물리학에서 나는 이것을 투영 이라고합니다 .

돌기는 선형 변환 인 P 자체 벡터 공간으로부터되도록 P 2 = P . 즉, P가 임의의 값에 두 번 적용될 때마다 한 번 적용된 것과 동일한 결과를 제공합니다 (등전위).

벡터 투영만화 를 보면 그래픽 적으로 의미가 있습니다 .

여기에 이미지 설명을 입력하십시오

그림에서 a 1a의 b 에 대한 투영입니다 . 이는 함수의 첫 번째 적용과 같습니다. 이어서 돌기 1 행에서 B는 동일한 결과를 제공 1 . 다시 말해, 투영을 반복해서 호출하면 한 번 호출하는 것과 같은 효과가 있습니다.

공정한 경고 : 물리 밖에서 이것이 사용 된 적이 없다고해서 팀에 이러한 유형이 없으면 모든 사람을 혼란스럽게 할 수 있습니다.


2
이것은 실제로 dem 등식 함수가 수학적으로, 특히 벡터 기하학 / 선형 대수 필드에서 어떻게 시각화 될 수 있는지에 대한 좋은 구체적인 예입니다. 소프트웨어 기능의 "등전위"는 매우 밀접한 개념이지만, 개발자 / 컴퓨터 과학자는이 맥락에서 종종 "투영"이라는 단어를 사용하지 않는다고 생각합니다 (소프트웨어 엔지니어링의 "투영 함수"는 객체를 취하는 기능을 의미합니다 예를 들어 그 객체에서 파생 된 새 객체 또는 해당 객체의 속성을 반환합니다)
Pac0

2
@ Pac0 아, 알겠습니다. 나는 과학과 프로그래밍 사이의 경계에서 일하고 있는데, 단어가 이미 과부하되어 있다는 것을 깨닫지 못했습니다. 나는이 용어를 사용하는 직장에서 몇 가지 고안된 예를 생각할 수 있지만, 매일 과학 전문 용어를 사용하고자하는 사람들과 함께 일하는 것은
인정할 만하다.

3

결정적 알고리즘 (이 경우에 입력이없는 상태) 동일한 입력을 부여하기 때문에, 그것은 항상 동일한 출력을 생성한다.

컴퓨터 과학에서 결정 론적 알고리즘은 특정 입력이 주어지면 항상 동일한 출력을 생성하고 기본 시스템이 항상 동일한 상태 시퀀스를 통과하는 알고리즘입니다. 결정 론적 알고리즘은 실제 머신에서 효율적으로 실행될 수 있기 때문에 가장 많이 연구되고 친숙한 알고리즘이며 가장 실용적인 알고리즘 중 하나입니다.

SQL 데이터베이스는 결정적 함수에 관심이 있습니다 .

결정 론적 함수는 입력이 같을 때 항상 같은 대답을합니다. SQLite의 대부분의 내장 SQL 함수는 결정적입니다. 예를 들어 abs (X) 함수는 입력 X가 같으면 항상 같은 답을 반환합니다.

인덱스 계산에 사용되는 함수는 결정적이어야합니다.

예를 들어, SQLite는에, 다음과 같은 비 결정적 함수는 인덱스에 사용할 수 없습니다 : random(), changes(), last_insert_rowid()sqlite3_version().


6
asker 's func2는 결정 론적이지만 (임의의 영향은 없습니다), 이미 찾고있는 재산을 위반 한 것으로 선언되었습니다.
Draco18s

동일한 결과가 반복에 의해 생성된다는 것은 동일한 결과가 중첩 또는 연쇄에 의해 생성된다고 말하는 것과 다릅니다. 결정적 함수는 인덱싱 / 해싱보다 결과 캐싱에 중요합니다.
mckenzm

3

다른 답변 외에도이 속성 을 가진 기능에 특정 입력이있는 경우 함수 의 고정 소수점 , 고정 소수점 또는 고정 소수점 입니다. 예를 들어, 1의 모든 거듭 제곱은 1과 같으므로 (1ⁿ) ⁿ = 1ⁿ = 1입니다.

출력으로 생성되는 프로그램의 특수한 경우는 quine 입니다.


Cantor 세트가 수학 :-)에 따라 Quines는 소프트웨어에 적용됩니다. 물론 퀴인은 dem 등성이 아닙니다. 출력이 이미 존재하거나 실패한 경우에도 이전 결과를 "복제"하고 동일한 출력이지만 새 결과를 작성합니다.
Carl Witthoft
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.