我的FP感悟

FP概要: 我主要总结了以下5点:

函数是一等公民: 函数的参数是函数,返回值是函数,类型还是函数...

舍弃语句,拥抱表达式: 表达式就一定有返回值

无副作用: 不修改外部闭包的状态.

immutable: 没有变量,一切不可变,循环递归实现

引用透明: 程序的运行不依赖状态,不必包.

就以上几点,我编了一首打油诗:

函数编程很强大 一等公民都是它 外部变量不依赖 返回确保串行化

串行化什么意思呢?
同样计算(1+2)*3/4,java代码如下:

int a = 1 + 2 int b = a * 3 int c = b / 4

Scala写出来如下:

val r = subtract(multiply(add(1, 2), 3), 4)

如此,就可以很简单的改写为:

val r = add(1, 2).multiply(3).subtract(4)

其中的美妙自己体会吧~~~

那么这么做的意义呢?

代码简洁

接近自然语言

函数单纯,易于测试

immutable,并发简单可控

热升级

如果代码包含了任何的var,则是指令式风格,如果全是val则是函数式风格。

函数的结果类型是Unti的是有副作用的,而结果类型有明确返回类型的则是没有副作用的。

函数式编程的历史

有机会看到这篇文章的读者,大概都会知道阿兰·图灵(Alan Turing)和约翰·冯·诺伊曼(John von Neumann)。阿兰·图灵提出了图灵机的概念,约翰·冯·诺伊曼基于这一理论,设计出了第一台现代计算机。

由于图灵以及冯·诺伊曼式计算机的大获成功,历史差点淹没了另外一位同样杰出的科学家和他的理论,那就是阿隆佐·邱奇(Alonzo Church)和他的λ演算。

阿隆佐·邱奇是阿兰·图灵的老师,上世纪三十年代,他们一起在普林斯顿研究可计算性问题,为了回答这一问题,阿隆佐·邱奇提出了λ演算,其后不久,阿兰·图灵提出了图灵机的概念,尽管形式不同,但后来证明,两个理论在功能上是等价的,条条大路通罗马。

如果不是约翰·麦卡锡(John McCarthy),阿隆佐·邱奇的λ演算恐怕还要在历史的故纸堆中再多躺几十年,约翰·麦卡锡是人工智能科学的奠基人之一,他发现了λ演算的珍贵价值,发明了基于λ演算的函数式编程语言:Lisp,由于其强大的表达能力,一推出就受到学术界的热烈欢迎,以至于一段时间内,Lisp 成了人工智能领域的标准编程语言。

很快,λ演算在学术界流行开来,出现了很多函数式编程语言:Scheme 、SML、Ocaml 等,但是在工业界,还是命令式编程语言的天下,Fortran、C、C++、Java 等。

随着时间的流逝,越来越多的计算机从业人员认识到函数式编程的意义,爱立信公司于上世纪八十年代开发出了 Erlang 语言来解决并发编程的问题;
在互联网的发展浪潮中,越来越多的语言也开始支持函数式编程:JavaScript、Python、Ruby、Haskell、Scala 等。

可以预见,如果过去找一个懂什么是函数式编程的程序员很困难,那么在不久的将来,找一个一点也没听过函数式编程的程序员将更加困难。

面向对象编程

对于面向对象,我们已经再熟悉不过了,所以这里不做过多介绍,直接分析它的优缺点.

面向对象编程的优点

面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想(抽象现实世界),这与传统的思想刚好相反。

传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。

面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。

目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。

此外,支持者声称面向对象程序设计要比以往的做法更加==便于学习==(所以易于推广),因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。

同时它也是易拓展的,由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。

在面向对象编程的基础上发展出来的23种设计模式广泛应用于现今的软件工程中,极大方便了代码的书写与维护。

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

面向对象编程的缺点

(多并发问题)面向对象编程以数据为核心,所以在多线程并发编程中,多个线程同时操作数据的时候可能会导致数据修改的不确定性。

在现在的软件工程中,由于面向对象编程的滥用,导致了很多问题。

(冗余度大)首先就是为了写可重用的代码而产生了很多无用的代码,导致代码膨胀.

(难理解,难维护)同时很多人并没有完全理解面向对象思想,为了面向对象而面向对象,使得最终的代码晦涩难懂,给后期的维护带来了很大的问题。

(大型系统不适应)所以对于大项目的开发,使用面向对象会出现一些不适应的情况。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgygg.html