欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
跨越邊界: 延遲綁定
文檔選項

將此頁(yè)作為電子郵件發(fā)送


拓展 Tomcat 應用

下載 IBM 開(kāi)源 J2EE 應用服務(wù)器 WAS CE 新版本 V1.1


級別: 中級

Bruce Tate (bruce.tate@j2life.com), 總裁, RapidRed

2006 年 12 月 18 日

靜態(tài)類(lèi)型語(yǔ)言(如 Java? 語(yǔ)言和 C)可以在編譯時(shí)把方法調用綁定到其實(shí)現中。這項策略讓這類(lèi)語(yǔ)言可以執行更豐富的語(yǔ)法和類(lèi)型檢查。比起不具有此項編譯時(shí)檢查功能的動(dòng)態(tài)類(lèi)型語(yǔ)言來(lái)說(shuō),靜態(tài)類(lèi)型語(yǔ)言更加穩定且具有更佳的性能。然而靜態(tài)類(lèi)型語(yǔ)言存在一個(gè)嚴重的局限性:前期綁定。一些動(dòng)態(tài)類(lèi)型語(yǔ)言(如 Ruby、Smalltalk 和 Self)允許延遲綁定,它們可以實(shí)現另一個(gè)層次的編程功能。

幾年前,我有幸教我的大女兒學(xué)滑雪?;W(xué)校提供的工具里有一條繩子,用這條繩把雪橇的尖端綁在一起。利用這根繩,初學(xué)滑雪的人能夠輕易地實(shí)現較為理想的滑雪動(dòng)作,如轉彎、減速和停止。最初,這些滑雪者十分依賴(lài)于這條繩子。我女兒還發(fā)誓說(shuō)她離開(kāi)這條繩就不滑雪。當然,她這樣說(shuō)是因為她剛剛開(kāi)始學(xué)所以對整個(gè)過(guò)程不了解。這沒(méi)關(guān)系。因為我知道將來(lái)她最終會(huì )在滑雪時(shí)迫使自己沖破這一束縛。

關(guān)于本系列

當今,非 Java 框架正在影響著(zhù) Java 框架的構建方式。您從其他語(yǔ)言學(xué)到的概念可以影響 Java 編程,您所編寫(xiě)的 Python(或 Ruby、Smalltalk 等語(yǔ)言)代碼也可以改變編寫(xiě) Java 代碼的方式。因此,在 跨越邊界 系列文章中,作者 Bruce Tate 提出這樣一種觀(guān)點(diǎn):即通過(guò)學(xué)習其他框架方法和語(yǔ)言,Java 開(kāi)發(fā)人員可以更好地武裝自己!

本專(zhuān)欄介紹與 Java 開(kāi)發(fā)完全不同的編程概念和技術(shù),但這些概念和技術(shù)可以直接應用于 Java 開(kāi)發(fā)。在某些情況下,需要集成這些技術(shù)來(lái)利用它們;但在其他情況下,則可以直接應用這些概念。在這里,單獨的工具并不重要,重要的是那些其他語(yǔ)言和框架中能夠影響 Java 社區開(kāi)發(fā)人員、框架,甚至是基本方式的概念和思想。

作為一名 Java 開(kāi)發(fā)人員,我也有過(guò)類(lèi)似的經(jīng)歷。我喜愛(ài)靜態(tài)類(lèi)型提供的安全性。我曾和 Dave Thomas 就靜態(tài)類(lèi)型檢查的優(yōu)點(diǎn)這個(gè)問(wèn)題進(jìn)行過(guò)辯論,但我卻不能被說(shuō)服。如果沒(méi)有最初的這條“安全之繩”,滑雪會(huì )是一種截然不同的體驗。對于許多人來(lái)說(shuō),靜態(tài)類(lèi)型也是一種依賴(lài),這和雪橇上的束帶沒(méi)有什么區別。Dave 認為我只是還沒(méi)有足夠的經(jīng)歷來(lái)理解動(dòng)態(tài)語(yǔ)言的好處罷了。當我認識到 Ruby 和 Smalltalk 的妙處之后,我開(kāi)始明白對動(dòng)態(tài)類(lèi)型我的確了解得不夠,但這也加深了我對它的理解(參閱之前的 跨越邊界 系列,獲取對靜態(tài)類(lèi)型策略和動(dòng)態(tài)類(lèi)型策略的總體比較)。對我來(lái)說(shuō)它最大的好處是延遲綁定。本文使用 Ruby、Smalltalk 和一個(gè)叫做 Self 的 Smalltalk 的派生語(yǔ)言的編程例子探討了延遲綁定的好處。

