技术交流QQ群【JAVA,.NET,BigData,AI】:170933152

本文主要讲述了三种编程范式——面向对象编程、函数式编程、泛型编程的概念

编程范式

编程范式是程序语言背后的思想。代表了程序设计者认为程序应该如何被构建和执行的看法。常见的编程范式有:过程式,面向对象,函数式,泛型编程等。

一些编程语言是专门为某种特定范式设计的,例如C语言是过程式编程语言;Smalltalk和Java是较纯粹的面向对象编程语言;Haskell是纯粹的函数式编程语言。另外一些编程语言和编程范式的关系并不一一对应,如Python,Scala,Groovy都支持面向对象和一定程度上的函数式编程。C++是多范式编程语言成功的典范。C++支持和C语言一样的过程式编程范式,同时也支持面向对象编程范式,STL(Standard Template Library)使C++具有了泛型编程能力。支持多种范式可能是C++直到现在仍然具有强大的生命力的原因之一。

Swift是一门典型的多范式编程语言,即支持面向对象编程范式,也支持函数式编程范式,同时还支持泛型编程。Swift支持多种编程范式是由其创造目标决定的。Swift创造的初衷就是提供一门实用的工业语言。不同于Haskell这类出自大学和研究机构的学术性质的编程语言。苹果推出Swift时就带着着明确的商业目的:Mac OS和iOS系统的主要编程语言Objective-C已显老态,Swift将使得苹果系统的开发者拥有一门更现代的编程语言,从而促进苹果整个生态圈的良性发展。

Swift的设计和开发无不体现着“实用的工业语言”这一目标。这决定了Swift无法做极端的语言实验,它需要在理智地面对现实的基础上,谨慎地寻求突破。这就决定了Swift需要继承历史遗产,照顾现在大多数程序员的现实需求,同时面向未来有所发展。

面向对象-继承遗产

面向对象编程将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

面向对象编程的核心概念:

  • 多态,指由继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应;
  • 继承,在某种情况下,一个类会有“子类”。子类比原本的类(称为父类)要更加具体化;
  • 封装,面向对象程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。

以对象构建程序的基本单元的面向对象编程语言中。多态提供了更高的抽象能力,使得我们可以设计出更通用的程序。继承提供了一种复用代码的方法。封装提供一种使用其他代码更为便捷安全的机制。

现在绝大部分程序员的工作语言仍然是面向对象编程语言。大部分流行的现代编程语言都会允许你创建对象。使用面向对象编程语言,易于构建软件模型。因为,对象很类似乎很容易和现实世界上的所有事物和概念。但编程实践表明,并不是任何东西成为对象都是一件好事情。举一个Java中的蹩足的例子:Java中只有对象才能作为参数传入函数(当然还有原始类型primitive type)。所以为了将函数传递给另外一个函数,你需要将函数包裹在一个对象中,通常会用一个匿名类,因为这个类不会有其他作用,只是为了让Java的一切皆为对象的设计高兴。

Java拥有纯粹的面向对象概念。它从设计之初,就希望以一切皆为对象的纯对象模型来为世界建模。但发展到现在,Java中加入了越来越多非对象的东西。引入了闭包,从而获得了函数式编程中的一级函数;引入泛型,从而获得了参数化的类型。这可能暗示了,这个世界是如此得丰富多彩,使用单一模式为世界建模并不会成功。

函数式编程-发展

函数式编程是一种以数学函数为编程语言建模的核心的编程范式。它将计算机运算视为数学函数计算,并且避免使用程序状态以及可变对象。

函数式编程思想主要有两点:

  • 以函数为编程语言建模的核心;
  • 避免状态和可变性。

函数是函数式编程的基石。函数式编程语言的代码就是由一个个函数的组合而成的。编写函数式语言的过程就是设计函数。大规模程序由成千上万的函数组成,为了有效的组合这些函数。函数式编程语言,会尽量避免状态,避免可变对象。没有可变的状态,就使得函数式语言中的函数变为了纯函数。纯函数更容易模块化,更容易理解,对于复用是友好的。

函数式编程语言也产生了一些有用的编程工具:

  • 一级函数,闭包;
  • 柯里化函数;
  • 惰性求值。

这些在后面的章节里都会提到。这些编程工具也越来越多地出现在其他编程语言中。

函数式编程语言并不年轻,它的历史和面向对象编程一样悠久。1958年被创造出来的LISP是最古老的函数式编程语言。它比C语言年代更为久远。但直到最近函数式编程思想才逐渐被重视。几乎所有新发明的编程语言都或多或少受到了函数式编程思想的影响。Python,Scala,Groovy,Swift都有一级函数,闭包。使得你可以将函数直接传给另外一个函数,函数也能够以返回值形式被另一个函数返回。消除状态,提供不变性的好处越来越多被接受,Scala,Groovy,Swift都提供了方便地声明不可变对象的方法,以支持你编写更趋近于函数式的风格的代码。

函数编程语言有其优秀的地方,也许将来会成为一个重要的编程范式。但是,函数式编程语言的重要性可能更多会体现在影响其他编程语言的发展上。未来,可能很难出现一门主要以函数式编程范式设计的编程语言成为主流的编程语言。如同Java这样的以单一编程范式(面向对象)构建,而成为主流的编程语言的机会应该不多了。而如同Haskell这样追求纯粹的函数式编程语言,更多的可能只是一个偏学术的语言实验。

再重复一次上一节的提到理由,这个世界是如此得丰富多彩,使用单一模式为世界建模并不会成功。

面向对象与函数式编程

如果,我们按语言范式给现在流行的语言分类。支持面向对象的编程语言应该会是最长的队伍。现在大部分流行的现代编程语言都是面相对象的,它们都会允许你创建对象。但同时,你会发现比较流行的几个编程语言,Python,Scala,甚至Java都或多或少得受到了函数式编程语言的影响。它们都引入一些函数式编程的概念,让你一定程度上可以编写出具有函数式风格的代码。

在熟悉了类面向对象编程语言之后,再接触函数式编程语言,常常会觉得耳目一新,甚至会隐约觉得函数式语言是救世良方。那我们是否应该就此彻底转向函数式编程语言呢?使用Haskell拯救世界。

面向对象编程语言在大规模实践之后,我们确实更深刻地了解了它们的缺点(例如,难以编写多线程环境下的软件应用;继承并不是代码复用的好方法)。函数式语言也确实有不少优点,有些优点恰恰就能解决面向对象语言的问题(纯函数十分适应多线程环境,纯函数天生就是模块化的,对于代码复用十分友好)。但是,函数式编程也许也存在某些问题。而这些问题,可能在更大规模的业界实践之后才会暴露出来。现在我们已经可以确信,单纯以对象为世界建模是有困难的。那么以数学模型来为世界建模可能也并不会好到哪里去。可以确信的是,它们都有自己擅长的领域和环境。我们现在仍然还无法使用某种编程范式来解决所有问题。

而更大的现实是无数企业已经在面向对象编程语言上做了巨大的投资,即使现在面向对象编程已经暴露出一些问题,而函数式编程又呈现出不少能解决这些问题的优点,任何一个谨慎的人都不会,也不可能马上抛弃面向对象编程,彻底全面地转向函数式编程语言。

现实的选择是支持面向对象编程的同时,提供函数式的支持。这样,在大部分面向对象游刃有余的地方,你仍然可以使用面向对象的方法。而在适合函数式编程的地方,而你又拥有函数式编程的思维和能力时,你还是可以函数式的编程方法改善生产力。

泛型编程-美好的点缀

泛型编程是另外一个有趣的话题。泛型为程语言提供了更高层级的抽象,即参数化类型。换句话说,就是把一个原本特定于某个类型的算法或类当中的类型信息抽象出来。这个抽象出来的概念在C++的STL(Standard Template Library)中就是模版(Template)。STL展示了泛型编程的强大之处,一出现就成为了C++的强大武器。除C++之外,C#,Java,Haskell等编程语言都引入了泛型概念。

泛型编程是一个稍微局部一些的概念,它仅仅涉及如何更抽象地处理类型,即参数化类型。这并不足以支撑起一门语言的核心概念。我们不会听到一个编程语言是纯泛型编程的,而没有其他编程范式。但正因为泛型并不会改变程序语言的核心,所以在大多数时候,它可以很好的融入到其他的编程方式中。C++,Scala,Haskell这些风格迥异的编程语言都支持泛型。泛型编程提供了更高的抽象层次,这意味着更强的表达能力。这对大部分编程语言来说都是一道美味佐餐美酒。

在Swift中,泛型得到广泛使用,许多Swift标准库是通过泛型代码构建出来的。例如Swift的数组和字典类型都是泛型集。这样的例子在Swift中随处可见。

总结

这几篇系列文章中,将主要以Swift为例,讲解多范式编程语言。系列文章分为三部分讨论Swift所支持三种编程范式:

  • 面向对象编程范式
  • 函数式编程范式
  • 泛型编程

工作资讯004---多范式编程语言相关推荐

  1. 【note】编程范式(编程范型)的含义和种类,多范式编程语言

    范型 / 范式 = 模式.方法 编程范式 / 编程范型 = 编程的模式.风格 编程范式主要包括:结构化编程.面向对象编程.过程式(程序式)编程.函数式编程(泛函编程).指令式(命令式)编程.泛型编程. ...

  2. Scala是多范式编程语言

    Scala 3 稳定版来了 Scala是一门现代的多范式编程语言,旨在以简练.优雅及类型安全的方式来表达常用编程模式.它平滑地集成了面向对象和函数语言的特性. Scala是面向对象的:Scala是一个 ...

  3. python好找工作吗2017-2017学什么编程语言好找工作?

    学热门的语言虽然钱(前)景好但不一定好找工作.拿最近热门的前端javascript和java语言找工作来说,他们具有以下几个劣势. 1. 因为热门,每个岗位投递人数绝对能吓死你,没有超强的能力或学历, ...

  4. 高效率完成工作的12种热门编程语言,你会用几个?

    编程语言不仅仅面向程序员.如果你是网络工程师.系统管理员.存储管理员或其他基础设施专业人员,知道一种(或两三种)编程语言,都能在工作中派上用场. 软件定义基础设施正在迅速进入数据中心,为了管理这种基础 ...

  5. 工作资讯001---行业思维模式及经典语录随时更新

    JAVA技术交流QQ群:170933152 01 Alan Kay曾谈起为何Lampson能在如此广泛的领域取得建树--与普通人不同,在Lampson眼中,并不存在软件与硬件,或者编程语言与操作系统, ...

  6. 大数据之_数据采集Flume_架构---Flume工作笔记004

    然后我们来看flume的基础架构 可以看到,其实就是,web server等产生了日志数据,比如一个日志文件,然后 这个日志文件,会被作为source数据源,这个数据源是一个日志文件,也可以是一个端口 ...

  7. Error: EBUSY: resource busy or locked, lstat ‘D:\DumpStack.log.---基于Vue的uniapp手机端_前端UI_uview工作笔记004

    这个错误:很气人: To install it, you can run: npm install --save element-china-area-data Error from chokidar ...

  8. 组件注册_使用_命名规则_以及Nacos中给每个服务配置访问前缀---SpringCloud Alibaba_若依微服务框架改造---工作笔记004

    使用某个组件,比如我要使用: components文件夹中的Rouyi这个文件夹下的组件的话, import RouYiGit from '@/components/Rouyi/Git' import ...

  9. webpack打包样式资源_使用loader去打包css文件_打包less文件---webpack工作笔记004

    然后我们再来看看,怎么用webpack打包css资源文件, 因为我们知道webpack可以直接处理js,json文件,但是不能直接处理css文件,img文件对吧.. 我们现在,通过webpack的组件 ...

最新文章

  1. 项目中使用oracle序列
  2. linux下mkdir头文件_Linux部分常用命令学习记录
  3. 在消费女性身材焦虑上,大码女装和BM风没有本质区别
  4. 图像处理之直方图均衡MATLAB代码实现
  5. 2021 NOI游记
  6. SpringBoot内嵌Tomcat原理剖析
  7. Java学习——Servlet是什么
  8. java 三次样条插值_java – 三次样条插值的正确实现
  9. bindingResult
  10. 国内外主流的三维GIS软件集锦
  11. rasp 系统_浅谈RASP技术攻防之基础篇
  12. Python爬取58同城租房数据,完美解决字体加密
  13. OpenCV-文字绘制cv::putText
  14. Oracle数据库的数据备份
  15. WindowsMessage
  16. 横向打印二叉树 java_按树状横向打印二叉树
  17. linux 查看网卡连接网线,查看网卡是否连接网线
  18. 值得回味的文章:2004非主流搜索经济不完全盘点(转载)
  19. 前端渲染10w条数据
  20. rust睡觉按键没反应_腐蚀Rust实用技巧大全 Rust新手上手指南

热门文章

  1. Java中SQL语句传向数据库
  2. (二)ubuntu使用launchpad.net线上编译
  3. 最方便的字符设备驱动的写法
  4. 一文详解LDA主题模型
  5. 毕设日志——tensorboardX无法连接的问题
  6. 吴恩达深度学习4.2练习_Convolutional Neural Networks_Residual Networks
  7. windows安装mysql-8.0.12-winx64和Navicat客户端连接(亲测有效)
  8. 李彦宏纳猛将,技术才是百度的未来
  9. Oracle数据库的启动与关闭
  10. 建立网站的全套流程与详细解释(转载)