2008-10-13 29 views
7

Rất nhiều ngôn ngữ lập trình và khung làm/cho phép/yêu cầu một cái gì đó mà tôi dường như không thể tìm thấy tên cho, mặc dù có lẽ có một trong khoa học máy tính. Những gì họ về cơ bản làm là liên kết với một biến/đối tượng/lớp/chức năng theo tên.Điều này được gọi là gì trong khoa học máy tính?

Flex dụ ("SelectAll()"):

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

Mate dụ ("giá"):

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

Java ví dụ ("Foo"):

Class.forName("Foo") 

Có nhiều ví dụ khác. Bạn có được ý tưởng. Điều rắc rối của tôi là hầu như không có cách nào để xác minh điều này tại thời gian biên dịch, và không nhiều IDE có thể làm để trợ giúp về hoàn thành mã, điều hướng và tái cấu trúc. Nhưng đó là ngoài điểm.

Câu hỏi của tôi là, điều này được gọi là gì? Tôi không nghĩ rằng đó là một trong những: dynamic binding, name binding, reflection

Cập nhật: Không, đây không phải là một bài kiểm tra, xin lỗi nếu nó có vẻ giống như một. Nó chỉ đơn giản là vấn đề "đặt tên bài hát đó" để lập trình.

Cập nhật: Answers đã giúp:

  • Từ Tim Lesher: Nó được gọi là "ràng buộc muộn", "năng động ràng buộc", hoặc "runtime ràng buộc". Thực tế là nó liên kết bằng một chuỗi chỉ là một chi tiết thực hiện ...
  • Từ Konrad Rudolph: ... nó chỉ đơn giản là đầu vào cho một thông dịch viên.

Cập nhật: Khi mọi người đã chỉ ra một cách chính xác, một số trong những ví dụ là vào cuối ràng buộc, một số là phản ánh, một số là runtime-đánh giá (giải thích), vv Tuy nhiên, tôi kết luận có lẽ không có cái tên đó mô tả tất cả. Nó chỉ là một loạt các ví dụ mà có một cái gì đó chung, nhưng không đủ để cho nó một cái tên. Tôi thích câu trả lời "tất cả mọi thứ là một chuỗi", nhưng mặc dù nó buồn cười, nó cũng không hoàn toàn công bằng.

+0

Có thể bạn có thể giải thích lý do tại sao bạn không thích cụm từ động hoặc kết buộc muộn. Đó là những gì tôi đã gọi nó. –

+0

Liên kết động/trễ có vẻ liên quan đến đa hình, đặc biệt quyết định phương thức cần gọi. Bạn nói đúng, đó là một phần của nó, nhưng nó dường như không chạm vào đầu móng vì cái tôi đang tìm cũng được dùng để thiết lập các thuộc tính, không chỉ gọi các phương thức/chức năng. – thvo

+0

Các thuật ngữ "ràng buộc động" và "ràng buộc muộn" được sử dụng phổ biến kể từ trước những năm 80 khi tôi còn là một chàng trai trẻ. Chúng có thể được sử dụng bởi đám đông OOP để mô tả tính đa hình, nhưng chúng chắc chắn có trước nó cho việc sử dụng mà bạn đang nói đến. –

Trả lời

15

Được gọi là "liên kết trễ", "liên kết động" hoặc "ràng buộc thời gian chạy". Thực tế là nó liên kết bởi một chuỗi chỉ là một chi tiết thực hiện, mặc dù nó ngụ ý rằng ánh xạ chuỗi ký tự tồn tại trong thời gian chạy (một số ngôn ngữ, như C++, không cung cấp). Mặt khác,

"Introspection" hoặc "reflection", đề cập đến khả năng tìm ra giao diện, phương thức hoặc thuộc tính mà một đối tượng thực hiện khi chạy.

Đúng là không thể xác minh các biểu tượng động được ràng buộc trước khi thực thi; đó là những gì làm cho chúng khác biệt với các ký hiệu bị ràng buộc tĩnh.

3

Điều gì khiến bạn nghĩ rằng Class.forName không phản ánh?

+0

Có, ví dụ Java IS phản ánh, và các ví dụ khác có thể được thực hiện SỬ DỤNG phản ánh dưới mui xe, nhưng từ tôi ' m tìm kiếm là KHÔNG phản chiếu. – thvo

+0

Không, tôi thực sự không biết câu trả lời. Xin lỗi nếu nó có vẻ giống như một bài kiểm tra. – thvo

2

Kết buộc muộn?

7

Late binding

3

Reflection

0

Trong .NET thế giới chúng ta gọi là liên kết dữ liệu này, và nó đã xử lý sử dụng phản ánh.

Nó cũng nhắc tôi mạnh mẽ về tiêm phụ thuộc.

+0

Databinding là thiết lập các thuộc tính trên một thành phần sao cho thành phần serializes các giá trị của nó trực tiếp đến một cơ sở dữ liệu thay vì có các giá trị của nó được thiết lập và đọc thông qua các thuộc tính bởi mã bên ngoài. Mặc dù câu hỏi bao gồm chuỗi "Chọn", nó dường như không truy cập vào cơ sở dữ liệu. –

+0

Databinding không có gì để làm với một cơ sở dữ liệu. Có, bạn có thể BIND đến một cơ sở dữ liệu, nhưng bạn cũng có thể liên kết với một đối tượng trong bộ nhớ, và khi liên kết với một cơ sở dữ liệu, bạn nghĩ nó thực sự ràng buộc gì? – FlySwat