后期綁定和前期綁定

編程語(yǔ)言能夠將對函數(或在面向對象語(yǔ)言中的方法)的聲明從其調用中分離出來(lái)??梢月暶饕粋€(gè)方法并使用單獨的語(yǔ)法調用這個(gè)方法,但最終系統需要將這兩者綁到一起。將調用和實(shí)現綁到一起的過(guò)程叫做綁定。前期先綁定到類(lèi)型再綁定到實(shí)現,還是后期先綁定到類(lèi)型再綁定到實(shí)現,這對一門(mén)給定語(yǔ)言的編程體驗來(lái)說(shuō)有著(zhù)顯著(zhù)的影響。大多數面向對象的語(yǔ)言都在后期綁定到實(shí)現,從而允許多態(tài)性 ,該功能讓您能夠將許多不同的子類(lèi)型表示為一種類(lèi)型。Java 代碼和 C 主要在前期的一個(gè)編譯的步驟里綁定到一種類(lèi)型。使用此策略,編譯器就有足夠的信息可以捕獲許多不同類(lèi)型的 bug,比如說(shuō)方法參數或返回值之間類(lèi)型的不兼容。例如,清單 1 中的代碼就會(huì )產(chǎn)生幾個(gè)編譯錯誤:


清單 1. 編譯時(shí)綁定
				...
                        x = 1.0 + anObject.methodThatReturnsString();
                        anObject.methodRequiringIntParameter(aString);
                        ...
                        

通過(guò)編譯時(shí)捕獲錯誤,前期綁定有助于在提早檢查出問(wèn)題。對這種協(xié)助的價(jià)值存在很多質(zhì)疑。很明顯,類(lèi)型檢查并不足以證明代碼的正確性。必需經(jīng)過(guò)測試,而這種測試所發(fā)現的問(wèn)題也常常與類(lèi)型有關(guān)。但這種協(xié)助是有代價(jià)的。使用前期綁定,編譯器必需對目標對象的結構作出如下假設:

  • 必須有一個(gè)預定義好的有限方法列表。
  • 想要調用的方法必須在編譯時(shí)存在。
  • 必須綁定到已知的類(lèi)型、接口或公共超類(lèi)。
  • 綁定目標的方法和屬性必須是固定的。

這些假設所帶來(lái)的限制在最初也許并不明顯,但如果您再深入研究一下,很快就能發(fā)現后期綁定的益處,其中一些在跨越邊界 系列中已經(jīng)介紹過(guò):

  • Ruby on Rails 的持久性框架 Active Record 含有不具有編譯時(shí)屬性的對象。建立了一個(gè)數據庫連接后,Rails 在運行時(shí)為數據庫中的每一行添加一個(gè)屬性到該模型。Active Record 用戶(hù)并不總需要隨著(zhù)數據模型的改變而改變模型對象。正是后期綁定讓這一切成為可能。

  • 單元測試員們必須經(jīng)常編寫(xiě)代碼,這些代碼可以將測試實(shí)現(如 stub 或 mock)和產(chǎn)品實(shí)現綁定到相同的方法調用。Java 開(kāi)發(fā)人員常使用叫做依賴(lài)性注入的設計模式來(lái)解決此問(wèn)題,該模式常需要復雜的框架,如 EJB 或 Spring。這些框架雖然有很多優(yōu)勢,但也帶來(lái)了相當大的復雜性。面向方面的編程或有著(zhù)依賴(lài)性查找的對象工廠(chǎng)也能解決該問(wèn)題,但也同樣會(huì )增加復雜性。動(dòng)態(tài)語(yǔ)言中的測試框架(如 Smalltalk 和 Ruby)不需要依賴(lài)性注入框架,因為它們能夠選擇在運行時(shí)綁定到所需的實(shí)現。它們常常能夠用一小段代碼實(shí)現相同的目標。

  • 整個(gè) Smalltalk 語(yǔ)言是構建在延遲綁定的前提之下的。Smalltalk 開(kāi)發(fā)人員在一個(gè)叫做 image 的持續運行的應用程序之上構建。因為它總在運行,對任何類(lèi)中方法的任何添加、刪除或更新操作都發(fā)生在運行時(shí)。延遲綁定讓 Smalltalk 應用程序在整個(gè)開(kāi)發(fā)周期中可以持續運行。

