2008-10-13 3 views
7

많은 프로그래밍 언어와 프레임 워크가 컴퓨터 과학에 있어도 이름을 찾을 수없는 무언가를하고 있습니다. 기본적으로 변수/객체/클래스/함수에 이름으로 바인딩됩니다.컴퓨터 과학에서 이것을 무엇이라고 부릅니까?

Flex 예 ("는 selectAll()") :

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

Mate 예 ("가격") :

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

자바 예 ("푸") :

Class.forName("Foo") 

다른 많은 예가 있습니다. 당신은 아이디어를 얻습니다. 컴파일 타임에 이것을 검증 할 방법이 거의없고 코드 완성, 탐색 및 리팩토링과 관련하여 IDE가 할 수있는 일이별로 없다는 것이 얼마나 큰 문제인지. 그러나 그것은 요점 외에도 있습니다.

내 질문은 무엇입니까? 나는 이들 중 하나라고 생각하지 않습니다 dynamic binding, name binding, reflection

업데이트 : 그것은 하나 같은 소리하면 아니,이 미안 퀴즈 없습니다. 프로그래밍에 "노래의 이름을 지정하는 것"의 문제 일뿐입니다.

업데이트 : 팀 Lesher에서

  • : 도움이 답변 그것은 "후기 바인딩"라고는, "동적 바인딩"또는 "런타임 바인딩". 문자열로 바인딩한다는 사실은 구현 세부 사항 일뿐입니다. ...
  • Konrad Rudolph 출신 : 단순히 인터프리터에 대한 입력입니다.

업데이트 : 사람들이 정확하게 지적했듯이, 예제 중 일부는 몇 가지 런타임 평가 (해석) 등 그러나, 나는이 결론을 내릴 수 있습니다 아마도 어떤 이름이 없다, 일부는 반사하고, 런타임에 바인딩됩니다 그들 모두를 설명합니다. 그것은 공통점이 있지만 그 이름을 부여하기에는 충분치 못한 예제들입니다. 나는 "모든 것이 문자열이다"라는 대답을 좋아했지만 재미 있다고해도 충분히 정의하지는 못합니다.

+0

왜 동적 또는 지연 바인딩이라는 용어가 마음에 들지 않는지 설명 할 수 있습니다. 그것이 내가 부른 것입니다. –

+0

동적/후기 바인딩은 다형성과 관련이 있으며 특히 호출 할 메소드를 결정합니다. 당신 말이 맞아요, 그것의 일부입니다. 그러나 찾고있는 것은 메소드/함수를 호출하는 것뿐만 아니라 속성을 설정하는 데에도 사용되기 때문에 머리에 못을 박는 것처럼 보이지 않습니다. – thvo

+0

"동적 결합"과 "후기 바인딩"이라는 용어는 80 년대 초반 젊은 대학생이었을 때부터 흔히 사용되었습니다. 그들은 다형성을 설명하기 위해 OOP 군중에 의해 사용될 수 있지만, 당신이 말하고있는 용도로 사용하기에 앞서 그것을 확실하게 선행합니다. –

답변

15

"후기 바인딩", "동적 바인딩"또는 "런타임 바인딩"이라고합니다. 문자열로 바인딩한다는 사실은 구현 세부 사항 일 뿐이지 만 런타임시 문자열 - 심볼 매핑이 존재 함을 암시하지는 않지만 (이는 C++와 같은 일부 언어가 제공하지 않음).

반면에 "Introspection"또는 "reflection"은 런타임에 객체가 구현하는 인터페이스, 메소드 또는 속성을 찾아내는 기능을 의미합니다.

실행 전에 동적으로 바운드 된 기호를 확인할 수 없다는 것은 사실입니다. 그것이 정적 바인딩 된 심볼과 다른 점입니다.

3

당신은 어떻게 생각하십니까 Class.forName 반영하지 않습니까?

+0

예, Java 예제가 리플렉션이고 다른 예제가 후드 아래에서 USING 리플렉션으로 구현 될 수 있지만 ' 찾고있는 것은 반영이 아닙니다. – thvo

+0

아니요, 정말 답을 모른다. 퀴즈처럼 보인다면 사과하십시오. – thvo

2

후기 바인딩?

7

늦은 우리는이 데이터 바인딩을 호출 .NET 세계에서 반사

3

바인딩, 그리고 반사를 사용하여 처리하고있다.

