문제

많은 프로그래밍 언어와 프레임 워크는 컴퓨터 과학에 하나가있을지라도 이름을 찾을 수없는 것들을/허용/요구합니다. 그들이 기본적으로하는 것은 변수/객체/클래스/함수에 이름별로 바인딩하는 것입니다.

몸을 풀다 예제 ( "selectall ()") :

<mx:Button click="selectAll()" label="Select All"/>

친구 예 ( "가격") :

<Injectors target="{QuotePanel}">
  <PropertyInjector targetKey="price" source="{QuoteManager}" sourceKey="currentPrice" />
</Injectors>

Java 예제 ( "foo") :

Class.forName("Foo")

다른 많은 예가 있습니다. 당신은 아이디어를 얻습니다. 문제가되는 것은 컴파일 타임에 이것을 확인할 방법이 거의 없으며, IDE가 코드 완료, 내비게이션 및 리팩토링 측면에서 도움을 줄 수있는 일이 많지 않다는 것입니다. 그러나 그것은 요점 외에 있습니다.

내 질문은 이것이 무엇이라고 불리는가? 나는 그것이 이것들 중 하나라고 생각하지 않습니다. 동적 바인딩, 이름 바인딩, 반사

업데이트: 아니요, 이것은 퀴즈가 아닙니다. 하나처럼 들리면 죄송합니다. 그것은 단순히 프로그래밍을 위해 "그 노래 이름"의 문제입니다.

업데이트: 도움이 된 답변 :

  • Tim Lesher : "늦은 바인딩", "동적 바인딩"또는 "런타임 바인딩"이라고합니다. 문자열에 의해 바인딩된다는 사실은 단지 구현 세부 사항 일뿐입니다....
  • Konrad Rudolph에서 : ...그것은 단순히 통역사에 대한 입력입니다.

업데이트: 사람들이 올바르게 지적했듯이, 일부 예제는 늦게 구속력이 있고, 일부는 반사이며, 일부는 런타임 평가 (해석) 등입니다. 그러나 나는 그들 모두를 묘사하는 이름이 없을 것입니다. 그것은 공통점이 있지만 이름을 부여하기에 충분하지 않은 많은 예일뿐입니다. 나는 "모든 것이 끈이다"대답을 좋아했지만, 재미 있지만, 그것은 정의도 완전히하지는 않는다.

도움이 되었습니까?

해결책

"늦은 바인딩", "동적 바인딩"또는 "런타임 바인딩"이라고합니다. 문자열에 의해 바인딩된다는 사실은 단지 구현 세부 사항 일 뿐이지 만, 문자열-대기업 매핑이 런타임에 존재한다는 것을 의미합니다 (C ++와 같은 일부 언어는 제공하지 않는 일부 언어).

반면에 "내성"또는 "반사"는 런타임에 객체가 구현하는 인터페이스, 메소드 또는 속성을 찾는 기능을 참조하십시오.

실행 전에 동적으로 바운드 기호를 확인할 수 없다는 것은 사실입니다. 그것이 정적으로 바운드 기호와 다르게 만드는 이유입니다.

다른 팁

늦은 바인딩

당신이 그것을 생각하게 만드는 것 Class.forName 반사가 아니야?

반사

플렉스 물건은 일반 HTML처럼 작동하는 경우 늦은 바인딩이라고 할 수 있습니다. 사용자가 버튼을 클릭 할 때까지 런타임은 함수가 존재하는지 여부를 찾기 위해 귀찮게하지 않습니다. 두 번째는 의존성 주입입니다. 여기에는 함수 포인터 (인터페이스를 통해)와 반사가 포함됩니다. Java One은 확실히 반영됩니다.

나는 당신이 당신의 질문을 제대로 말할 수 없거나 당신의 생각을 설명하기 위해 나쁜 예를 선택했을 수도 있다고 생각합니다.

늦은 바인딩?