連續區間

靜態(tài)或動(dòng)態(tài)只是連續區間中的點(diǎn)。一些語(yǔ)言高度靜態(tài)。Java 語(yǔ)言比 C 或 C++ 更為動(dòng)態(tài)。連續區間中的每個(gè)點(diǎn)都有一套自已的折衷方式。Java 語(yǔ)言有許多有助于延遲綁定的功能,這些功能都以相對較高的復雜度為代價(jià)。反射、依賴(lài)性注入以及 XML 配置都可用于延遲綁定和減少耦合。一直以來(lái),Java 語(yǔ)言都是通過(guò)添加功能(如面向方面編程)來(lái)使其更為動(dòng)態(tài)的。您也許會(huì )認為 Java 開(kāi)發(fā)人員擁有了所需的一切。但還有一類(lèi)語(yǔ)言 —— 如 Smalltalk、Self 和 Ruby —— 要比 Java 還要動(dòng)態(tài)且允許用更佳的方式來(lái)延遲綁定。

這些語(yǔ)言可以提供 Java 語(yǔ)言所沒(méi)有的技術(shù),如覆蓋在方法丟失時(shí)發(fā)生的行為。請記住,Java 語(yǔ)言需要存在用于編譯時(shí)綁定的方法。其他語(yǔ)言允許打開(kāi)的類(lèi),這些類(lèi)能夠基于開(kāi)發(fā)人員需求進(jìn)行改變。如果您曾長(cháng)久關(guān)注框架的發(fā)展,就會(huì )發(fā)現對延遲綁定的需求在日益增長(cháng),這種需求導致了 Java 語(yǔ)言中出現了許多很不自然的捆綁,它們使這門(mén)語(yǔ)言變得復雜且模糊。而其他語(yǔ)言則持觀(guān)望態(tài)度,等著(zhù)我們去構建這類(lèi)框架來(lái)實(shí)現更高的抽象級別以及更高的效率。對于您來(lái)說(shuō),好處很明顯:可以獲得一門(mén)更易表達且更高效的語(yǔ)言。

為了理解連續區間中的點(diǎn),可以看一下反射的情況。使用 Java 語(yǔ)言,可以在運行時(shí)裝載類(lèi),通過(guò)反射找到一個(gè)方法,為該方法驗證正確的參數設置,然后執行該方法。要實(shí)現這些功能很可能需要編寫(xiě)很多代碼行。但為延遲綁定所做出的這些努力常常會(huì )得不償失,所以大多數 Java 應用程序開(kāi)發(fā)人員不會(huì )使用此項技術(shù)。Ruby、Smalltalk 和 Self 都使用一種原操作(如 Ruby 中的 object.send(method_name))來(lái)完成此功能。該技術(shù)改變著(zhù)這些語(yǔ)言中編程的本質(zhì),這樣的例子隨處可見(jiàn)。

