這篇專題最早出現在 Ben Forta 的專欄 (ColdFusion Developer's Journal 裡面), 這是經過 Coldfusion Developer’s Journal 的許可而轉載的。
Macromedia 公司的 ColdFusion MX有許多新技術, 其中一項功能我覺得在各位的日常開發裡將常會(甚至是必須) 用到, 即 ColdFusion 的元件功能。在接下來的幾個月, 我將會深入解釋 ColdFusion 元件的概念, 以及它的使用技巧。
下載範例程式:
由於本文多處與範例程式相關, 建議下載範程式, 並用您習慣的開發工具開啟。
瞭解 CFC 之前最重要的是物件的概念。
首先必須知道—CFML 不是物件導向語言, 而且 CFC 沒有提供所有物件導向程式語言所應有的功能。這不是一件壞事, 因為物件導向語言牽涉到許多外來屬性, 語法規則上也過於複雜, 但對於使用 CFML 這類快速開發語言的開發人員來說, 沒道理不能使用物件導向技術, 所以有了 CFC, 它的誕生可以說是為了簡化一些程式設計上對 OOP 的需求。
為了簡單易用, 也為了避開純粹物件導向程式中遇到的一些惱人的問題, CFC 中的物件只是簡單的做到在程式中重覆利用。就像黑盒子一樣, 不管您如何設計它, 別人都不需要知道您是怎麼設計它的, 但卻可供人使用。聽起來有點像自訂標籤, 的確CFC與自訂標籤之間有蠻多相似之處, 但 CFC 的功能比自訂標籤來得更加強大。比如說它們通常不僅包含標籤與函數, 還可以包含任何資料, 允許完整地封裝資料與任何程式存取。物件通常有多個方法 (method), 它提供自動進行初始化的機制, 而且不需要入口 (例如 Java 裡的 main()), 物件可以被轉接及修改, 現有的程式碼都可以用繼承的方式自動結合, 不必真正動手去更改原始碼。
如果聽起來很深奧, 那下面的例子有助於理解。
幾乎所有的 ColdFusion 開發者都有處理使用者的經驗, 您可能必須做下列這些事情:
<CFQUERY7> 去驗證使用者提供的帳號和密碼。在做這些事情的時候, 在您的程式碼當中有多少地方是用來查詢使用者當時的狀態, 有多少程式碼是重複 (或複製貼上) 的?當使用者資料欄位被改變了, 您的程式碼有多少需要修改呢?如果是您的使用者資料表將被 LDAP 伺服器取代, 或者新的使用者規則和新的使用者等級條件必須寫到程式裡呢?對於那些不是寫程式的設計師們來說, 需要對用戶管理功能瞭解到什麼程度, 才能利用現有的程式來簡單地做出用戶歡迎介面?
在物件的世界裏, 您可以編寫截然不同的程式, 您可以建立使用者物件—一個「黑盒子」, 把所有功能都放在裡面, 包含任何跟使用者相關資料庫 (或 LDAP) 的存取動作。當使用者在操作時, 您需要建立一個關於這個使用者物件的實體, 或許需要指定這個使用者的 ID, 如此您就可以使用這個物件的所有方法 (函數) 例如常見的:
或是其他特殊的方法, 例如:
設計的概念是: 所有使用者請求的處理都放在使用者物件中處理, 您不用直接存取使用者資料表, 實際上也沒有必要知道資料存放在哪裡, 重要的是您只要知道如何呼叫您需要的元件的方法, 其餘的事情全交給元件去完成。
以上就是 CFC 功能的簡單舉例。
現在您應該知道什麼是 CFC 了, 讓我們一起來看看他們是怎麼建立的, 首先請確認 ColdFusion 的服務正常運作。建立 CFC 的步驟充分表現了 ColdFusion 的宗旨: 非常容易!只要兩個步驟就可以完成:
這四個新標籤是:
<CFCOMPONENT>: 定義新元件<CFFUNCTION>: 在元件中定義函數<CFARGUMENT>: 定義傳入函數的參數<CFRETURN>: 使函數回傳結果雖然這些功能類似在 CFMX 中建立自訂標籤與自訂函數, 但不同於自訂標籤與自訂函數的是, 在元件中您可以使用任何標籤、函數、自訂標籤、元件…等。
Listing 1 (看範常式式碼) 有一些簡單的例子讓大家更暸解 CFC, 這是一個驗證瀏覽器用的 CFC, 用於辨識使用者的瀏覽器種類。
這個檔案的名字是 browser.cfc, 它就是一個 CFC。在 CFC 元件裡, 所有程式碼是被包在 <CFCOMPONENT> 和 </CFCOMPONENT> 之中。這個元件自己本身有一個單獨的函數 isIE(), 是使用 <CFFUNCTION> 來命名、定義的。在這個函數中有一個變數被定義為 result, 如果瀏覽器的識別字包含了 Microsoft Internet Explorer 這樣的字串, 這個變數就會被設定為 “YES”, 並使用 <CFRETURN> 返回 result 這個變數。
這個並不是完整的例子 (雖然它可以使用), 但這是好的開始。
要如何來使用這個 CFC 呢?把它儲存為 browser.cfc 並在相同的目錄下建立一個 test.cfm 的檔, 包含以下程式碼:
<!--- 呼叫 browser CFC --->
<CFINVOKE COMPONENT="browser"
METHOD="IsIE"
RETURNVARIABLE="result_ie">
<!--- 顯示到畫面上 --->
<CFOUTPUT>
Your browser is:<BR>
IE: #YesNoFormat(result_ie)#<BR>
</CFOUTPUT>
<CFINVOKE> 是 CFMX 的新標籤, 它的作用就是用來執行 CFC 裡面的方法 (method), 並取得傳回的資料。RETURNVARIABLE 代表得到回傳的資料時, 要將它放到哪個變數裏面。
您可以嘗試執行這段程式碼, 當您在 IE 與其他瀏覽器中執行它, 會得到不同的結果。
現在您應該熟悉 CFC 工作的方式了, 接著看 Listing 2, 這是完整版的 browser.cfc。這個版本的 cfc 有點複雜, 現在的 <CFCOMPONENTS> 包含了四個方法:
您可以注意到我們在每個函數中增加了兩個新屬性。
RETURNTYPE: 指定傳回資料的類型, 用來驗證傳回的資料(如果是錯誤的類型, 將提示錯誤)。HINT: 當這個 CFC 自動產生說明文件的時候, 會用這個字串來敘述這個函數的功能。(等一下會解釋得更詳細)在簡單版的 browser.cfc 中, 程式碼去驗證 CGI 變數 HTTP_ USER_ AGENT 以便判斷是否為該瀏覽器, 但這並不是很好的做法, 因為這些函數應該要能驗證任何傳入的字串, 而不是永遠驗證當時的瀏覽器。因此這新的函數加了參數定義 <CFARGUMENT>, 有兩種不同的設定方式:
REQUIRED="yes" 若指定參數不存在, 將顯示錯誤訊息。TYPE, 則會對傳入參數的內容進行檢查, 讓傳入的參數必須符合指定的格式。REQUIRED="no", 您可以對參數指定一個預設值。在四個函數中, <CFARGUMENT> 都定義了 browser 參數, 允許傳入任何資料類型, 如果參數沒有提供預設值, 則使用預設的 CGI 變數。
前三個函數基本上都跟前面看到的相同, 但第四個函數跟前面比起來就有較大的不同。第四個函數不像前三個函數, 各自驗證一種特定的瀏覽器, 而變成是一次驗證三種瀏覽器。它的做法是將瀏覽器字串當成參數傳入前三個函數, 並將瀏覽器縮寫傳回給呼叫這個函數的程式碼。這比複製前三個函數的程式碼到這個函數裡面好多了, 這個函數直接使用前三個函數, 且不是用 <CFINVOKE>, 而是直接把它們當成函數呼叫就可以了, 語法簡單明瞭。
Listing 3 檔名為 test.cfm, 用來測試 browser.cfc 中所有的方法。
在 CFC 的宣告裡面, 有用到 HINT 和 RETURNTYPE 來撰寫一些說明, 那麼這些說明資訊會出現在哪裡呢?原來CFC可以自動產生自我描述檔, 這種自我描述檔可以讓我們知道每個函數是做什麼用的, 以便快速完成開發。
有兩種方法可以檢視 CFC:
HINT 和 RETURNTYPE 等)。<CFINVOKE> 標籤。其實還有更多的資訊要介紹, 但礙於篇幅, 這裡就不再繼續往下寫。
CFC 在簡單的CFML中展示了強大的物件應用能力, 如您所見, 可以使用四個新標籤來建立CFC, 另存為 .cfc檔, 並使用 <CFINVOKE> 標籤呼叫它。但我們僅在此提到了基本的內容, 迄今我們學會 CFC 的作用只比自訂標籤的能力強一點點而已, 下個月將向您介紹多種 CFC 的呼叫方式、如何使 CFC 持續、如何在 CFC 中使用結構和繼承等等。