두 번째와 세 번째 예제는 반사 또는 늦은 바인딩의 예이지만 첫 번째 예는 그렇지 않습니다.

<mx:Button click="selectAll()" label="Select All"/>

컴파일 전에 ActionScript로 다시 작성됩니다 selectAll() 이벤트 핸들러 기능 내부에 부품이 자리 잡고 있습니다. 이와 같은 것 (추가 된 방법은 정확히 추가로 확인할 수 있습니다. -keep-generated-actionscript 컴파일러 플래그에) :

_button1 = new Button();
_button1.label = "Select All";
_button1.addEventListener("click", function( event : Event ) : void {
    selectAll();
});

컴파일러는 속성이 이벤트, 스타일 또는 속성인지 여부를 결정하지만 컴파일 시간에 수행되므로 반사되지 않습니다. 정의에 따라 반사는 런타임에 수행됩니다.

두 번째와 세 번째 예제는 반영이라고 주장 할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수 있다고 생각할 수있다. 그들 중 누구도 실제로 그들이 작업하는 객체의 능력을 결정하지 않으므로 그런 식으로 반사되지 않습니다. 그러나 "반사"라는 용어는 런타임에 이름을 결정하는 메소드를 호출하거나 런타임에만 이름이 지정된 클래스에서 객체를 생성하는 것을 의미하는 것을 의미하기 위해 "반사"라는 용어가 매우 넓은 의미로 매우 사용된다고 말합니다. 당신이 정확하게 원한다면 "늦은 바인딩"이 아마도 가장 정답 일 것입니다. 그러나 나는 "반사"가 충분하다고 생각합니다.

"내성"?

그건 그렇고, 나는 당신이 우리에게 보여준 Flex 코드가 Simply ActionScript 호출을 사용하는 것을 추측합니다. click 속성은 단순히 그럴 것입니다 eval'Flex 문서의 통역사에 의한 D. 따라서 이런 종류의 코드 뒤에는 특별한 마법이 없으며 단순히 통역사를위한 입력입니다.

플렉스 예제는 Java (다른 것들을 모른다)와는 다르지 않다고 생각합니다. Java 예제는 분명히 내가 부를 것입니다 늦은 바인딩, 클래스 로더는 런타임에 클래스 이름을 해결하기 때문에 최신 가능한 시간입니다.

Flex MXML은 주로 또 다른 구문으로, 결국 ActionScript에서 쓸 수있는 것으로 편집됩니다. 내가 알 수있는 한 MX : 버튼과 selectall () 함수는 컴파일 시간에 해결되었습니다. 정의되지 않은 기호를 사용하면 최소한 MXMLC가 오류를 제공합니다.

컴파일러가이를 도울 수있는 시나리오가 있습니다 ... 코드 생성.

변수 유형을 런타임까지 알 수없는 경우 바인딩이 늦습니다. 변수 유형이 컴파일 시간에 알려진 경우 초기 바인딩입니다.

Intellisense, 코드 완료 및 다른 모든 IDE 기능은 초기 바인딩 변수에서만 사용할 수 있습니다.

나에게 기능 포인터 냄새가납니다.

당신이 준 Java 예제를 동적 클래스 로딩이라고합니다. 다른 예가 같은지 확실하지 않습니다. 그러나 이것은 반사에 유용합니다. 어쩌면 당신은 통제의 역전이라는 디자인 패턴을 찾고있을 것입니다.

.NET 세계에서 우리는이 데이터 바인딩을 호출하며 반사를 사용하여 처리했습니다.

또한 의존성 주입을 강력하게 상기시킵니다.

첫 번째 예는 네임 스패닝 된 XML이 컴파일 시간에 대한 의미를 어떻게 가정 할 수 있는지에 대한 예입니다. 두 번째는 모두 데이터 바인딩/종속 주입입니다. 세 번째 예제는 반사입니다. "구문"용

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