對類(lèi)型策略和綁定策略越是深入研究就越會(huì )發(fā)現:等到運行時(shí)再綁定到調用或類(lèi)型會(huì )根本性地改變編程的過(guò)程,從而開(kāi)啟一個(gè)全新的可能世界。沒(méi)錯,您會(huì )發(fā)現這樣不那么安全。但您也會(huì )發(fā)現:重復少了、功能強大了并且在減少代碼行的同時(shí)有了更大的靈活性。為了理解這一切是如何運行的,下面將快速介紹一下 Smalltalk、Self 和 Ruby。首先介紹延遲綁定調用方法,然后介紹一些可以在運行時(shí)改變類(lèi)定義的可用技術(shù)。





回頁(yè)首


延遲調用

在靜態(tài)語(yǔ)言中,編譯器在編譯時(shí)直接將調用綁定到實(shí)現。動(dòng)態(tài)語(yǔ)言則有些不同。Ruby、Smalltalk 和 Self 依賴(lài)于消息傳送來(lái)延遲綁定??蛻?hù)機使用消息傳送來(lái)指定目標對象、消息和參數集。這完全是一個(gè)運行機制。所以動(dòng)態(tài)語(yǔ)言有效地添加了一級間接尋址。它們將消息名綁定到一個(gè)對象上,而不是從調用綁定到類(lèi)型再到實(shí)現。然后,將該對象綁定到一個(gè)名稱(chēng)或標記,并使用該名稱(chēng)或標記在運行時(shí)查找相關(guān)的實(shí)現。它是這樣工作的:

  1. 客戶(hù)機向目標對象發(fā)送一條消息。
  2. 該消息有一個(gè)名稱(chēng)和零個(gè)或多個(gè)參數。
  3. 該目標(可以是類(lèi)或對象)查找是否有與此消息同名的方法。
  4. 如果有,目標對象調用該方法。
  5. 如果沒(méi)有,目標對象向父對象發(fā)送一條消息。父對象可能是一個(gè)超類(lèi)(Smalltalk)、一個(gè)父對象(Self)或一個(gè)模塊(Ruby)。
  6. 如果在任何父對象中都沒(méi)找到該方法,會(huì )調用一個(gè)錯誤捕捉方法。

上述所有步驟都發(fā)生在運行時(shí) 。這意味著(zhù)在執行該消息的語(yǔ)句前,既不需要目標方法,也不需要實(shí)現。在 Smalltalk 中,一切皆是對象,且大多數行為都利用消息傳送。甚至于控制結構都依賴(lài)它。Smalltalk 有三種消息:一元消息(無(wú)參數)、二元消息(帶固定的參數集)和關(guān)鍵字消息(帶已命名的參數)。例如:

  • 7 sin 將一元消息 sin 發(fā)送給目標對象 7。
  • 3 + 4 是一條二元消息。它將帶參數 4+ 消息發(fā)送給對象 3。
  • array at: 1 put "value". 是一條關(guān)鍵字消息。該代碼將消息 at: put: 發(fā)送到 array 對象,將 value 放置在數組中 1 的位置。
  • condition ifTrue: [doSomething] ifFalse: [doSomethingElse]. 是一條關(guān)鍵字消息。括號中的代碼叫做閉包代碼塊 。這個(gè)代碼樣例將 :ifTrue :ifFalse 消息發(fā)送到 condition 對象。如果條件為真,Smalltalk 執行 [doSomething] 代碼塊;否則執行 [doSomethingElse] 代碼塊。

Ruby 支持消息傳送和直接方法調用。Ruby 中的消息傳送看起來(lái)有些許不同,但前提是一致的。在清單 2 中,定義了帶 speak 方法和 sleep 方法的 Dog 類(lèi)。直接調用 speak 方法并通過(guò) send 方法按 name 調用 sleep 方法。


清單 2. 在 Ruby 中用兩種方式調用方法
                        irb(main):001:0> class Dog
                        irb(main):002:1>   def speak
                        irb(main):003:2>     puts "Arf"
                        irb(main):004:2>   end
                        irb(main):005:1>   def sleep
                        irb(main):006:2>     puts "Zzz"
                        irb(main):007:2>   end
                        irb(main):008:1> end
                        => nil
                        irb(main):009:0> dog = Dog.new
                        => #<Dog:0x34fa9c>
                        irb(main):010:0> dog.speak
                        Arf
                        => nil
                        irb(main):011:0> message = "sleep"
                        => "sleep"
                        irb(main):012:0> dog.send message
                        Zzz
                        

