문제

Wikipedia 말을 사용*대 :

에서 컴퓨터 프로그래밍 객체-지향 프로그래밍 언어 오리 입력 스타일의 동 입력하에 있는 객체의 현재 설정 방법과 특성 결정하는 유효한 의미를,오히려 보다 그는 상속에서 특정한 클래스 또는 구현별 인터페이스입니다.

(*Ed.참고:이 질문을 게시,위키백과 문서를 편집했을 제거하는 단어는"다이나믹".)

그것은에 대한 말씀 구조 입력:

구조적 유형을 시스템(나 성 기반 형식 시스템)는 주요 클래스의 유형을 시스템에서 어떤 유형 호환성 및 동등성은 에 의해 결정 유형의 구조물, 지 않을 통해 명시적인 선언이 있습니다.

그것은 대조 구조 동등과 함께 오리 입력으로:

[구조 시스템 구성]과 대조를 이룹 ...오리 입력,만 의 일부 구조에서 액세스 런타임을 확인합니다.

그러나,기간 보 적어도 직관적으로 포괄 구조로 입력하는 시스템입니다.사실 Wikipedia 말한다:

개념의 이름은[리] 말 오리 테스트, 에 기인 제임스 Whitcomb Riley 는될 수 있으로 표현한 다음과 같:"내가 볼 때 새책 오리처럼과 수리과 돌팔이 의사 오리처럼,나는 새 오리입니다."

그래서 제 질문은:할 수 없는 이유는 무엇 전화 구조 동등에 오리 입력?하이 존재하는 동적으로 입력한 언어할 수 없는 또한 것으로 분류되는 오리-입력?

포스트스크립트:

으로 누군가 이름 daydreamdrunk 에 reddit.com 그래서 설득력을 넣어-it "만약 그것을 컴파일럼 오리와 링크 오리처럼..."

포스트 포스트스크립트

많은 문제를 해결할 수 있을 것 같은 기본적으로 그냥 들추어내는 내가 이미 인용,여기에 해결하지 않고 깊은 질문에 어떤 이유로 사용하지 않는 용어리 덮개를 모두 입력하는 동적 및 구조 sub-입력?는 경우에 대해 얘기하고 싶리지 구조 sub-입력,다만 그것은 전화: 동적 멤버 조회.내 문제는 아무것도에 대한기 나에게 말하기를,이만 적용됩니다 동적 언어입니다.

도움이 되었습니까?

해결책

C ++ 및 D 템플릿은 역동적이지 않은 오리 타이핑의 완벽한 예입니다. 확실히 :

객체의 현재 방법 및 속성 세트가 특정 클래스의 상속 또는 특정 인터페이스의 구현보다는 유효한 의미론을 결정하는 입력.

템플릿을 인스턴스화하기 위해 유형이 상속 해야하는 인터페이스를 명시 적으로 지정하지 않습니다. 템플릿 정의 내에서 사용되는 모든 기능 만 있으면됩니다. 그러나 모든 것이 컴파일 타임에 해결되고 원시적이고 불가능한 16 진수로 컴파일됩니다. 나는 이것을 "컴파일 타임 오리 타이핑"이라고 부릅니다. 나는이 사고 방식에서 내재적 인 템플릿 인스턴스화가 컴파일 타임 오리 타이핑이며 그것이 가장 잘 알려지지 않은 기능 중 하나라고 생각한다는이 사고 방식에서 전체 라이브러리를 썼습니다.

다른 팁

구조적 유형을 시스템

구조적 형식 시스템과 비교 하나의 전체 형식을 다른 전체형지 여부를 확인하기 위해 호환됩니다.에 대한 두 가지 유형 AB 호환되는 것, AB 동일해야 합 구조,즉 방법 AB 동일한 서명이 있어야 합.

오리 입력

오리 입력하는 고려 두 가지 유형과 동일 작업에 대 한 는 경우 그들은 모두 처리하는 작업입니다.에 대한 두 가지 유형 AB 동등하게 조각된 코드를 작성하고 싶어하는 파일 AB 모두 구현하고자 합니다 쓰는 방법입니다.

요약

구조적 유형을 시스템을 비교하는 모든 메소드 서명(전체 구조).오리 입력 비교하는 방법과 관련된 특정 작업(구조와 관련된 작업).

오리 타이핑은 그것이 맞으면 괜찮습니다

이것은 동적으로 입력 한 두 가지에 적용됩니다

def foo obj
    obj.quak()
end

또는 정적으로 입력 한 컴파일 된 언어

template <typename T>
void foo(T& obj) {
    obj.quak();
}

요점은 두 예 모두에서 주어진 유형에 대한 정보가 없다는 것입니다. 사용하면 (런타임 또는 컴파일 타임에!) 유형을 확인하고 모든 요구 사항이 충족되면 코드가 작동합니다. 가치 명시 적 유형이 없습니다 그들의 선언 시점에서.

구조 타이핑은 의존합니다 명시 적으로 타이핑 평소와 마찬가지로 귀하의 값은 구체적인 유형이 상속이 아니라 구조로 식별된다는 것입니다.

위의 예에 대한 구조적으로 유형이있는 코드 (Scala 스타일)는 다음과 같습니다.

