乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      跨越邊界: Streamlined,第 2 部分

       魚非魚 2007-03-28

      2006 年 11 月 16 日

      本系列文章包括兩部分,第 1 部分 介紹了 Streamlined,這是個基于 Rails 的開放源碼框架,它組合了 Ajax、元編程以及代碼生成的強大功能,把 Rails 的效率提升到了一個新的層次。第 2 部分將探索 Streamlined 背后的元模型是如何支持定制的。

      本系列文章包括兩部分,在 第 1 部分 中,我展示了一種稱為搭建的 Ruby on Rails 特性,介紹了它的限制,然后演示了稱為 Streamlined 的框架如何可以把搭建提升到構建功能性用戶界面這一層次。但是即使使用最高級的生成器,用戶界面也總是需要些定制。如果不能有效地擴展所構建的內容,那么構建得再快,也不會擁有有效的應用程序開發(fā)框架。這篇文章將介紹 Streamlined 背后的定制模型的基礎:Streamlined 元模型。

      Streamlined 的快速回顧

      關于本系列

      跨越邊界 系列中,,作者 Bruce Tate 宣揚了這樣一種觀點:當今的 Java 程序員通過學習其他方法和語言會得到其他思路。自從 Java 明顯成為所有開發(fā)項目的最佳選擇以來,編程前景已經改變。其他的框架正在影響搭建 Java 框架的方式,從其他語言學到的概念可以影響您的 Java 編程。您編寫的 Python(Ruby、Smalltalk……)代碼可以改變您處理 Java 編碼的方式。

      本系列介紹了與 Java 開發(fā)有根本不同但是卻直接適用的編程概念和技術。在某些情況下,需要集成這些技術以利用它。在其他情況下,則可以直接應用這些概念。比起其他語言和框架能夠影響 Java 社區(qū)的開發(fā)人員、框架甚至基本方法這一概念,單獨的工具不是那么重要。

      第 1 部分 中,我構建了一個簡單的 Rails 應用程序,存儲了一些進行山地單車運動的 trail 并將它們按其臨近的城市加以組織。我開始時創(chuàng)建了一個模型,包含兩個模型對象和它們之間的關系。然后運行 Streamlined 應用程序生成器,它生成了一個健壯的應用程序,生成的應用程序有以下特性:

      • 完整的用戶界面,包含布局,帶有鏈接指向每個模型的管理頁面。
      • 每個模型有一個列表頁面,可以按任意列排序或根據所有列的內容進行過濾。
      • 支持 Ajax 的列表,可以顯示、編輯、刪除或創(chuàng)建條目。
      • 導出程序可以生成視圖的 XML 或 CSV 導出。

      隨著年輕的 Streamlined 框架的發(fā)展,對于基礎應用程序模板所做的增強將可以用于所有 Streamlined 應用程序。目前已經策劃的增強包括:基于 REST 和 SOAP 的 Web 服務,以及稱為 皮膚 的樣式模板。

      定制默認應用程序

      現在要定制 Trails 應用程序的代碼。如果想和我一起編寫代碼,需要安裝 Ruby、Rails 和 Streamlined (參閱 參考資料)并構建 第 1 部分 中的應用程序。將在這個基礎上進行添加和改動來定制 Trails 應用程序。

      如果還沒這樣做過,請通過輸入 script/server 從項目目錄中啟動 Web 服務器(在 Windows 上是 ruby script/server)。把瀏覽器指向 http://localhost:3000/Trails/list 這個 URL,啟動 Trails 視圖。圖 1 顯示了基本的 Streamlined 視圖。如果您已經添加了數據,那么會注意到與 Rails 搭建不同,Streamlined 替您管理了關系。還會注意到關系依賴 id 字段。


      圖 1. 默認 Streamlined 應用程序
      默認 Streamlined 應用程序




      回頁首


      Streamlined 定制策略

      這個實現可以工作,但對用戶來說不是最好的實現。用戶希望看到賽道位于的城市的名稱,而不僅僅是個 ID。實際上,這個應用程序的用戶永遠不需要看到 ID。在我解決這個問題之前,我要先介紹 Streamlined 的定制策略。

      有些應用程序生成框架會強迫用戶在這個時候修改生成的代碼。Rails 搭建當然可以這樣工作,但這僅僅是擴展生成的應用程序的三種方法之一:

      • 可以修改生成的代碼。
      • 可以用編程方案(例如繼承)和定制掛鉤(例如 Visual Basic 腳本)編寫擴展應用程序的新代碼。
      • 可以改進可用的元數據,這樣框架就可以生成更智能的應用程序。

      這些方法各有各的用途。隨著代碼復雜性的提高,第一個策略變得越來越無用,因為用開發(fā)人員不可能編寫復雜代碼,這會加大開發(fā)人員的負擔。應當把這個策略局限在擴展非常簡單的代碼上。Streamlined 通過添加新運作,使得可以容易地修改現有控制器。

      第二種方法 —— 用新的定制代碼擴展應用程序 —— 是多數快速應用程序開發(fā)環(huán)境采用的常用方法。一般來說,當框架設計者考慮添加定制的空間時,這個策略工作得最好。Rails 與 Ruby 的動態(tài)特性結合,提供了許多開發(fā)人員意想不到的定制點,使這個策略特別吸引人。在 Streamlined 中,經常會創(chuàng)建應用程序視圖的新模板。也可以利用通用的 Rails 架構,在自己的橫切關注點上(例如安全性)展開。

      第三種方法,是改進的元模型,它是 Streamlined 的基礎。在 第 1 部分 中,看到了搭建如何使用活動記錄提供的元數據 —— 類型、列名稱和關系 —— 來構建復雜的用戶界面。在 Java 應用程序內,經常用 XML 配置實現這個策略。這當然是提供元數據的一種方法,但是要查看的數據太多,我擔心有朝一日,我的眼睛會壞掉。





      回頁首


      通過元模型修改顯示內容

      郵件合并元編程比喻

      跨越邊界 系列以前的文章中,已經看到過 Ruby 中的模板和元編程技術。請把 Ruby 模板想像成郵件合并文檔。然后,Rails 使用元編程來生成和使用元模型(例如數據庫模式或列定義),這好比郵件合并應用程序中的名稱列表。Streamlined 引入了兩段基本代碼,模仿了這種方法。視圖模板允許 Streamlined 不僅僅生成一個 “郵件合并” 文檔,而且還會生成應用程序中的所有類似視圖。Streamlined 通過活動記錄、也通過定制元模型來利用元數據。這些部分與 Streamlined 生成器和庫組合在一起,構成了一個很優(yōu)秀的應用程序生成平臺。

      Streamlined 并不處理這個麻煩,而是支持通過元編程和模板的有效定制。要理解這個方法,請想像一下郵件合并應用程序。郵件合并應用程序得到名稱列表和包含消息的模板。模板有些用來插入細節(jié)(例如名稱、地址和電話號碼)的定制位置。請把名稱列表想像成用來定制模板的元數據。

      Streamlined 就像個郵件合并 —— 只是它為每個模型對象使用元數據來創(chuàng)建整個應用程序,而不是郵件。要提供 視圖模板 或使用 Streamlined 提供的默認視圖模板。首先,要求 Streamlined 生成應用程序模板和所指定的每個模型類的元數據的占位器。接下來,通過元模型指定定制的用戶界面選項,例如想讓 Streamlined 如何顯示關系。然后,告訴 Streamlined 如何呈現每個視圖。Streamlined 把元模型中的數據應用到模板,把它們組合起來形成 所指定的每個模型的新視圖,如圖 2 所示:


      圖 2. Streamlined 元數據和模板
      默認 Streamlined 應用程序

      首先,我要介紹元模型。首先會看到元模板如何影響應用程序。然后,我要介紹如何用 Streamlined 模板定制應用程序。具體來說,請看 app/Streamlined/trail.rb 文件。將看到一個空白類。就是在這里可以定制 trails/list 視圖的某些方面。請把這個文件編輯成如清單 1 一樣:


      清單 1. trail.rb 的 Streamlined 元模型
                              require File.dirname(__FILE__) + ‘/streamlined_ui‘
                              class TrailUI < Streamlined::UI
                              relationship :location, :fields => [:city, :state]
                              end
                              

      清單 1 代表 Trails 視圖的元數據。稍后會看到,Streamlined 可以把這些值替換進視圖模板,形成完整的用戶界面屏幕?,F在,重新裝載瀏覽器。會看到刷新的視圖,如圖 3 所示:


      圖 3. 修訂關系內容
      默認 Streamlined 應用程序

      請注意在關系表示中的變化。Location 列現在顯示兩個字段:城市和州。

      Streamlined 的創(chuàng)造者們原本可以輕易地把定制數據添加到了活動記錄。這個策略會把所有配置保持在同一位置。但是他們沒有這樣做,我非常感謝他們。他們的方法 —— 元數據在獨立目錄中 —— 有幾個關鍵優(yōu)勢:

      • 獨立元數據不會混合視圖數據與模型數據。在模型和視圖之間的清楚分離,對于降低耦合很重要,并使對視圖的根本修改不會影響到模型,反之亦然。
      • streamlined 目錄支持額外的元數據,而不會污染活動記錄。
      • Streamlined 方法允許在一個地點合并常見視圖特征,非常像活動記錄為了持久性考慮而做的那樣。

      迄今為止,我已經修改了 Streamlined 在 Trails 視圖中表示關系的方法。元編程框架經常需要支持一些外部決策,例如決定哪個列或內部字段對用戶重要。默認情況下,Streamlined 排除了特殊的 Rails 字段,例如外鍵、主鍵、時間戳,而包含了其余字段??梢匀菀椎赜?user_columns 方法覆蓋這些默認設置,這個方法中有 includeexclude 選項。例如,我需要做這樣一個修改。Description 字段通常擁有文本的整個段落。通常,用戶界面不會在這樣的匯總列表中列出所有字段。我可以用元模型在列表視圖中排除某些字段。方法是編輯 app/streamlined/trail.rb,加上排除 Description 列的代碼,如清單 2 所示:


      清單 2. 排除 description 列
                              require File.dirname(__FILE__) + ‘/streamlined_ui‘
                              class TrailUI < Streamlined::UI
                              relationship :location, :fields => [:city, :state]
                              user_columns :exclude => [:description]
                              end
                              

      然后,重載瀏覽器,得到圖 4 所示的結果:


      圖 4. 刪除定制列
      默認 Streamlined 應用程序




      回頁首


      修改顯示結構

      Streamlined 更強大的方面之一就是其協助管理關系的方法。裝入 http://localhost:3000/locations/list 的視圖。進一步觀看關系用戶界面。會看到一個數字,它是與地點有關的賽道的數量。接下來,單擊 location 列下的 Edit 鏈接。將看到一列復選框,如圖 5 所示。這些都是數據庫中的賽道,選中的代表它屬于指定地點。這個窗口是關系的視圖。


      圖 5. 默認關系視圖
      默認 streamlined 應用程序

      Streamlined 框架提供了三種不同的關系視圖:

      • 默認的 :membership 視圖用復選框代表關系,如圖 5 所示。選中的框表示成員。Streamlined 猜測要把哪個字段用于復選框,但是可以用叫作 view_fields 的選項覆蓋它的猜測。

      • 圖 6 中的 :inset_table 視圖在內嵌表中顯示相關字段。在這個示例中,可以立即在嵌入表中看到相關數據。



        圖 6. :inset_table 關系視圖
        默認 Streamlined 應用程序

        清單 3 顯示了圖 6 中視圖的代碼:



        清單 3. 關系的 Inset 表視圖
                                    require File.dirname(__FILE__) + ‘/streamlined_ui‘
                                    class LocationUI < Streamlined::UI
                                    relationship :trails, :view => :inset_table
                                    end
                                    



      • 圖 7 還顯示了一個表格,它使用 :window 視圖放置了一個按需彈出窗口而不是 inset:



        圖 7. :window 關系視圖
        默認 Streamlined 應用程序

        :window 關系視圖的代碼如清單 4 所示:



        清單 4. 關系的 Window 視圖
                                    require File.dirname(__FILE__) + ‘/streamlined_ui‘
                                    class LocationUI < Streamlined::UI
                                    relationship :trails, :view => :window
                                    end
                                    

      這些視圖都支持 Ajax。當在成員視圖中選中一個復選框時,視圖發(fā)出 Ajax 調用,更新服務器上的相關模型。修改是即時的,立即會有用戶反饋。Streamlined 有效地利用 Ajax 模糊了 Web 用戶界面和富客戶端之間的界線。完全支持 Ajax 的視圖并不是元編程的典型特性,但是一旦有了良好的基礎,就可以在不斷提高的抽象層次上工作。

      Streamlined 框架還允許您決定在關系總結字段中表示什么。在 圖 3 中,會看到指定地點全部相關 Trails 的總結。也可以配置總結,顯示合計、所有相關城市的字段或其他數學特性(例如它們的開放的平均數)。例如,可以指定 relationship :trails, :summary => :list, :fields => [:name, :difficulty],看到圖 8 中的結果:


      圖 8. 總結列表
      默認 Streamlined 應用程序

      Ruby 的特性支持這個語法。總結行還是 relationship :trails, :summary => :list, :fields => [:name, :difficulty]。這個代碼調用叫作 relationship 的方法,并傳遞進一些參數??梢愿M一步,找出到底發(fā)生了什么。在 清單 4 中,看到了每個 Streamlined 配置都繼承自 Streamlined::UIStreamlined 是個模塊,UI 是這個模塊中的類。)打開 app/streamlined/streamlined_ui.rb 文件,可以看到 relationship 的方法定義。在清單 5 中可以看到方法定義:


      清單 5. StreamlinedUI.rb 文件中的關系方法
                              def relationship(rel, options = {})
                              ensure_options_parity(options)
                              initialize_relationships unless @relationships
                              @relationships[rel] = {} unless @relationships[rel]
                              @relationships[rel].merge!(options)
                              end
                              

      可以看到兩個參數:reloptions??赡芟肟吹礁鄥担驗榉椒ㄕ{用給出了針對 :trails、:summary:fields 的參數。實際上,:trailsrel 參數,而 :summary => :list, :fields => [:name, difficulty] 是個名稱-值對,代表 options 的單一哈希圖。開始時,這個語法有點讓人迷惑,但是它為 Ruby 提供了模擬已命名的可選參數的能力,而所需的語言的額外開支卻很小。





      回頁首


      擴展視圖模板

      迄今為止,我還不需要修改現有應用程序中的代碼,但是 Streamlined 確實提供了可以讓視圖定制變得更容易的幾種機制??梢匀菀椎叵胂癯鲂枰趹贸绦騼刃薷囊粋€視圖甚至所有視圖的場景。首先,我要介紹 Streamlined 如何處理單一視圖。然后,我要展開討論,包括進應用程序中的所有視圖。

      默認情況下,Streamlined 為應用程序中的每個模型創(chuàng)建一個視圖,還有一個針對所有應用程序視圖的視圖模板。要覆蓋單一視圖,可以只修改這個實現。例如,用一個單詞 Testing 代替 app/views/trails/list.rhtml 中的所有代碼。然后,單擊左側欄中的 Trails。會看到圖 9 中的視圖??梢杂眠@種方法定制系統中的任何單個視圖。


      圖 9. 修改 Streamlined 視圖
      Caption

      獨立地修改視圖是很好的,但是如果想獲得元編程的全部威力,可能想用一個模板來構建應用程序中的全部視圖。這種方法會提供最佳效果,因為是為整個應用程序編寫一個模板。刪除 app/views/trails 中的全部文件。這會在運行時要求 Streamlined 調用公共模板視圖。Streamlined 覆蓋叫作 render 的方法,以實現這個目的。停止和重啟 Web 服務器(因為已經修改了底層結構)并重載瀏覽器。將看到 圖 1 中的原始 Trails 視圖恢復了。如果我能選擇,我會通過用 no_views 選項調用 Streamlined 生成器,用一個視圖模板生成我的初始應用程序。

      可以在 app/views 中找到所有視圖代碼。側欄、頁頭、頁腳、菜單和公共文件都在 streamlined 目錄中。管理關系的視圖在 streamlined/relationships 中,部分主內容和主內容的視圖在 streamlined/generic_views 中。

      清單 6 顯示了 Streamlined 的主模板 app/views/streamlined/generic_views/_list.rhtml 的一部分:


      清單 6. Streamlined 模板的一部分(為了可讀性添加了分行)
                              <% for item in @streamlined_items %>
                              <% alt = 1 - alt %>
                              <tr <%= "class=‘odd‘" if alt == 0 %>>
                              <% for column in @model_ui.user_columns_for_display %>
                              <td><%=h item.send(column.name) %></td>
                              <% end %>
                              <% for relationship in @model.reflect_on_all_associations %>
                              <td>
                              <div id="<%= relationship_div_id(relationship, item) %>">
                              <%= render(:partial => "#{@model_ui.summary_def(relationship.name).partial}",
                              :locals=> {:item=> item, :relationship=> relationship,
                              :fields=> @model_ui.summary_def(relationship.name).fields})%>
                              </div>
                              <%=link_to_function("Edit", "Streamlined.Relationships.open_relationship(‘#{
                              relationship_div_id(relationship, item)}‘, this,
                              ‘/#{params[:controller]}‘)")%>
                              </td>
                              <% end %>
                              ...deleted code to render links...
                              <% end %>
                              

      請注意兩個 for 循環(huán)。每個循環(huán)都反映活動記錄和 Streamlined 的元數據。第一個循環(huán)在每個 Streamlined 列上迭代。Streamlined 通過從活動記錄元數據中提取全部列、刪除某些特定于 Rails 的列(例如 id)、排除或包含在 Streamlined 元數據中指定的每個列(如 清單 2 所示)來確定有哪個列要參與。第二個循環(huán)在活動目錄模型中的所有關系上迭代,并呈現每個關系的適當部分。

      我也可以組合各種方法。可以編寫一個應用程序,用一個 Streamlined 模板(帶站點范圍內的編程約定)代表多數視圖, 然后在我需要打破公共的站點范圍約定時,再按照需要覆蓋單個視圖。這是一種極為強大的開發(fā)范式,可以讓人從一個很好的默認實現開始,然后再在站點范圍內或單一頁面的基礎上用定制實現來編輯或完全替換標準實現。





      回頁首


      整體再回顧

      Streamlined 是個帶支持應用程序生成的富元模型的框架。元模型變成了更高層次的編程語言,提高了效率。在某些方式上,這樣一個框架在 Rails 中是不可避免的,因為同樣的元編程工具使得搭建可以用于 Rails 框架的所有用戶。構建更有效的搭建系統只是個時間早晚的問題。

      在 Streamlined 中,得到了這樣一個框架,它組合了更高的語言抽象、代碼生成和用來擴展的定制掛鉤。公共的元模型驅動著每件事。使用這項技術,框架的重點主要放在用戶界面上,但是可以看到它的前進已經超越了 Web 頁面。Streamlined 已經或很快就會提供以下這些特性:

      • 用于內容聯合的 Atom 提要:這會讓 Web 上的其他應用程序可以利用由 Streamlined 應用程序生成的并符合公共標準的自動 XML 提要。
      • XML 和 CSV 導出:Streamlined 允許公共數據格式的導出。
      • 查詢和過濾器:Streamlined 允許用簡單查詢過濾內容,然后使用結果。
      • 基于 REST 的 Web 服務:Streamlined 開始時有 Web 服務支持,但是后來清除掉了,因為 Rails 架構師正在重新設計 Web 服務支持,要將其改成基于簡單 REST 方式的插件系統(請參閱 參考資料)。

      Streamlined 正在努力在不遠的將來成為一個元編程框架,允許您創(chuàng)建任意模板,插入現有 Rails 組件、生成器和插件。這個框架將超過外觀感受,進而創(chuàng)建一個公共架構,有可能形成一個極為強大的企業(yè)應用程序生成器。Relevance, LLC 的 Justin Gehtland 說過: “Streamlined 的下幾個發(fā)行版,意在鞏固它作為元框架的位置。它將包含和重用標準 的 Rails 生成器、切實可用的插件和其他開源框架,從而迅速裝配起整個應用程序,超出目前提供的 CRUD 支持。我們將可以用與以前同樣的方法進行配置:依賴良好約定,但是提供用于修改默認項的聲明式 DSL?!?

      帶有優(yōu)秀定制的更高抽象層次是任何語言(包括 Java 語言)的神圣目標。在下期的 跨越邊界 文章中,我要研究延遲綁定的好處。在那之前,請繼續(xù)尋找通過提升抽象來增強實力的方法,并請繼續(xù)跨越邊界。



      參考資料

      學習
      • 您可以參閱本文在 developerWorks 全球站點上的 英文原文 。

      • Java To Ruby: Things Your Manager Should Know (Pragmatic Bookshelf,2006):這是本文作者編著的一本書,講述何時何處從 Java 編程轉變到 Ruby on Rails 以及如何完成這種轉變。

      • Beyond Java (O‘Reilly,2005):本文作者編寫的一本書,講述 Java 語言的提高和穩(wěn)定發(fā)展,以及在某些方面能夠挑戰(zhàn) Java 平臺的技術。

      • Simply RESTful:提供了對 Rails REST Web 服務的下一個模型的概觀。

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

      • Streamlined:訪問 Streamlined 的 Web 站點和博客。

      • Rails API:Rails 框架文檔是從內到外學習搭建和讓其工作的元編程技術的最佳途徑。參閱 scaffolding.rb 類獲得更多細節(jié)。

      • Programming Ruby (Dave Thomas 等,Pragmatic Bookshelf,2005):關于 Ruby 編程的一本流行書。

      • Java 技術專區(qū):數百篇 Java 編程各方面的文章。


      獲得產品和技術
      • Streamlined:下載 Streamlined 應用程序生成器并試用。Streamlined 正在快速發(fā)展,所以要下載初始的 alpha 版本。

      • Ruby on Rails:請下載開源的 Ruby on Rails Web 框架。

      • Ruby:從該項目的 Web 站點獲得 Ruby。


      討論


      關于作者

      Bruce Tate 居住在得克薩斯州的首府奧斯汀,他是一位父親,同時也是山地車手和皮艇手。他是 3 本最暢銷 Java 書籍的作者,其中包括榮獲 Jolt 大獎的 Better, Faster, Lighter Java 一書,最近又出版了 Spring: A Developer‘s Notebook 一書。他在 IBM 工作了 13 年,現在是 J2Life, LLC 的創(chuàng)始人兼顧問。他潛心研究基于 Java 和 Ruby 的輕量級開發(fā)策略和架構。

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多