如果您是一名 Java 程序員,這些都不是什么新鮮內容。您當然可以通過(guò) Java 的反射 API 處理后期綁定。只是需要更多的努力來(lái)實(shí)現同樣的功能。但用任意字符串(可以通過(guò)編程進(jìn)行修改)調用方法確實(shí)打開(kāi)了語(yǔ)言中一項額外的功能。最為重要的是,能夠輕易地調用在運行時(shí)過(guò)后所添加的任意行為。

Self 語(yǔ)言將消息傳送這一概念發(fā)揮到極致。在 Self 中,一切皆是對象。通過(guò)消息傳送專(zhuān)門(mén)地調用所有 Self 行為。Self 不含類(lèi)(通過(guò)復制其他對象創(chuàng )建新對象)也不含變量(只有帶方法和對象的已命名的 slot)。Self 使用消息傳送來(lái)調用已命名的 slot 和方法。其他大多數面向對象的語(yǔ)言通過(guò)允許直接訪(fǎng)問(wèn)實(shí)例數據弱化了封裝的價(jià)值,但 Self 通過(guò)加強用于訪(fǎng)問(wèn)方法和實(shí)例數據的相同協(xié)議克服了這一不足。發(fā)送一條消息調用一個(gè) slot。如果一個(gè) slot 有一個(gè)對象,該對象返回其值。Self 對訪(fǎng)問(wèn)屬性和訪(fǎng)問(wèn)方法不作區別。這項簡(jiǎn)化措施讓 Self 成為了一門(mén)簡(jiǎn)單但功能卻很強大的編程語(yǔ)言。像 Smalltalk 一樣,Self 用消息傳送來(lái)表示控制結構,Self 依賴(lài)于一個(gè)一直運行的 image。Self 中的對象都有一個(gè)父對象以及包含其他對象或方法的 slot。從 Self 對消息傳送的嚴重依賴(lài)以及 Self 應用程序一直運行這一概念可以看出:延遲綁定是 Self 的中心課題。

Self 中的消息傳送和 Smalltalk 中的幾乎一樣。在 Smalltalk 中 count <- 3 將數字 3 賦給一個(gè)叫做 count 的變量。但 Self 沒(méi)有變量,也沒(méi)有賦值。需要發(fā)送消息 object count: 3objectcount slot 的值設置為 3。要檢索 count 的值,只需簡(jiǎn)單地使用 object count。

當您將 method_missing 加入進(jìn)來(lái)后,消息傳送就有了另一層次的意義。請記住,這項功能對于動(dòng)態(tài)語(yǔ)言來(lái)說(shuō)是開(kāi)放的,可對于在編譯時(shí)綁定到類(lèi)型的語(yǔ)言來(lái)說(shuō)卻是徹底關(guān)閉的。前期綁定的好處(強迫該方法必須存在)原來(lái)也是其核心的弱點(diǎn)。Ruby 讓您能夠越過(guò) method_missing 行為來(lái)調用在運行時(shí)也許不存在的方法的行為。Active Record 將類(lèi)和表關(guān)聯(lián)起來(lái),并按照數據庫中的每一列給每個(gè)類(lèi)動(dòng)態(tài)地添加一個(gè)屬性。Active Record 也為每個(gè)列或列的集合自動(dòng)添加尋找程序!例如,映射到 people 數據庫表的 Person 類(lèi)具有 first_namelast_name 列,person.find_by_first_name_and_last_name 是一個(gè)合法的 Active Record 語(yǔ)句,盡管這樣的方法并不存在。 Active Record 越過(guò) method_missing 并在運行時(shí)解析該方法名以確定該方法名是否有效。結果就會(huì )產(chǎn)生一個(gè)相當有效的框架用于包裝數據庫表,該框架通過(guò)后期綁定而獲得了極大的簡(jiǎn)化。但到目前為止,我還只是探討了有關(guān)調用的內容?,F在可以討論一下有關(guān)添加行為的話(huà)題了。





