DotNetNuke中的函数式编程手法分析

"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是否更多的偏好函数式编程手法?

时间: 2025-01-27 12:36:12

DotNetNuke中的函数式编程手法分析的相关文章

javascript函数式编程实例分析

  这篇文章主要介绍了javascript函数式编程,实例分析了javascript函数式编程的相关使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了javascript函数式编程.分享给大家供大家参考.具体分析如下: js像其他动态语言一样是可以写高阶函数的,所谓高阶函数是可以操作函数的函数.因为在js中函数是一个彻彻底底的对象,属于第一类公民,这提供了函数式编程的先决条件. 下面给出一个例子代码,出自一本js教程,功能是计算数组元素的平均值和标准差,先列出非函数式编程的一种写法

Fn.py:享受Python中的函数式编程

尽管Python事实上并不是一门纯函数式编程语言,但它本身是一门多范型语言,并给了你足够的自由利用函数式编程的 便利.函数式风格有着各种理论与实际上的好处(你可以在Python的文档中找到这个列表): 形式上可证 模块性 组合性 易于调试及测试 虽然这份列表已经描述得够清楚了,但我还是很喜欢Michael O.Church在他的文章"函数式程序极少腐坏(Functional programs rarely rot)"中对函数式编程的优点所作的描述.我在PyCon UA 2012期间的讲

javascript函数式编程实例分析_javascript技巧

本文实例讲述了javascript函数式编程.分享给大家供大家参考.具体分析如下: js像其他动态语言一样是可以写高阶函数的,所谓高阶函数是可以操作函数的函数.因为在js中函数是一个彻彻底底的对象,属于第一类公民,这提供了函数式编程的先决条件. 下面给出一个例子代码,出自一本js教程,功能是计算数组元素的平均值和标准差,先列出非函数式编程的一种写法: var data = [1,1,3,5,5]; var total = 0; for(var i = 0;i < data.length;i++)

F#入门:使用.NET Framework中的函数式编程技术

本文讨论: 安装 F# F# 语言基础 .NET 互操作性 异步 F# 本文使用了以下技术: .NET Framework, F# 目录 为什么要使用 F#? 安装 F# 您好,F# Let 表达式 关键字 For 管道 F# 也能够处理对象 异步 F# 与 F# 合作 作 为 Microsoft .NET Framework 家族的新成员,F# 提供类型安全.性能以及类似脚本语言的工作能力,所有这些都是 .NET 环境的一部分.此函数式语言由 Microsoft 研究院的 Don Syme 发

Python中的函数式编程

虽然人们总把Python当作过程化的,面向对象的语言,但是他实际上包含了函数化编程中,你需要的任何东西.这篇文章主要讨论函数化编程的一般概念,并说明用Python来函数化编程的技术. 我们最好从艰难的问题开始出发:"到底什么是函数化编程呢?"其中一个答案可能是这样的,函数化编程就是你在使用Lisp这样的语言时所做的(还有Scheme,Haskell,ML,OCAML,Mercury,Erlang和其他一些语言).这是一个保险的回答,但是它解释得并不清晰.不幸的是对于什么是函数化编程,很

Java经典类库-Guava中的函数式编程讲解

如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的API.Guava提供了很多的实用工具函数来弥补java标准库的不足,另外Guava还引入了函数式编程的概念,在一定程度上缓解了java在JDK1.8之前没有lambda的缺陷,使使用java书写简洁易读的函数式风格的代码成为可能. 下面就简单的介绍下Guava中的一些体现了函数式编程的API. Filter 我们先创

SCALA中的函数式编程

演示了值函数,匿名函数,闭包... 其它具体的应用,还得在生产当中吧.. 这个告一段落..其它SAM,CURRY,高阶函数,集合,泛型,隐式类..这些,还是找专门的书去深入了解啦... ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 C:\Users\hengheng>scala Welcome to Scala version 2.11.6 (Java

Guava 是个风火轮之函数式编程(2)

前言 函数式编程是一种历久弥新的编程范式,比起命令式编程,它更加关注程序的执行结果而不是执行过程.Guava 做了一些很棒的工作,搭建了在 Java 中模拟函数式编程的基础设施,让我们不用多费手脚就能享受部分函数式编程带来的便利. Java 始终是一个面向对象(命令式)的语言,在我们使用函数式编程这种黑魔法之前,需要确认:同样的功能,使用函数式编程来实现,能否在健壮性和可维护性上,超过使用面向对象(命令式)编程的实现? Predicate Predicate 接口是我们第二个介绍的 Guava

Guava 是个风火轮之函数式编程(1)

前言 函数式编程是一种历久弥新的编程范式,比起命令式编程,它更加关注程序的执行结果而不是执行过程.Guava 做了一些很棒的工作,搭建了在 Java 中模拟函数式编程的基础设施,让我们不用多费手脚就能享受部分函数式编程带来的便利. Java 始终是一个面向对象(命令式)的语言,在我们使用函数式编程这种黑魔法之前,需要确认:同样的功能,使用函数式编程来实现,能否在健壮性和可维护性上,超过使用面向对象(命令式)编程的实现? Function Function 接口是我们第一个介绍的 Guava 函数