编程范式列表

本文中介绍的编程范例的列表:

  • 结构化编程
  • 函数式编程
  • 面向对象编程
  • 面向数据的编程
  • 可组合编程
    • 依赖注入
  • 声明式编程
  • 自上而下与自下而上
  • 极简主义与极简主义
  • 自适应编程
  • 渐进式软件开发
  • 自我驱动的开发
    • 简历驱动的开发
    • 偏好驱动的开发
    • 因为我这么说驱动的开发

结构化编程
结构化编程(SP)是最基本的编程范式。结构化编程是关于如何编写可读的代码,例如使用变量和方法名称、如何使用函数、for + while 循环、递归等。结构化编程还教授如何在没有某些语言中的 GOTO 指令的情况下进行编程。结构化编程有时也称为过程式编程。“过程”是函数的另一种说法。在某些语言(例如 Pascal)中,函数和过程之间的区别在于函数返回值,而过程则不返回值。

函数式编程
函数式编程 (FP) 是一种范例,它教导使用函数将应用程序构造为调用其他函数的函数。函数被认为是第一类“对象”或“数据”,这意味着函数可以作为对象/数据传递,然后在需要的地方和时间被调用。函数可以在运行时由其他函数组合而成。函数不能有副作用。在处理元素集合或数组时,递归优于迭代。函数式编程还有很多内容,但在这里涵盖所有内容会占用太多篇幅。

面向对象编程
面向对象编程 (OOP) 是一种将属于同一类的数据和函数分组的范例。类内的函数通常称为方法。类可以扩展(继承)其他类,从而继承其部分或全部数据和功能。一些 OOP 语言也有接口,以及其他特性,如特征、值类等。

面向数据的编程
面向数据的编程是一种用于需要高速处理大量数据的应用程序的范例。例如,计算机游戏或实时分析应用程序通常需要快速处理大量数据。处理大量数据的最快方法是在 RAM 或磁盘(最好是 SSD)中顺序访问数据。因此,面向数据的编程将大量数据保存在 RAM 或磁盘中的大块中,以便可以顺序处理。这与面向对象编程不同,在面向对象编程中,应用程序的对象可以分散在整个 RAM 中,并且您通常无法控制每个对象在 RAM 中的确切位置。

可组合编程
可组合编程是一种强调将软件拆分(分解)为更小的可组合单元的范例。在函数式编程中,这些单元是明确设计为可与其他函数组合的函数。在面向对象编程中,这些单元是明确设计为可与其他对象组合的对象。此外,组合 OOP 往往会违反一些经典的 OOP 原则,例如封装、“has-a / is a”规则或“对象应该知道如何 XYZ”规则。

依赖注入
顺便说一下,依赖注入是一种非常常用于实现组件动态可组合性的技术。动态可组合性与静态可组合性相反。在静态可组合性中,总的组合是硬连线在代码中的。在动态可组合性中,可以在运行时配置(有时重新配置)组合 - 例如,通过将不同的依赖项注入到组件中。

