程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> DotNetNuke中的函數式編程手法分析

DotNetNuke中的函數式編程手法分析

編輯:關於ASP.NET

"Dear, you love me, you just don't know you love me"是美國肥皂劇FRIENDS中的經典台詞,中文翻譯為《老友記》或者《六人行》,比較一下這句:"Programmer, you use FP, you just don't know you use FP",句式上和邏輯上是不是很相似?

現在我想說說FP,Functional Programming,中文翻譯為函數式編程,與“命令編程”(例如 C、Pascal語言)中的慣常用法相對應,FP在和FORTRAN同樣古老的Lisp語言中首次出現,我接觸此概念在Python語言中(可愛的Python是相當好的專欄),現在我驚奇的發現它的一些慣用法又在VB.NET開發的DotNetNuke中出現。我猜測,寫出DotNetNuke的程序員一定學過Lisp等函數式編程語言。

來看看這個:

''' -----------------------------------------------------------------------------
''' GetHtmlText gets the HtmlTextInfo object from the Database
''' [cnurse] 11/15/2004 documented
''' -----------------------------------------------------------------------------
Public Function GetHtmlText(ByVal moduleId As Integer) As HtmlTextInfo
Return CType(CBO.FillObject(DataProvider.Instance().GetHtmlText(moduleId), &
GetType(HtmlTextInfo)), HtmlTextInfo)
End Function

模塊位於DotNetNuke_3.0.9\DesktopModules\HTML\HtmlTextController.vb中,我沒有精選代碼,只是隨便找了一個,這種只有一行代碼的函數在DNN總非常多。

函數式編程優點不說了,在可愛的 Python:Python 中的函數編程中說了很多了,缺點我認為就是太難理解,至少不直觀,也許是我命令式編程接觸的多有關吧,充分理解這種程序其實也簡單——單步調試,多花時間而已,不過要注意,按F11逐語句而不是F10逐過程,要不然一眨眼就執行過去了,也就沒得看了。

好了,這純粹是按鍵+記錄的體力活,在Return語句上設了斷點後,F5,GO!相應的執行順序為:

DataProvider.Instance()

SqlDataProvider.GetHtmlText(ByVal moduleId As Integer) As IDataReader

DotNetNuke.Common.Utilities.CBO.FillObject(ByVal dr As IDataReader, ByVal objType As Type) As Object

CType(CBO.FillObject(DataProvider.Instance().GetHtmlText(moduleId), GetType(HtmlTextInfo)), HtmlTextInfo)

好,執行完了,還是沒看懂?正常,因為你的閱讀速度太快了,如果你像我一樣,花了10分鐘走這個流程,然後再多看看代碼,一定就半懂不懂了,好了,無論如何,我還是有點懂了:

1.DataProvider.Instance()獲得的是數據庫提供者的一個實例,設計模式Singleton,我發現DNN的數據庫連接復用非常有效,有效的只有第一次啟動的時候會創建,也就是調用CreateProvider(),然後除非你重新啟動機器或者等待5分鐘以上不去使用數據庫連接,否則都不會再創建數據庫連接了。

2.GetHtmlText純粹的就是業務邏輯層中的概念,也是執行一行語句:

Return CType(SqlHelper.ExecuteReader(ConnectionString, DatabaseOwner & ObjectQualifier &
"GetHtmlText", moduleId), IDataReader)

ExecuteReader在Microsoft.ApplicationBlocks.Data.SqlHelper中,動態生成查詢,然後返回SqlDataReader,再轉型成IDataReader接口,值得一提的是Microsoft.ApplicationBlocks.Data沒有提供源代碼,原因嘛,DNN在文檔Data Access.doc中提到是enables us to upgrade the component seamlessly as new features/fixes become available,看不懂。

3.CBO是DNN中的精華,功能就是利用.NET中的反射機制,動態根據請求生成數據庫返回數據集同新生成的.NET對象之間的同步數據,對於.NET對象沒有任何要求,對於數據庫返回記錄要求支持IDataReader接口,其中數據庫到.NET對象賦值在CBO.CreateObject,然而方向相反的.NET對象到數據庫卻還沒有實現類似機制,采用的是類似

SqlHelper.ExecuteNonQuery(ConnectionString,DatabaseOwner & ObjectQualifier &
"UpdateHtmlText", moduleId, desktopHtml, desktopSummary, userID)
那樣的長長的對應每個類一個的機制,原因也許是.NET類庫沒有提供IDataWriter接口。

4.沒啥說的了,轉型而已,同C#中的(HtmlTextInfo)Object相同

通用的代碼是否偏向於動態?同C/C++平台相比,更動態.NET是否更多的偏好函數式編程手法?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved