读编程范式游记有感

2018-11-08  本文已影响40人  梧上擎天

昨天趁着工作之余,看了左耳听风陈浩老师的《编程范式游记》系列文章,原文链接如下:https://time.geekbang.org/column/article/301。看完有一种把之前积攒的零散的知识点用一条线穿起来的感觉。
我是从大学接触的C,到工作开始写的java,页面撸的js,后来大数据要用到的scala和python,学完多种编程语言之后,看到的大多是各个语言中的差异,至于高级编程语言的相同点呢,似乎有那么一点点的感觉,但无法系统的总结出来,作者这个系列算是解惑了我的疑问,提升了眼界。我整理了一下笔记,因为无法体会全部内涵所以笔记大多为摘抄,希望大家订阅陈浩老师的内容进行学习。最后自己也突发了一些感想希望分享给大家。


个人感想

在我刚学习java的时候,学到“抽象”这个概念时一直觉得这未免太抽象了,现实世界如此现实干嘛需要这种抽象的定义“抽象”呢?我们可以使用举例子或者比喻来解释每个概念嘛。
随着我接触了不同的领域,像心理学、金融学、经济学、技术到了瓶颈期又开始学习数学,然后脑子就变的混沌了起来,觉得这世上要学的东西太多了,没有一点规律。
真的没有规律吗?过了几年再回过头看“抽象”这个概念,我发现每个领域的知识从无到有慢慢发展,发展发展着就会有一个趋势,那就是从具象到抽象的过程

比如人类的最先出现的语言,这其实就是具体事物的抽象化描述,我看到了一匹马,我在和别人讨论的时候,不必非要牵过来一匹马,而是可以用“马”这个字来代替,大家就都明白了。
数字也是一样,0这个数字就是“没有”的抽象。
艺术也是一样,古人从追求逼真的写真,到毕加索抽象派大家。

软件开发也是一样,不同语言之间目的抽象到最后,都是要用来解决问题的,解决什么?解决如何写出通用、优雅、可维护的高效代码。什么声明式,命名式,函数式,面向对象范式等实现的方式只是技术手段或者说是技术工具。
最后感想:“抽象”的看待问题,需要系统的看某个领域的发展史,只有看到从具象化到抽象化的过程,才有机会洞察发现到事情的本质。


笔记备忘

序言

编程语言发展到今天,出现了好多不同的代码编写方式,但不同的方式解决的都是同一个问题,那就是如何写出更为通用、更具可重用性的代码或模块

C语言起源

C语言是高级语言的起源,其他后续语言大多都能看到它的影子,但C对于范式来说,缺乏解决办法,只能用void*或者定义宏。这种方式太宽泛,直接操作内存,而且无法获取size。因为是操作内存的,所以操作非顺序型数据结构就会相当复杂。
整体上说C语言这样的过程式编程语言优点是底层灵活而且高效,特别适合开发运行较快且对系统资源利用率要求较高的程序

C++的泛型编程

C++的出现就是满足C语言满足不了的问题。例如

类型系统和泛型本质

程序语言的类型系统提供功能如下:

慢慢的世界出现两种类型的预言。一类是静态类型的语言也叫强类型语言,如C、C++、Java,一种是动态类型语言也叫弱类型语言,如Python、 PHP、 JavaScript等。

哪怕是可随意改变的变量类型的动态语言,我们在读代码的过程中也需要模拟出运行的类型。所以每种语言都需要有一套类型检查系统。静态语言的支持者会说编译器会帮我们找到这些问题,而动态语言的支持者则认为,静态语言的编译器也无法找到所有的问题,想真正提前找到问题只能通过测试来解决。其实他们都对。

要了解泛型的本质,就需要先了解类型的本质。

所以要做到泛型,我的理解就是进行标准化的规范:

我理解其本质就是 —— 屏蔽掉数据和操作数据的细节,让算法更为通用,让编程者更多地关注算法的结构,而不是在算法中处理不同的数据类型。

函数式编程

比C++更抽象的泛型方法。
对于函数式编程来说,其只关心, 定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的。
函数式编程有以下特点:

好处:

技术:

函数式编程关注的是: describe what to do, rather than how to do it。于是,我们把以前的过程式编程范式叫做 Imperative Programming – 指令式编
程,而把函数式编程范式叫做 Declarative Programming – 声明式编程

面向对象编程

函数式编程是没有状态的,如果想要有状态来保存数据,就需要用到面向对象的范式了。
面向对象编程是种具有对象概念的程序编程范型,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单
元,将程序和数据封装其中,以提高软件的可重用性、灵活性和可扩展性,对象里的程序可以访问及修改对象相关联的数据。在面向对象编程里,计算机程序会被设计成彼此相关的对象。

23个经典的设计模式,基本上就是说了两个面向对象的核心理念。

和函数式编程来比较,函数式强调于动词,而面向对象强调于名词,面向对象更多的关注于接口间的关系,而通过多态来适配不同的具体实现。

基于原型的编程范式

其本质也是面向对象的,但是没有class化,直接使用对象。以JavaScript举例,面向对象里面要有个Class。但是JavaScript觉得不是这样的,它就是要基于原型编程,就不要Class,就直接在对象上改就行了。基于编程的修改,直接对类型进行修改。

本质就是一种委托的方式

编程的本质

**Program = Logic + Control + Data Structure
是处理什么(logic),怎么做(control),沟通方式(数据结构)

所有的范式其实都是在处理上面这三个问题如:

如何分离control和logic呢?我们可以使用下面的这些技术来解耦。

有效地分离Logic、Control和Data是写出好程序的关键所在!

上一篇下一篇

猜你喜欢

热点阅读