def foo(obj : { def quak() : Unit }) {
    obj.quak()
}

OCAML과 같은 일부 구조적으로 타이핑 된 언어가 유형을 명시 적으로 정의하지 못하게하기 위해이를 유형의 추론과 결합한다는 사실과 혼동하지 마십시오.

그것이 정말로 당신의 질문에 대답하는지 확실하지 않지만 ...

템플릿 C ++ 코드는 Duck-Typing과 매우 유사하지만 정적, 컴파일 타임, 구조적입니다.

template<typename T>
struct Test
{
    void op(T& t)
    {
        t.set(t.get() + t.alpha() - t.omega(t, t.inverse()));
    }
};

이는 구조 입력에 의해 사용되는 유형 inferencers 과 같은 유형을 결정하기 위해 정보는(생각켈 또는 여러),는 동안 오리 입력에 관심이 없다"유형"per se,그냥 하는 것은 처리할 수 있는 특정 메소드 호출/재산세스,등등.(각 respond_to? 루비 또는 기능 검사에서 Javascript).

다양한 용어의 일부 정의를 위반하는 일부 프로그래밍 언어의 예가 항상 있습니다. 예를 들어, Actionscript는 기술적으로 역동적이지 않은 인스턴스에서 오리 타자 스타일 프로그래밍을 지원합니다.

var x:Object = new SomeClass();
if ("begin" in x) {
    x.begin();
}

이 경우 "x"의 객체 인스턴스에 인터페이스를 사용하는 대신 호출하기 전에 "시작"메소드가 있는지 테스트했습니다. 클래스 SomeClass ()가 역동적이지 않을 수도 있지만 ActionScript에서 작동하며 오리가 거의 없습니다.

동적 오리 타이핑과 유사한 정적 유형 코드 (즉, C ++)가 다르게 행동하는 상황이 있습니다.

template <typename T>
void foo(T& obj) {
    if(obj.isAlive()) {
        obj.quak();
    }
}

C ++에서는 물체의 두 가지가 있어야합니다. isAlive 그리고 quak 코드 컴파일 방법; 동적으로 입력 한 언어의 동등한 코드의 경우 객체는 quak 방법 if isAlive() 진실을 반환합니다. 나는 이것을 구조 (구조 타이핑)와 행동 (오리 타이핑)의 차이로 해석합니다.

(그러나 나는 Wikipedia의 "Duck-Typing이 역동적이어야한다"는 액면가에서 동적이어야한다는 것을 통해이 해석에 도달하고 그것을 의미있게 만들려고 노력했다. 암시 적 구조적 타이핑이 오리 타이핑이라는 대체 해석도 일관성이있다.)

"Duck Typing"을 프로그래밍 스타일로 더 많이 보는 반면 "구조 타이핑"은 유형 시스템 기능입니다.

구조 타이핑은 유형 시스템의 능력을 말합니다. 표현하다 특정 구조적 특성이있는 모든 값을 포함하는 유형.

오리 타이핑은 다른 제약 조건을 부과하지 않고 당면한 작업에 실제로 필요한 값의 기능 만 사용하는 코드를 작성합니다.

그래서 나는 할 수있다 사용 "오리 유형"을 구조 유형으로 공식적으로 선언하여 오리 타이핑 스타일로 코딩하는 구조적 유형. 그러나 나는 또한 구조적 유형을 사용할 수 있습니다 없이 "오리 타이핑하고있다". 예를 들어, 공통 구조 유형을 선언하고 명명 한 다음 모든 곳에서이를 사용하여 관련 함수/방법/절차/클래스/클래스/모든 관련 정보에 인터페이스를 작성하면 일부 코드 장치가 필요하지 않을 가능성이 매우 높습니다. 모두 구조적 유형의 특징 중에서, 나는 이론적으로 올바르게 작동 할 수있는 값을 거부하도록 불필요하게 제한했다.

따라서 공통점이 어떻게 있는지 알 수는 있지만 오리 타이핑은 구조적 타이핑을 사용한다고 생각하지 않습니다. 내가 그들에 대해 생각하는 방식, 오리 타이핑은 구조적 타이핑을 구조적으로 사용할 수 있었던 것이 아닙니다. 왜냐하면 그것들은 같은 종류의 것이 아니기 때문입니다. 동적 언어로 오리 타이핑을 "암시적이고 확인되지 않은 구조적 유형"으로 생각하는 것은 무언가를 놓치고 있습니다. 오리 타이핑은 프로그래밍 언어의 기술적 기능뿐만 아니라 사용하든 아니든 코딩 스타일입니다.

예를 들어, 사용할 수 있습니다 isinstance 파이썬에서 가짜 OO 스타일 "클래스 또는 서브 클래스"유형 제약 조건에서 확인합니다. 특정 속성과 방법을 확인하고 가짜 구조 유형 제약 조건을 확인할 수도 있습니다 (검사를 외부 함수에 넣어 효과적으로 명명 된 구조 유형을 얻을 수도 있습니다!). 나는 이러한 옵션 중 어느 것도 오리 타이핑을 예시하지 않는다고 주장합니다 (구조 유형이 상당히 미세하게 입자가 아니고 코드 점검과 밀접하게 동기화되지 않는 한).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top