`

Web编程是函数式编程

阅读更多

任何一位在两个领域里——本地应用程序和Web应用程序——都做过长期开发的人都会告诉你,web应用开发和传统的应用开发有很大的不同。这指的并 不是编程语言。同样用Java,或者是Python,甚至C++,你既能开发本地应用,也能开发出web应用。不同之处在于web的载体介质。它体现出的 是一种完全不同的部署和运行环境。它实现了一种不同的服务模式。它使用的是一种不同的应用架构。它需要程序员采用一种不同的思维方法,因为web编程所体 现出的哲学体系跟我们传统的编程派系都相去甚远。在此,对于web编程范式,我们有一些有趣的事情需要去认识清楚。虽然很明显,很真实,但却被现代强势的 编程范式的阴影遮蔽着,被眩目的新技术和工具的光芒淹没了。

“究竟是什么?” – 你会问。

 

我们就来看看。

我们从看看典型的本地应用程序的生命周期开始,拿它跟典型的Web应用程序的相比较。我将会一直使用“生命周期”这个词来表示应用程序的活动周期,运行时的,指的不是包括不同开发和维护阶段的项目周期。

一个典型的本地应用程序的生命周期是什么样子的?一个用户启动这个程序,程序被加载到内存里,开始运行。它能对用户的输入起反应,从磁盘上读取文 件,或通过网络传输数据。它能跟其它的软件或硬件进行交互,调用其它服务,或响应一个外部调用。它可以收集数据,累计数据,以某种方式处理这些数据。简言 之,这些都是一个本地应用程序启动后,运行时能做的事情。

一个典型的web应用程序的生命周期是什么样的呢?用户在浏览器里点击一个链接。浏览器向web服务器发送一个请求,然后会接收到响应信息,把它展 示给用户。非常的简单。但应用程序并非是运行在用户机器上的浏览器中的。它运行在web服务器中。在那里,应用并不是持续的运行。服务器只是短暂使应用苏 醒来完成处理请求的任务,准备好要回复的东西。这些事情发生在眨眼之间。在两个请求之间应用并不处于运行状态。它只是被调用很短的一段时间,当完成请求服 务后会立即停止运行。而且应用也不会被整个的加载到内存里,只会加载对于目前的任务真正有必要的部分。你可以认为web应用程序只有一个瞬时的生命期。只 有它的运行所在的环境,也就是web服务器在持续的运行。事实上会有一些变通的策略,例如session和数据序列化,来帮助在应用程序的生命期之间保持 数据,来模仿有状态的操作,例如某些框架,像ASP.NET的WebForms或JSP就是这样做的,但毕竟,这都是些技术上的技巧,跟本文所讨论的问题 不相干。我们关注的是普通的web应用,关注它们处理请求的过程。这些web应用程序都只享有一个非常短暂的运行存在状态。

对于开发本地应用程序,有很多技术被证明非常有用。面向对象的方法可以用来构造问题环境,帮助降低问题的复杂性。一些设计模式能体现出一种高效的, 而且优雅的设计方案。分层的架构把代码责任分离,最小化各层的依赖性。这些全是典型的最佳方案,它们在开发本地应用程序的过程中被充分的证实过。

而在web应用程序里对这些技术方案的使用却是另外一种不同的情形了。我们积极的使用面向对象的方法来定义我们的业务模型,我们采用各种设计模式, 我们实现分层架构。这些帮助我们提高代码质量,增加复用性,把应用程序组织成概念上的各个模块。这些都很有效,是我们最常用的技术路线。但即使如此,我还 是忍不住要提醒你,这些东西看起来有些多余,有大炮打蚊子的感觉。时不时我会盯着这些精巧而且深思熟虑的代码,一种无由的想法会袭上我的心头:干嘛不把这 些全都剥离掉,直接做要做的事情呢?

什么是直接做?想想一个应用处理一个请求的典型处理方式。在主要步骤里发生了什么?应用程序接收用户输入,校验它,把它转换成业务领域相关的格式, 把它传进一个SQL语句里,保持到数据库里。下面又发生了什么?程序从数据库里读出一些数据,格式化信息,使之能够被用户识别,以一段HTML的形式返回 给用户使用。就是这样。这就是大多数web应用程序在其幕后所做的事情。在它们的运行期里没有什么特别的对象,它们发送和接收消息,智能的在其内部交互运 作来实现高层的行为。不,只是一些数据在用户和数据库之间旅行,送出去,返回来。就是一个接一个的数据流。实现这些任务的程序代码本质上就像一个函数式程 序,不管它们被构造出来的风格是什么样的。

有个讨论直指这个主题: Is functional programming relevant to web development? 其中一个雄辩的用户写道:

“函数式编程跟web应用开发非常的匹配。web应用接收一个HTTP请求,生成一个HTML返回结果。这应当被认做是一个从请求到页面的函数式功能。”

而我要补充下面的东西。实现这些功能的代码本质上反映的就是函数式的风格。我们并没有用真正的对象把应用程序的状态保存在内存里、用它们来实现应用 逻辑操作,我们使用的是数据库来保存应用程序的状态,整个的代码基本上就是一个巨大的,复杂的函数式功能编码,它来管理特定数据流的走向:数据库或用户。

从这些讨论我们能得到什么?狂热的强制使用面向对象的风格、对web应用使用复杂的架构未必总会有好处。你不一定就能从这种架构方式中获得有价值的 好处,但从性能和日后维护的角度看,它们却能使你的应用过于复杂和效能低下。我们必须针对每个项目的各自情况来掂量采用某种方式的好处和坏处。

当一个程序员编写一个web应用程序,如果突然代码中显示出了函数式编程风格的印记时,不要马上批评和嘲笑他。也许他是特意这样做的。也许这是一种敏锐的感觉到web编程本身就是天生的函数式编程的潜意识表现。

 

[英文出处]:Web programming is functional programming

[译文来源]:外刊IT评论

分享到:
评论

相关推荐

    Functional-Magic-Book:函数式编程入门书籍《函数式魔法学》书稿

    Functional-Magic-Book函数式编程入门书籍《函数式魔法学》...cc是什么抽象语法树type rich programmingRust语言中的生命周期系统在工程中的各种实践函数式编程下的Web服务器实践Parser与Parser CombinatorsGUI编程与

    完整版 Python高级开发课程 高级教程 03 Python函数和函数式编程.pptx

    【Python高级开发课程 高级教程】课程列表01 Python语言开发要点详解.pptx02 Python数据结构.pptx03 Python函数和函数式编程.pptx04 Python面向对象编程.pptx05 Python数据采集 网络爬虫 网页爬虫.pptx06 Python操作...

    mojo编程语言.docx

    它被设计为一种简洁、灵活且易于学习的语言,具有许多现代编程语言的特性,如动态类型、函数式编程、以及面向对象编程等。下面是关于Mojo编程语言的一些介绍: 1. **简洁易读的语法**:Mojo采用了简洁易读的语法,...

    Python 核心编程 第二版.mobi

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

    Python 核心编程 第二版.pdf

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

    Python 核心编程 第二版.azw3

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

    python3 教程 (python基础、python进阶、函数式编程、面向对象、面向对象高级、python高级应用、标准库、p

    人工智能数学基础pdfpython3 教程 (python基础、python进阶、函数式编程、面向对象、面向对象高级、python高级应用、标准库、python web、网络爬虫、数据分析、机器学习、人工智能)

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    函数式编程概念和应用 集合容器 基于分析列表集合源码体系 基于分析地图集合源码体系 IO流机制 IO流核心模块及基本原理 曼编程 线程的创建方式与生命周期 线程核心机制,基础概念扩展 多线程并发访问,同步控制 ...

    Javascript函数式编程简单介绍

    几十年来,函数式编程一直是计算机科学狂热者的至爱,由于数学的纯洁性和谜一般的本质, 它被埋藏在计算机实验室,只有数据学家和有希望获得博士学位的人士使用。但是现在,它正经历一场复兴, 这要感谢一些现代语言...

    scala编程中文pdf

    第9章函数式编程214 第10 章集合242 第11 章列表、数组、映射、集及其他315 第12 章文件和进程367 第13 章Actors 和并发401 第14 章命令行任务440 第15 章Web 服务.475 第16 章数据库和持久化510 第17 章与Java 交互...

    python编程设计.docx

    Python编程设计的另一个重要方面是函数式编程(FP),这是一种编程范式,它将计算视为函数的求值过程。Python中的函数是一等公民,可以作为参数传递、返回值返回、赋值给变量等。Python中的lambda表达式、map、...

    Python核心编程第二版(英文)

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、 Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

    Python核心编程代码

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

    Python核心编程第二版PDF

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

    Python 核心编程 第二版

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、 Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

    Python核心编程 第二版

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

    Python 核心编程

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、 Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

    purescript-from-scratch:这是一个全面而实用的教程,可让人们学习Purescript,而无需任何函数式编程方面的经验

    从零开始的Purescript 全面而实用的教程,使人们无需具备任何函数式编程经验即可学习Purescript。为什么选择Purescript Purescript太神奇了! 这是一种非常强大的语言,可以编译为Javascript,并为您提供构建超级,...

    Python核心编程(第二版)

    阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、 Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等...

Global site tag (gtag.js) - Google Analytics