仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1063|回复: 9
打印 上一主题 下一主题

[学习教程] ASP.NET网页编程之超出F#基本――事情流仓酷云

[复制链接]
海妖 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:28:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
有专家说:net网页编程不是跨平台,net网页编程就是平台,这很好的定义了net网页编程的特点。有了net网页编程,你只需要等待net网页编程平台在新平台上移植。这还不错吧!只是,net网页编程不是一个平台,而是多个平台。你需要在这个net网页编程平台移植到另一个net网页编程平台。系列文章索引:《超出F#基本
这篇文章是基于我之前为InfoQ撰写的名为《超出F#基本——举动形式》的文章,先容了别的一个新的言语特征——事情流。在F#的先容性书本,《F#基本》(2007蒲月,由Apress出书)的11章中先容了纵向言语编程体例——一种利用范畴特定言语(DomainSpecificLanguage,DSL)编写程序的手艺。这些DSL大概经由过程利用文本或XML代表详细代码的体例,来被自力完成。一般,DSL应当经由过程某种数据布局和表达DSL的言语的其他特征,被完整地嵌进到通用编程言语的外部。事情流是创建在F#现有的壮大纵向言语编程特征的基本上的一个特征。事情流同意你捕捉一小段代码来反省个中的内容,如许的特性使函数库完成者无机会把事情流用于完成DSL的程序模块——一品种似于C#3.0中的表达式树的手艺。在这篇文章中,我们将深切研讨一下F#中的事情流的事情道理。
F#是一个针对.NET框架的静态范例化函数式编程言语。它具有OCaml罕见的中心言语功效,和其他盛行的函数式编程言语的一些特征,并从良多其他编程言语猎取了一些头脑,包含Haskell、Erlang和C#。简而言之,这意味着F#是一个具有文雅语法的编程言语,当我们能交互式地实行代码的时分感到有点像剧本编程,可是它都是范例平安且有着优秀功能的编译言语。这篇文章不是F#的先容文章,不外收集上有良多资本可让我们简单地进修F#。能够参阅在我之前文章中的侧边栏所附加的一个“F#资本”列表。
创立事情流

事情流由两部分构成:用户界说的编排事情流实例的代码和界说事情流功效的函数库组件。让我们来看一个十分复杂的事情流例子:

<br>
这里,我们看到一个“script”事情流绑定到一个“num”标识符上。这个事情流由两个部分构成,一部分是包括在花括弧中的F#表达式,别的一部分是以“script”作为标识符的前缀——它可让人们懂得这个事情流的实践功效。如今让我们来看看函数基本布局是怎样让这个“剧本”事情的:

<br>
这个代码略微有点多。让我们一块一块的分隔,来看看它们各自是怎样与我们最后的剧本一同事情的。起首,范例界说界说了我们剧本的范例。在这里,剧本便是一个发生值的函数。我们新近界说的剧本“num”具有Script范例,这是因为它自己就是一个在实行时会天生一个整数值的函数(在这个例子中,这个整数值是42)。接上去,我们界说了一个名为“runScript”的函数用于实行剧本,其也用于界说“delay”来在剧本实行之前提早剧本的机关历程(如许,任何剧本中包括的负面影响城市在剧本被机关和实行时办理失落)。
这个函数组件的下一个次要部分是ScriptBuilder类。它界说了一些用于处置构成我们剧本的多个表达式的办法。这些表达式将被作为值交给这些办法处置。这里,“Return”和“Let”办法处置在这个剧本中的let和return操纵。更成心思的是let操纵。在let操纵中“printfn”函数被用于打印出参数的值——这意味着当剧本实行时,let操纵中的值被打印到了把持台上。这类体例关于匡助调试十分有效。最初,是失掉ScriptBuilder类的实例。在这个实例中,“Script”被用于“num”事情流中。以是当“num”剧本被实行时:
  1. runScriptnum
复制代码
以下内容输被出到把持台上:
  1. 221valit:int=42
复制代码
入手下手的两个值的实行let操纵被打印出来的值,前面的值是F#交互机制主动打印出的这个函数的实行了局和它的范例。
在事情流中,它不但能够处置惯例的F#表达式(如let操纵),正如后面所演示的,也能够新建表达式,如“let!”(发音为letbang)和“yield”,和其他的一些操纵。如许的特征为事情流供应了真正壮大的才能,同意函数库完成者创立这些关头字并付与它们新的意义。
如今,我们将扩大一下这个例子来把“let!”表达式也包括出去。假定我们不想把每一个let操纵的了局都打印到把持台,只想让必要的操纵被打印出来,则能够经由过程完成"let!"操纵来供应一种变通的办法,同意程序员选择哪些操纵被打印。上面是经由过程“ScriptBuilder”类中分外的办法来完成的,用于处置“let!”操纵的代码:

<br>
我们也必要对“Let”做一小点修正,删除打印到把持台的代码:

<br>
那末如今当我们界说和同意剧本的时分,我们能利用let!操纵来打印特定的let操纵实行了局到把持台上:

<br>
如今,只要21会被打印到把持台:
  1. 21valit:int=42
复制代码
F#编译器是怎样处置事情流和终极实行的表达式之间的转换历程的呢?这个历程能够被称作“反语法糖(de-sugaring)”,我们将鄙人一节重点报告它的事情道理。
了解De-sugaring

事情流中的表达式能够被转化为使用“一连传送的作风(continuationpassingstyle)”的数据布局,这一个历程就是所谓的“反语法糖”,绝对而言事情流就是一种“语法糖(syntacticsugar)”。
了解“反语法糖”这个观点的最好出发点仍是应当回到我们谁人复杂例子:

<br>
被转化成:

<br>
这类长处——不用手工键进这些布局——是不言而喻的。“加糖(sugared)”的版本比既难于了解又简单堕落的不加糖版本更短更简单了解和键进。比起一个原始的表达式,以这类情势完成表达式的长处是加倍的乖巧。重点要注重的是“Bind”和“Let”办法被挪用了。这些办法经由过程传进一系列参数而被挪用——let操纵作为第一个参数,接着以一个守候猎取值的函数作为第二个参数。如许话,就能够让我们能取巧打印出参数“p”并接着把它传送给“rest”函数持续举行盘算。在“Bind”办法的界说中能够看到以下代码:
  1. printfn"%A"prestp
复制代码
这是在F#事情流十分中心的机制。一连作风的传送历程同意开辟职员在一个值行将被赋值的时分拔出分外的举措。在我们的例子中,这些举措略微有点复杂,但这些举措能在守候异步盘算完成后被挪用,然后接着实行——这就是我们将在这个系列的下一篇文章中所要讲到的异步事情流。
序列事情流

迄今为止,从我们之前冗长的调试剧本已能够看到一些这类事情流非常浅易的用法。如今让我们来深切研讨使用序列事情流的一个更实在的例子。序列事情流是事情流的一品种型,它作为F#基类库的一个部分,能够便利地被利用。序列表达式关于创立汇合十分有效。比方,以下的序列表达式创立了一个具有前3个数的平方数和它们平方根的列表:
<br>
序列表达式的一个很有效的特征是它们能使用“yield”关头字,它被用来前往汇合中的值并持续举行盘算。比方,以下的代码读取一个文本文件来发生出每行内容,由此创立一个文本文件一切行的序列:

<br>
也能够在序列表达式中利用“yield!(发音为yieldbang)”关头字。这同意你增加一个序列元素到汇合里,以是它常常被用在递回序列表达式中。以下代码演示了怎样利用递回序列表达式来把WPF控件的树形数据布局“变平”为一个序列。假设你想把某些操纵使用于这个控件树形布局数据中的每项条目,这类体例就出格有效。

<br>
我们看到,在序列表达式的第一行上,我们发生了给这个汇合的第一个条目。接着,在这个序列表达式的下半部,我们使用一个轮回来列举每一个控件的子对象,并对这些子对象递回挪用“treeToList”办法。被前往的序列就是经由过程“yield!”关头字来放进到终极的汇合傍边,云云就把一个树“变平”为一个列表了。

<br>
分外浏览

在DonSyme、AdamGranicz和AntonioCisternino的著作《初级F#》(ExpertF#)一书中的第9章触及了事情流的更多细节。
总结

事情流是同意类库计划者创立具有伟大天真性的函数库的一个壮大手艺。不但F#程序员能够使用事情流来创立他们本人的DSL,并且从某种角度看,F#程序员使用事情流编写出的函数库也是很有出路的。序列事情流很有效,万万不成错过。在这个系列的下一篇文章中,将会报告异步事情流——别的一个事情流的立异使用,其能够简化.NET异步编程模子。
检察英文原文:BeyondFoundationsofF#-Workflows
来自:http://www.infoq.com/cn/articles/pickering-fsharp-workflow
c++是语言,其实C++和net网页编程的应用范围根本就不一样的。在net网页编程应用的领域内,c++是不合适的。所以微软才搞了C#和net网页编程对抗。
admin 该用户已被删除
沙发
发表于 2015-1-21 07:44:50 | 只看该作者
在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
海妖 该用户已被删除
板凳
 楼主| 发表于 2015-1-24 12:17:08 | 只看该作者
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
小魔女 该用户已被删除
地板
发表于 2015-1-28 19:56:09 | 只看该作者
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
莫相离 该用户已被删除
5#
发表于 2015-2-5 15:58:13 | 只看该作者
那么,ASP.Net有哪些改进呢?
活着的死人 该用户已被删除
6#
发表于 2015-2-6 02:14:54 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
若相依 该用户已被删除
7#
发表于 2015-3-4 10:45:52 | 只看该作者
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
爱飞 该用户已被删除
8#
发表于 2015-3-9 13:52:23 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
山那边是海 该用户已被删除
9#
发表于 2015-3-16 22:22:15 | 只看该作者
市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。
深爱那片海 该用户已被删除
10#
发表于 2015-3-23 04:48:13 | 只看该作者
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-19 15:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表