声明式编程
声明式编程是一种使用仅说明必须 做什么的语法编写代码的风格,而不是说明应该如何完成。声明式编程语言通常具有与命令式编程语言(例如 C、C#、Java、JavaScript 等)显着不同的语法。

声明性编程语言通常是为更特定领域的逻辑而设计的 - 例如查询数据库 (SQL)、表达状态 (JSON / YAML) 或表达网页的组成 (HTML)。对于那些特定领域的用例,声明性编程语言通常非常有用。

然而,作为一个应该应用于一般所有编程问题的通用范式,我更加持怀疑态度,正如我在声明性妄想中更详细地表达的那样。

自上而下与自下而上的设计
自顶向下和自底向上设计是开始设计软件的两种不同方法。自上而下的设计意味着从整个系统的“顶部”开始,首先将系统分解为更大的部分,然后将每个部分分解为更小的部分。这个过程递归地进行,直到达到最小的合理部分。

自下而上的设计意味着首先确定最小的合理部分,然后递归地向上处理较大的部分,直到到达组件结构的顶部,从而开始设计过程。

在实践中,您通常会同时进行一些自上而下的设计和一些自下而上的设计,具体取决于您正在设计的部分以及您处于软件生命周期的哪个阶段(早期/中期/晚期)。

极简主义与极简主义设计
极简主义和极简主义设计是确定应用程序、框架、工具包或组件功能范围的两种不同方法。极简主义方法是最小化软件的范围和责任,使软件变得小而集中——通常只关注单一职责。最大化方法是解决尽可能多的问题,这意味着拥有尽可能多的功能。

极简主义方法通常(但并非总是)用于范围较小的组件,无论是在较大的软件系统内还是在工具包或框架内。最大化方法更常用于

自适应编程
自适应编程是一种范式,您的设计选择适合您的具体需求,而不是源自严格的 FP 或 OOP 等学说。您的需求驱动设计。当给定的设计满足您的需求时,该设计就足够好了。这并不意味着一种设计是唯一可以满足您的需求的设计。多种设计可能会满足您的需求。在它们之间做出选择取决于您 - 确定哪一个除了满足您的需求之外还能给您带来最大的好处。然而,满足您的需求是自适应编程中最基本的要求。

自适应编程还可以使软件设计适应您的项目环境。小型代码库不需要与大型代码库一样多的结构。短期存在的代码库不需要与存在多年或几十年的代码库一样多的结构。具有单个开发人员(您)的代码库不需要与具有数百或数千开发人员的代码库一样多的结构。随着项目环境的变化,设计也应该适应当前的环境。这就是我在进化软件开发中所说的“设计重新调整” 。

渐进式软件开发
渐进式软件开发是一种从最小可行产品(MVP) 开始一次开发一个版本的软件的范例。从 MVP 中,一次添加一个版本的小功能集,只要对项目有意义,就尽快添加。随着软件的发展,设计应该根据当前的设计需求重新调整 - 正如上面“自适应编程”中提到的那样。我在演化软件开发中更详细地描述了 演化软件开发。

在渐进式软件开发中,我们尽量不为明天而设计,而只是为今天而设计。显然,如果您提前知道您的需求很快就会改变,并且确切地知道如何改变,并且知道稍后更改设计将需要大量工作,那么提前设计一些交付可能不是一个坏主意。但我们不会为了“我们未来可能得到的需求”而进行推测性设计。我们只为今天而设计,而我们确信不久的将来将会到来。

自我驱动的开发
自我驱动开发是一种范式,其中软件项目的设计选择是为了满足开发人员的自我,而不是为了满足项目的需求。自我驱动开发有几个子类别,例如简历驱动开发和偏好驱动开发。

自我驱动的开发很少会带来出色的软件设计 - 但有时确实如此 - 如果所选的设计实际上与项目非常匹配(有时确实会发生)。

简历驱动的开发
在简历驱动的开发中,开发人员选择他们认为在简历上看起来不错的工具和设计。事件驱动架构和Kafka火吗?很酷 - 我们也将在这里使用事件驱动架构和 Kafka。

偏好驱动的开发
偏好驱动开发是一种根据开发人员的个人偏好选择工具和设计的范例。我喜欢函数式编程的开发人员可能只使用函数式编程技术。对性能有浓厚兴趣的开发人员可能会坚持要求系统的所有部分都进行高度性能优化,即使这对于给定项目来说不是必需的。

因为我这么说驱动的开发
一些开发人员的自我意识非常强烈,以至于他们必须始终在几乎所有代码的设计中留下自己的印记。他们会争论自己的想法、设计和流程——不是因为它们对项目有很大意义——而是因为他们需要在某种程度上感觉自己比团队其他成员“优越”。好吧,这可能有点夸张——但你明白了。这就是我所说的“因为我这么说”驱动的开发——因为一旦你开始深入研究他们的推理——一切似乎都会以“因为我这么说”结束——而不是在合理的首要原则上。