编程范式之间的差异和相似之处

在过去的4年里,我一直在做开发人员,在大学学习软件开发之前的4年。 在我4年的行业中,我已经在VB6中做了一些工作(这是一个笑话),但大多数都是在C#/ ASP.NET中。 在此期间,我已经从“对象感知”程序范式转变为面向对象范式。

最近我对其他编程范例感到好奇,所以我想我会问其他开发人员他们对这些范例之间的相似点和不同点的看法,特别是OOP? 在OOP中,我发现人们非常关注概念之间的关系和逻辑交互。 对于其他范例,你必须有哪些思维框架?

到目前为止,编程范式的最佳解释可以在Peter van Roy的作品中找到。 特别是在Peter Van Roy和Seif Haridi 的“计算机编程概念,技术和模型 ”一书中。 ( 这是随附的wiki。 )CTM使用多范式Distributed Oz编程语言来介绍所有主要的编程范例。

彼得范罗伊也制作了这张惊人的海报,展示了34种主要范例及其在不同轴上的关系和位置 。 这张海报基本上是一个令人难以置信的压缩版CTM。 有关该海报的更全面的解释载于“ 傻瓜编程范例:每个程序员应该知道的内容”一文,该文章出现在G. Assayag和A. Gerzso编辑的“ 计算机音乐新计算范例 ”一书中。

另一本展示几种主要编程范式的好书是Harold Abelson和Gerald Jay Sussman 的计算机程序结构和解释 。 几十年来,这本书是麻省理工学院CS101的基础。 Abelson和Sussman自己教授的课程是在1986年为惠普公司培训时录制的 。

CTM和SICP​​之间的主要区别在于CTM使用支持它们的语言演示了大多数主要范例(主要是分布式Oz,还有其他一些)。 SICP OTOH通过在本地支持它们的语言(Scheme的一个子集)中实现它们来演示它们。 看到以十几行代码实现的面向对象是非常棒的。

您可以在麻省理工学院的OpenCourseWare网站上找到2005年春季课程的录像和课程资料 。 麻省理工学院短期ArsDigita大学项目的另一个课程录音 。 SICP也在其他大学教过,实际上它正在伯克利教授 。

就个人而言,我自己的经验是, 真正理解编程范式是可能的

  • 一次一个范式
  • 用语言强迫你进入范式

理想情况下,你会使用一种将范式扩展到极致的语言。 在多范式语言中,很容易“欺骗”并回归到您更熟悉的范例。 并且使用范例作为库只有像Scheme这样专门为这种编程设计的语言才有可能。 例如,在Java中学习惰性函数式编程并不是一个好主意,尽管有相应的库。

这是我最喜欢的一些:

  • 一般的面向对象 : 自我
    • 基于原型的面向对象 :自我
    • 基于类的面向对象 : Newspeak
      • 基于静态类的面向对象 : Eiffel
    • 基于多个派遣的OO : Dylan
    • function+面向对象 : Scala
  • 函数式编程 : Haskell
    • 纯函数式编程 :Haskell
      • 懒惰的纯函数式编程 :Haskell
    • 静态函数式编程 :Haskell
    • 动态函数式编程 : Clojure
  • 命令式编程 : Lua
  • 并发编程 :Clojure
    • 消息传递并发编程 : Erlang
  • 元编程 : 方案
  • 面向语言的编程 : Intentional Domain Workbench

这是我的看法:

  • 函数式编程意味着编写接收数据并对其进行操作的函数。 您通过组合函数来构建大型应用程序。
  • 面向对象的编程将数据及其操作符封装在一个组件中,可以很好地映射到心理模型。 您可以使用协作对象构建大型应用程序。
  • 声明性编程(例如,SQL)将完成的内容与其完成方式分开。 您告诉关系数据库您希望它做什么,并将驱动器留给查询引擎。

这个链接试图解释我在过去二十年中使用过的东西。 我之所以提到它是因为它有用,而且我认为它是一种范式,因为要使用它,你需要以特定的方式思考。

您必须考虑的不同方式是,在分析问题时,不是询问有哪些对象以及发生了什么操作,而是从总体要求开始并询问需要说什么?

从中,您可以选择或设计特定于域的语言(DSL),并以该语言陈述您的问题。

该链接解释了用于描述动态更改的对话框用户界面的特定语言。 它的实现取决于特定的控制结构,差异执行。 它实现的是源代码减少了一个数量级,编码错误的机会更少。 然后可以将这些节省用于使UI更复杂。

对于其他类型的问题,其他控制结构是合适的,但是通过精心选择的DSL工作,使源代码更小,更容易修改,更不容易出错的概念是常见的方法。

我认为函数式编程和OOP的范例最好通过识别它们最佳表达的问题类型来评估。 通常这些范式只是变成了带子,并被吹捧为万灵药,而不是通过他们解决的问题空间对它们进行分类。