「Dear, you love me, you just don't know you love me」是美劇《老友記》經典台詞。對比:「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 中出現。推測 DNN 開發者一定學過 Lisp 等函數式語言。
模組位於 DotNetNuke_3.0.9\DesktopModules\HTML\HtmlTextController.vb`,非精選程式碼只是隨便找一個,這種單行函數在 DNN 非常多:
''' -----------------------------------------------------------------------------
''' GetHtmlText 從資料庫取得 HtmlTextInfo 物件
''' [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
在 Return 陳述式設斷點 F5 執行,順序:
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 分鐘再多看程式碼,定能半懂不懂。關鍵理解點:
DataProvider.Instance()` 取得資料庫提供者實例,單例模式。DNN 資料庫連接復用極有效,僅首次啟動建立(呼叫 CreateProvider()`),除非重啟機器或 5 分鐘以上未用資料庫連接,否則不再建立新連接GetHtmlText` 純業務邏輯層概念,執行單行:Return CType(SqlHelper.ExecuteReader(ConnectionString, DatabaseOwner & ObjectQualifier & "GetHtmlText", moduleId), IDataReader)`CBO` 為 DNN 精華,利用 .NET 反射機制動態同步資料庫回傳資料集與新生成 .NET 物件資料。對 .NET 物件無要求,資料庫回傳記錄需支援 IDataReader`。資料庫到物件賦值在 CBO.CreateObject`,反方向物件到資料庫未實現類似機制,採用類似 SqlHelper.ExecuteNonQuery(...)` 對應每類一機制,原因或因 .NET 類庫無 IDataWriter` 介面(HtmlTextInfo)Object`通用程式碼是否偏向動態?.NET 是否比 C/C++ 更偏好函數式編程手法?