0

Có mùi giống như con trỏ hàm với tôi.

0

Ví dụ Java bạn đã cung cấp được gọi là Tải lớp động. Tôi không chắc chắn nếu các ví dụ khác là cùng một điều. Nhưng điều này rất hữu ích trong sự phản ánh. Có lẽ bạn đang tìm kiếm các mẫu thiết kế được gọi là đảo ngược của kiểm soát.

3

Điều flex có thể được gọi là liên kết trễ, nếu nó hoạt động như html bình thường. Cho đến khi người dùng nhấp vào nút thời gian chạy không bận tâm để tìm thấy nếu chức năng tồn tại hay không. Điều thứ hai là tiêm phụ thuộc, bao gồm các con trỏ hàm (bằng cách giao diện) và sự phản chiếu. java là chắc chắn phản ánh.

Tôi nghĩ rằng có thể bạn không thể nói đúng câu hỏi của mình hoặc đã chọn các ví dụ xấu để minh họa suy nghĩ của bạn.

+0

Bạn đang nói đúng về việc đặt câu hỏi và tìm các ví dụ. Có lẽ không có từ nào cho việc này. – thvo

+0

thời gian chạy {flex/html} thậm chí không quan tâm đến việc cố gắng tìm hàm selectAll. tham số được mở rộng thành onclick = eval ("function() {selectAll();}") IOW, biên dịch trễ – Javier

1

Bằng cách này, tôi phỏng đoán rằng mã Flex bạn đã cho chúng tôi sử dụng chỉ đơn giản là gọi ActionScript, trong trường hợp này, thuộc tính click sẽ đơn giản là phiên dịch của tài liệu Flex. Do đó, không có ma thuật đặc biệt nào đằng sau loại mã này, nó chỉ đơn giản là đầu vào cho một thông dịch viên.

+0

Điểm tốt về việc này là đầu vào cho một thông dịch viên. – thvo

+0

Nó thực sự không được giải thích/đánh giá, nhưng được viết lại tại thời gian biên dịch. – Theo

0

Ví dụ đầu tiên là ví dụ về cách xml không gian tên có thể giả định nghĩa trên thời gian biên dịch, Thứ hai là cả dữ liệu/phụ thuộc tiêm Ví dụ thứ ba là Reflection, nếu tôi phải gắn thẻ tất cả 3 ví dụ này với Tôi nghĩ rằng tôi sẽ đi cho "Cú pháp"

1

Tôi nghĩ rằng ví dụ Flex không hoàn toàn giống với ví dụ trong Java (không biết những thứ khác). Ví dụ Java rõ ràng là một cái gì đó tôi sẽ gọi ràng buộc muộn, bởi vì trình nạp lớp giải quyết tên lớp trong thời gian chạy, thời gian có thể mới nhất để thực hiện điều đó.

Flex MXML chủ yếu là một cú pháp khác, cuối cùng được biên dịch thành thứ bạn có thể cũng đã viết trong ActionScript. Theo như tôi có thể nói, nút mx: Button và chức năng selectAll() là được giải quyết tại thời điểm biên dịch. Ít nhất mxmlc cho lỗi nếu bạn sử dụng một biểu tượng không xác định ở đó.

1

Có một kịch bản mà trình biên dịch có thể giúp việc này ... Code Generation.

1

Nếu loại biến không được biết đến cho đến khi chạy, thì đó là ràng buộc muộn. Nếu kiểu biến được biết tại thời gian biên dịch, thì đó là ràng buộc sớm.

Intellisense, hoàn thành mã và tất cả các tính năng IDE khác mà bạn nói đến chỉ khả dụng trên các biến bị ràng buộc sớm.

1
2

Các ví dụ thứ hai và thứ ba là ví dụ về phản xạ hay muộn ràng buộc, nhưng ví dụ đầu tiên không phải là .

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

Được viết lại như ActionScript trước khi biên dịch, với phần selectAll() được giấu bên trong chức năng xử lý sự kiện. Một cái gì đó như thế này (làm thế nào nó được thực hiện một cách chính xác có thể được kiểm tra bằng cách thêm -keep-generated-actionscript đến cờ biên dịch):

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

Trình biên dịch sẽ xác định xem các thuộc tính là những sự kiện, phong cách hoặc tài sản, nhưng vì đây được thực hiện tại thời gian biên dịch nó không phải là sự phản chiếu. Phản ánh, theo định nghĩa, được thực hiện khi chạy.

Tôi nghĩ có thể lập luận rằng ví dụ thứ hai và thứ ba là sự phản ánh, nhưng cũng là ví dụ về các ràng buộc muộn. Không ai trong số họ thực sự xác định khả năng của các đối tượng mà họ làm việc trên, vì vậy theo cách đó họ không phản ánh. Tuy nhiên, tôi sẽ nói rằng thuật ngữ "phản chiếu" thường được sử dụng theo nghĩa rộng nghĩa là bất kỳ thứ gì gọi các phương thức có tên được xác định trong thời gian chạy hoặc tạo các đối tượng từ các lớp được đặt tên chỉ trong thời gian chạy. Nếu bạn muốn được chính xác "cuối ràng buộc" có lẽ là câu trả lời đúng nhất, nhưng tôi nghĩ rằng "phản ánh" là đủ tốt.

Các vấn đề liên quan