回頁(yè)首


在運行時(shí)添加行為

所有這三種語(yǔ)言(Self、Smalltalk 和 Ruby)都使在運行時(shí)添加行為變得十分簡(jiǎn)單。使用 Self 和 Smalltalk,對現有類(lèi)所做的任何更改都是通過(guò)定義一個(gè)運行時(shí)修改來(lái)實(shí)現的。當添加一個(gè)方法時(shí),也有效地修改了一個(gè)活動(dòng)的類(lèi)。在 Self 中添加或刪除 slot 很簡(jiǎn)單:只需要發(fā)送 _add_slot 消息。類(lèi)似地,在 Smalltalk 中,可以通過(guò)調用相應的消息(在一些地方稱(chēng)作 compile)來(lái)添加方法或屬性。在這兩種情況下,都可以直接在 image 中修改類(lèi)的單個(gè)副本。接下來(lái)我要對 Ruby 中對類(lèi)添加行為進(jìn)行稍微深入一點(diǎn)的探討。

Ruby 框架常使用在運行時(shí)通過(guò)幾種不同的機制修改類(lèi)的技術(shù)。最簡(jiǎn)單的是打開(kāi)類(lèi)??梢源蜷_(kāi)任何的 Ruby 類(lèi),并通過(guò)重命名、添加或刪除方法或屬性來(lái)更改它。假設您想要在 Ruby 中擴展數字來(lái)簡(jiǎn)化柱狀圖的實(shí)現過(guò)程。您可以打開(kāi) Fixnum 類(lèi),并添加一個(gè)方法來(lái)打印出相應長(cháng)度的柱,如清單 3 所示。


清單 3. 擴展 Fixnum
                        irb(main):001:0> 7.class
                        => Fixnum
                        irb(main):002:0> class Fixnum
                        irb(main):003:1>   def bar
                        irb(main):004:2>     puts(‘-‘*self)
                        irb(main):005:2>   end
                        irb(main):006:1> end
                        => nil
                        irb(main):007:0> 7
                        => 7
                        irb(main):008:0> 7.bar
                        -------
                        => nil
                        irb(main):009:0> [6, 8, 2, 4, 9].each {|i| i.bar}
                        ------
                        --------
                        --
                        ----
                        ---------
                        => [6, 8, 2, 4, 9]
                        

這個(gè)例子展示了當您在運行程序時(shí)知道了該行為后該如何擴展 Ruby 類(lèi)。當想要基于未知規則給一個(gè)類(lèi)添加任意行為時(shí),則需要使用一項不同的技術(shù)??梢栽陬?lèi)的上下文中估計字符串。以清單 4 為例。清單 3 擴展了 Fixnum 類(lèi),該類(lèi)被認為是靜態(tài)的。在清單 4 中,該類(lèi)根本不需要被認為是靜態(tài)的。對 Dog 的擴展讓您可以添加任意行為到 dog 或任何其他類(lèi)中。該類(lèi)打開(kāi)自己,添加進(jìn)一個(gè)具有您指定的名稱(chēng)的方法,并添加您指定給該類(lèi)的行為:


清單 4. 可擴展的類(lèi)
                        class Dog
                        def self.extend(method_name, method_body)
                        class_eval(%Q[
                        def #{method_name}
                        #{method_body}
                        end
                        ])
                        end
                        def speak
                        puts "Arf"
                        end
                        end
                        dog = Dog.new
                        Dog.extend("sneeze", "puts ‘Achoo!‘")
                        dog.speak
                        dog.sneeze
                        

