聊聊编程范式
https://www.jianshu.com/p/172253b4cbbd
概述
编程范式一词最早来自 Robert Floyd 在 1979 年图灵奖的颁奖演说,是程序员看待程序应该具有的观点,代表了程序设计者认为程序应该如何被构建和执行的看法,与软件建模方式和架构风格有紧密关系。
现在主流的编程范式有三种:
结构化编程(structured programming):结构化编程,也称作过程式编程,或面向过程编程。
面向对象编程(object-oriented programming):将全局数据拆开,并将数据与其紧密耦合的方法放在一个逻辑边界内,这个逻辑边界就是对象。用户只能访问对象的 public 方法,而看不到对象内部的数据。对象将数据和方法天然的封装在一个逻辑边界内,可以整体直接复用而不用做任何裁剪或隐式关联。
函数式编程(functional programming):与结构化编程与面向对象编程不同,函数式编程对很多人来说要陌生一些。你可能知道,C++ 和 Java 已经引入了 Lambda 表达式,目的就是为了支持函数式编程。函数式编程中的函数不是结构化编程中的函数,而是数学中的函数,结构化编程中的函数是一个过程(Procedure)。函数式编程的起源是数学家 Alonzo Church 发明的 Lambda 演算(Lambda calculus,也写作 λ-calculus)。所以,Lambda 这个词在函数式编程中经常出现,你可以把它简单地理解成匿名函数。
非结构化编程:在使用低级语言编程的年代,程序员站在直接使用指令的角度去思考,习惯按照自己的逻辑去写,指令之间可能共享数据,这其中最方便的写法就是需要用到哪块逻辑就 goto 过去执行一段代码,然后再 goto 到另外一个地方。当代码规模比较大时,就难以维护了,这种编程方式便是非结构化编程。
函数式编程有很多特点:
- 函数是一等公民。一等公民的含义:(1)它可以按需创建;(2)它可以存储在数据结构中;(3)它可以当作参数传给另一个函数;(4)它可以当作另一个函数的返回值。
- 纯函数。所谓纯函数,是符合下面两点的函数:(1)对于相同的输入,返回相同的输出;(2)没有副作用。
- 惰性求值。惰性求值是一种求值策略,它将求值的过程延迟到真正需要这个值的时候。
- 不可变数据。函数式编程的不变性主要体现在值和纯函数上。值类似于 DDD 中的值对象,一旦创建,就不能修改,除非重新创建。值保证不会显式修改一个数据,纯函数保证不会隐式修改一个数据。当你深入学习函数式编程时,会遇到无副作用、无状态和引用透明等说法,其实都是在讨论不变性。
- 递归。函数式编程用递归作为流程控制的机制,一般为尾递归。
函数式编程还有两个重要概念:高阶函数和闭包。所谓高阶函数,是指一种比较特殊的函数,它们可以接收函数作为输入,或者返回一个函数作为输出。闭包是由函数及其相关的引用环境组合而成的实体,即闭包 = 函数 + 引用环境。
闭包有独立生命周期,能捕获上下文(环境)。站在面向对象编程的角度,闭包就是只有一个接口(方法)的对象,即将单一职责原则做到了极致。可见,闭包的设计粒度更小,创建成本更低,很容易做组合式设计。在面向对象编程中,设计粒度是一个 Object,它可能还需要拆,但你可能已经没有意识再去拆,那么上帝类大对象就会存在了,创建成本高。在函数式编程中,闭包给你一个更精细化设计的能力,一次就可以设计出单一接口的有独立生命周期的可以捕获上下文的原子对象,天然就是易于组合易于重用的,并且是易于应对变化的。
有一句化说的很好:闭包是穷人的对象,对象是穷人的闭包。有的语言没有闭包,你没有办法,只能拿对象去模拟闭包。又有一些语言没有对象,但单一接口不能完整表达一个业务概念,你没有办法,只能将多个闭包组合在一起当作对象用。
对于函数式编程,数据是不可变的,所以一般只能通过模式匹配和递归来完成图灵计算。当程序员选择将函数式编程作为思维底座时,就需要解决如何将领域问题映射到数据和函数(程序 = 数据 + 函数)。
1、简介
https://blog.csdn.net/woqutechteam/article/details/88101001
相信绝大部分开发人员、DBA都听过范式这个词,在MySQL中有第一范式、第二范式、第三范式、BCNF范式等,在开发中也有相应的范式,专业词汇叫编程范式(ProgrammingParadigm)。
与成百种编程语言相比,编程范式要少得多,共有27种范式。多数范式之间仅相差一个或几个概念,比如图中的函数编程范式,在加入了状态(state)之后就变成了面向对象编程范式。
不同的范式的出现,目的就是为了应对不同的场景,但最终的目标都是提高生产力。就如华山派的剑宗、气宗之别,剑宗认为“剑为主,气为辅”,而气宗则反之。每个范式都会有自己的”心法”,但最终殊途同归,达到至高境界后则是剑气双修。
范式就像武功心法,可以更快的练成绝世神功,但还是离不开基础功。代码也一样,通过遵循相关范式和良好的设计后,会带来可读性、扩展性和可维护性更好的代码,进而提升软件的质量。
2、理解
经典案例: 就是把大象装进冰箱,用面向过程的方法需要几步?
打开冰箱门 把大象装进冰箱 把冰箱门关上
案例: 面向对象编程把大象装冰箱
对象有大象和冰箱 大象 方法: 钻进冰箱 冰箱 方法: 打开和关闭
(一)命令式编程(英语:Imperative programming):又叫指令式编程,从名称上就很容易得知它的含义,就是告诉计算机如何到达目地的,一步一步地走,怎么走,如何走,全程“指导”。
举个例子,例如有一个String型的数组,里面包含了5个String对象,我们要把其中长度超过5的对象放入到另外一个数组中:
List<String> sList = new ArrayList();
sList.add("house");
sList.add("computer");
sList.add("phone");
sList.add("book");
sList.add("woman");
List<String> stringList = new ArrayList();
for (String v : sList) {
if (v.length() >= 5)
stringList.add(v);
}
(二)声明式编程(英语:Declarative programming):声明式编程跟命令式编程是对立的,它只告诉计算机应该做什么或想要什么样的结果,不关心具体怎么做,SQL,HTML,CSS都是属于声明式编程。
用SQL举例,把字段string的长度超过5的都列出来
select * from arraylist where length(string) >= 5
用HTML举例,展示一个按钮,按钮名称是CLICK ME,宽度为10
上面举的两个例子中可以看出,声明式编程的特点,告诉计算机一些"指标",给我符合这些"指标'的结果,而不指导怎么做。
(三)函数式编程(英语:Functional programming):这个范式比前面两种理解起来稍微难一些,总的来说就是把函数作为第一类对象(第一等公民),让函数像其他类型参数一样,可以复制给其他变量,也可以作为参数来传递,还能作为别的函数的返回值等等。支持函数式编程的语言:JavaScript,Java(从8开始支持,Lamda表达式的引入),Python等。
举一个最常见的例子,这里用javascript来描述:
var paintColor = function(color) { console.log(color); };
var colors = ["red", "blue", "green"];
colors.forEach(paintColor);
3、一等公民
《维基百科》 第一类对象(英语:First-class object)在计算机科学中指可以在执行期创造并作为参数传递给其他函数或存入一个变数的实体[1]。将一个实体变为第一类对象的过程叫做“物件化”(Reification)[2]。 可以被存入变数或其他结构 可以被作为参数传递给其他函数 可以被作为函数的返回值 可以在执行期创造,而无需完全在设计期全部写出 即使没有被系结至某一名称,也可以存在 比如我们熟悉的几类类型char,int ,浮点型
那么我们知道不能全部满足的那肯定就是第二对象,比如数组,数组不能作为函数的返回值,其实我们将数组作为返回值,本质上是将数组转换为指针返回,但是,结构体却是第一类对象,所以你可以将结构体作为返回值。
http://blog.sina.com.cn/s/blog_13c5941e50102yxxd.html
在 Python 中,一个整数、一个字符串、一个列表、一个字典和一个元组都是对象,而会让从 C/C++ 或者 Java 语言转过来的人意外的是,Python 中的函数也是对象。因为一个函数和常见的整数、字符串等”公民“一样,都是对象,可以在运行时创建,并能被赋值给变量,作为集合对象的元素,还能够作为函数的参数和返回值[1],因而我们称『Python 中函数是一等公民』,意思是 Python 中的函数和整数、字符串等常见概念的地位是平等的,一个整数和一个字符串等对象可以干的事,一个函数也可以办到。而究其原因,Python 中的函数之所以是一等公民,则是因为 Python 中的一切都是对象,也就是『Everything in Python is an object』,整数、浮点数、字符串、列表、字典、元组、函数、类本身、类型本身以及模块等都是对象。因为都是对象,所以 Python 中的函数才和整数、字符串、列表、字典和元组等对象的地位是平等的,成为了“一等公民”。下面,我将按从两个方面进一步解释『Python 中函数是一等公民』的含义,一是 Python 中的一切都是对象,二是不同对象行为的相似性。