在过去的 4 年里,我一直作为一名开发人员工作,而在此之前的 4 年是在大学学习软件开发。在我从事该行业的 4 年中,我在 VB6 中做过一些工作(这是一个笑话),但大部分都是在 C#/ASP.NET 中完成的。在此期间,我已经从“对象感知”过程范式转变为面向对象的范式。
最近我对那里的其他编程范式很好奇,所以我想我会问其他开发人员他们对这些范式之间的异同的看法,特别是对于 OOP?在 OOP 中,我发现非常关注概念之间的关系和逻辑交互。对于其他范式,您必须采用哪些思维框架?
到目前为止,对编程范式的最佳解释可以在 Peter van Roy 的作品中找到。特别是在Peter Van Roy 和 Seif Haridi的《计算机编程的概念、技术和模型》一书中。(这里是配套的 wiki。) CTM 使用多范式分布式 Oz 编程语言来介绍所有主要的编程范式。
Peter van Roy 还制作了这张惊人的海报,展示了 34 个主要范式及其在各个轴上的关系和位置。海报基本上是一个令人难以置信的 CTM 压缩版本。关于该海报的更详尽的解释包含在文章Programming Paradigms for Dummies: What Every Programmer Should Know中,该文章作为一章出现在由 G. Assayag 和 A. Gerzso 编辑的《计算机音乐的新计算范式》一书中。
另一本展示几种主要编程范式的好书是Harold Abelson 和 Gerald Jay Sussman的计算机程序结构和解释。几十年来,这本书是麻省理工学院 CS101 的基础。1986 年,Abelson 和 Sussman 自己教授的一门课程被记录在惠普公司的一次企业培训中。
CTM 和 SICP 之间的主要区别在于,CTM 使用支持它们的语言(主要是 Distributed Oz,但也有一些其他)展示了大多数主要范式。SICP OTOH 通过以一种本机不支持它们的语言(Scheme 的一个子集)实现它们来演示它们。看到在十几行代码中实现的面向对象真是太棒了。
您可以在 MIT 的 OpenCourseWare 网站上找到 2005 年春季课程的视频记录和课程资料。麻省理工学院短暂的 ArsDigita 大学项目的课程的另一个录音。SICP 也在其他大学教授过,事实上它现在正在伯克利教授。
就个人而言,我自己的经验是,真正理解编程范式是可能的
理想情况下,您会使用一种将范式发挥到极致的语言。在多范式语言中,很容易“作弊”并退回到您更熟悉的范式上。并且只有在像 Scheme 这样专门为这种编程设计的语言中才能真正使用范例作为库。例如,在 Java 中学习惰性函数式编程并不是一个好主意,尽管有一些库可以做到这一点。
这是我最喜欢的一些:
这是我的看法:
好吧,这个链接试图解释我在过去二十年里使用过的东西。我提到它是因为它被证明是有用的,而且我认为它是一种范式,因为要使用它,你需要以特定的方式思考。
你必须思考的不同方式是,在分析问题时,不要问有什么对象和发生了什么动作,而是从总体需求开始,问需要说什么?
从中,您选择或设计一种领域特定语言 (DSL),并用该语言陈述您的问题。
该链接解释了一种用于描述动态变化的对话用户界面的特定语言。它的实现依赖于特定的控制结构,差分执行。它完成的是源代码减少了一个数量级,编码错误的机会更少。然后可以将这些节省用于使 UI 更加复杂。
对于其他类型的问题,其他控制结构是合适的,但通过精心挑选的 DSL 工作的概念,使源代码更小、更容易修改、更不容易出错,是常见的方法。
我认为函数式编程和 OOP 的范例最好通过确定它们是最佳表达的问题类型来进行评估。通常,这些范式只是成为潮流,被吹捧为万灵药,而不是按照它们解决的问题空间对它们进行分类。