清單 4 中的 extend 方法還需要進(jìn)一步加以說(shuō)明。這里大概地解釋一下。Ruby 打開(kāi)一個(gè)類(lèi)并添加一個(gè)帶有您提供給 Dog 類(lèi)的名稱(chēng)及主體的方法。首先,定義一個(gè)叫做 self.extend 的方法。self. 意味著(zhù) extend 是一個(gè)類(lèi)方法,即在整個(gè)類(lèi)上操作的方法,比如 new 方法。其次,調用 class_eval。這個(gè)方法打開(kāi)類(lèi)并在打開(kāi)的類(lèi)上執行下列字符串。接下來(lái),所有在 %[] 之間的代碼都被解釋為單個(gè)的字符串。最后,Ruby 按 #{} 之間的變量替代了該值。





回頁(yè)首


現狀和超越

在清單 4 的例子中,從內部擴展了 Dog。采用相同的技術(shù),可以用相同的方式擴展任意的 Ruby 類(lèi)?,F在,延遲綁定全部的能量就凸現了出來(lái)??梢詾橐粋€(gè)普通的類(lèi)擴展任意的功能并調用類(lèi)的新行為,盡管當編寫(xiě)原始類(lèi)時(shí)它們根本不存在。

反射的功能也不能不提。Self、Ruby 和 Smalltalk 通常都進(jìn)行反射。其消息傳送功能允許不迫使用戶(hù)訪(fǎng)問(wèn)物理的方法就調用方法,正如在 Java 語(yǔ)言中那樣。class.methods 提供 Ruby 中一組方法名的數組,而 class methods 可以返回 Smalltalk 中的方法集。使用這些功能及類(lèi)似的特性幾乎可以找到在類(lèi)或對象上進(jìn)行快速自檢所需的一切。

到目前為止,我主要探討了關(guān)于綁定到方法的內容,但延遲綁定的內容要多得多??匆幌虑鍐?5 中所示的 Ruby 的方法定義。


清單 5. 添加兩個(gè)數字
                        def add(x, y)
                        x+y
                        end
                        

如果采用類(lèi)似的 Java 方法,就需要鍵入參數。這個(gè) Ruby 方法返回兩個(gè)數字的和。使用該方法惟一的要求是:第一個(gè)對象實(shí)現 + 而第二個(gè)對象和第一個(gè)要兼容。該方法的客戶(hù)機能夠確定對象是否兼容。

類(lèi)似的 Java 方法只適用于單一類(lèi)型的參數。而這個(gè) Ruby 方法能夠服務(wù)于浮點(diǎn)型、整型、字符串型以及任何支持 + 方法的類(lèi)型。延遲綁定可以讓單個(gè)的方法具有真正的多態(tài)性。該設計也是可擴展的,因為它能夠支持當前系統尚未實(shí)現的類(lèi)型。例如,此方法可以輕易地支持虛數。





回頁(yè)首


用 Java 語(yǔ)言延遲綁定

Java 社區對靜態(tài)類(lèi)型檢查的迷戀程度令人驚訝,Java 程序員們正在不遺余力地尋找延遲綁定的方式。有些方法是成功的。諸如 Spring 等框架的存在主要是為了延遲綁定,它有助于減緩客戶(hù)機和服務(wù)之間的耦合。面向方面的編程通過(guò)提供能夠擴展類(lèi)的功能(甚至可以超出其當前的功能)的服務(wù)來(lái)實(shí)現延遲綁定。像 Hibernate 這樣的框架也可以延遲綁定,通過(guò)反射、代理和其他工具在運行時(shí)將持久性功能添加到純粹、普通的 Java 對象(POJO)中?,F在有很多關(guān)于如何用 POJO 編程的流行書(shū)籍可供開(kāi)發(fā)人員參考,這些書(shū)籍大多會(huì )使用愈加復雜的技術(shù)(比反射還要先進(jìn)),而這些技術(shù)主要是為了打開(kāi)類(lèi)并延遲綁定,從而有效地回避了靜態(tài)類(lèi)型。

在其他地方,延遲綁定的方法就不那么成功。依賴(lài)于 XML 來(lái)延遲綁定的部署描述符有很多問(wèn)題。對 XML 的過(guò)分依賴(lài)和我們對語(yǔ)言中的動(dòng)態(tài)行為的強烈渴望有很大關(guān)系,因為這些語(yǔ)言常常有點(diǎn)太過(guò)靜態(tài),綁定得有點(diǎn)太早,并且有點(diǎn)太受限制。