또한 의존성 주입을 강하게 생각 나게합니다.

0

+0

데이터 바인딩은 구성 요소의 속성을 설정하므로 구성 요소가 해당 값을 설정하지 않고 데이터베이스에 직접 직렬화하고 외부 코드로 속성을 읽습니다. 질문에 문자열 "선택"이 포함되어 있지만 데이터베이스에 액세스하는 것으로 보이지 않습니다. –

+0

데이터 바인딩은 데이터베이스와 아무 관련이 없습니다. 예, 데이터베이스에 바인딩 할 수 있지만 메모리 오브젝트에 바인드 할 수도 있고 데이터베이스에 바인딩 할 때 실제로 바인딩에 어떤 영향을 미치나요? – FlySwat

0

나에게 기능 포인터와 같은 냄새가 난다.

0

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

3

정상적인 html과 같이 작동하는 경우 flex라는 용어는 후기 바인딩이라고 할 수 있습니다. 사용자가 버튼을 클릭 할 때까지 런타임은 함수가 존재하는지 여부를 확인하지 않습니다. 두 번째로 의존성 삽입이 있는데, 이는 함수 포인터 (인터페이스 방식)와 리플렉션을 포함합니다. 자바는 확실히 반사적입니다.

나는 당신의 질문을 올바르게 말로 표현할 수 없거나 당신의 생각을 설명하기 위해 나쁜 예를 골랐다 고 생각합니다.

+0

질문을 말하고 예제를 찾는 것이 옳습니다. 아마 이것에 대한 말은 없을 것입니다. – thvo

+0

{flex/html} 런타임은 selectAll 함수를 찾으려고하지 않습니다. 매개 변수가 onclick = eval ("function() {selectAll();}"으로 확장되었습니다. IOW, 늦은 컴파일 – Javier

1

그런데 우리가 보여준 플렉스 코드는 단순히 ActionScript 호출을 사용한다고 추측합니다.이 경우 click 속성은 플렉스 문서의 인터프리터에 의해 간단히 eval이됩니다. 따라서, 이런 종류의 코드 뒤에는 특별한 마법이 존재하지 않습니다. 단지 인터프리터 용 입력입니다.

+0

인터프리터에 대해 입력되는 것에 대한 좋은 지적. – thvo

+0

실제로 해석/평가되지는 않지만 컴파일시 다시 작성됩니다. – Theo

0

첫번째 예는 네임 스페이스가 XML 시간 컴파일에 의미를 추정하는 방법의 일례이다 번째는 모두 I는 모든 이러한 3 실시 예에 태그를 가지고있는 경우 바인딩/의존성 주입은 세 번째 예는, 반사이며 name 나는 "Syntax"로 갈 것이라고 생각한다.

1

Flex 예제는 자바와 완전히 다르다고 생각한다. Java 예제는 분명히 이라는 늦은 바인딩이라고 할 수 있습니다. 클래스 로더가 클래스 이름을 런타임에 확인하기 때문에 가능한 가장 늦은 시간입니다.

Flex MXML은 주로 ActionScript로 작성된 코드로 컴파일되는 다른 구문입니다. mx : Button 및 selectAll() 함수는 컴파일 시간이 일 때 으로 해결됩니다. 거기에 정의되지 않은 기호를 사용하면 적어도 mxmlc에서 오류가 발생합니다.

1

컴파일러가 도움을 줄 수있는 시나리오가 있습니다. 코드 생성.

1

런타임까지 변수 유형을 알 수없는 경우 런타임에 바인딩됩니다. 컴파일 타임에 변수 유형을 알고 있으면 초기 바인딩입니다.

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

2

두 번째와 세 번째 실시 예는 반사의 예 또는 늦은 결합하지만, 첫 번째 예는 아니다 .

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

selectAll() 일부 이벤트 핸들러 함수 안에 꿰매되면서, 이전에 컴파일 액션으로 재기록된다. 이런 식으로 뭔가 (가 정확하게 수행하는 방법은 컴파일러 플래그에 -keep-generated-actionscript을 추가하여 확인할 수 있습니다) :

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

컴파일러는 속성이 이벤트, 스타일 또는 특성이 있는지를 결정하지만,이 때문에 컴파일시에 이루어집니다 그것을 반영이 아닙니다. Reflection은 정의에 따라 런타임에 수행됩니다.

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