現在已經(jīng)有一些語(yǔ)言和技術(shù)可以為 Java 程序員們極想解決的這幾類(lèi)問(wèn)題提供解決方案,例如透明的持久性、為可測試性減少耦合、更加豐富的插件模型等。只要看看推動(dòng) Java 持久性框架發(fā)展的元程序設計,并同 Active Record、Gemstone 或 Og(動(dòng)態(tài)語(yǔ)言中的持久性框架)中類(lèi)似的解決方案對比一下,一切就一目了然了(參見(jiàn) 參考資料)?,F在延遲綁定變得越來(lái)越重要,并且推動(dòng)該過(guò)程的那些思想和做法在其它語(yǔ)言中也甚為高效。當您需要進(jìn)行元程序設計時(shí),請打開(kāi)您的工具箱,加入幾種允許延遲綁定的語(yǔ)言。不要害怕跨越邊界!



參考資料

學(xué)習
  • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文 。

  • Java To Ruby: Things Your Manager Should Know (Tate,Pragmatic Bookshelf,2006 年 ):本文作者編著(zhù)的一本書(shū),講述了在何時(shí)何地需要從 Java 編程轉變到 Ruby on Rails 以及如何完成這種轉變。

  • Beyond Java (Tate,O‘Reilly,2005 年):本文作者編著(zhù)的一本書(shū),講述了 Java 語(yǔ)言的起源及穩定發(fā)展,以及在某些方面能夠挑戰 Java 平臺的技術(shù)。

  • Og:Ruby 中的一個(gè)對象-關(guān)系映射器。由于 Active Record 的流行,它并沒(méi)有發(fā)展起來(lái),但其使用模型卻很引人注目。

  • Gemstone:流行的 Smalltalk 數據庫。

  • Smalltalk.org:Smalltalk 的社區站點(diǎn)。

  • Rails Up and Running (Tate,O‘Reilly,2006 年):本文作者編著(zhù)的一本關(guān)于 Ruby on Rails 的入門(mén)書(shū)。

  • Book review: Agile Web Development with Rails ” (Darren Torpey,developerWorks,2005 年 5 月):介紹了這樣一本書(shū),它可以加深讀者對 Rails 和敏捷開(kāi)發(fā)方式原理的理解。

  • Spring Framework:Spring 是一個(gè)克服了 Java 語(yǔ)言中靜態(tài)類(lèi)型局限性的出色的框架。

  • Programming Ruby (Dave Thomas et al.,Pragmatic Bookshelf,2005 年):關(guān)于 Ruby 編程的一本暢銷(xiāo)書(shū)。

  • The Rails API:Rails 框架文檔,該文檔是有關(guān) Active Record 及其實(shí)現技術(shù)的出色的參考資料。

  • Java 技術(shù)專(zhuān)區:數百篇關(guān)于 Java 編程各個(gè)方面的文章。


獲得產(chǎn)品和技術(shù)
  • Squeak:由 Disney 開(kāi)發(fā)的一個(gè) Smalltalk 實(shí)現。

  • Self:下載 Self 編程語(yǔ)言,該語(yǔ)言是 Smalltalk 的簡(jiǎn)化版。

  • Ruby on Rails:下載開(kāi)源的 Ruby on Rails Web 框架。

  • Ruby:從項目 Web 站點(diǎn)獲取 Ruby。


討論
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
二十分鐘Ruby入門(mén) - [Matrix - 與 Java 共舞]
跨越邊界: JavaScript 語(yǔ)言特性
Ruby快速入門(mén)(30分鐘)
對象的消息模型 | 酷殼
新兵戰老將 Ruby能否挑動(dòng)Java?
挑戰Java開(kāi)發(fā)優(yōu)勢的四種技術(shù):動(dòng)態(tài)語(yǔ)言,元編程等
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久