过程编程到底是什么?与OOP有什么不同?它和函数式编程一样吗?


32

我正在使用非常面向对象(OO)的风格进行Java编程。OOP对我来说非常直观,但是我对其他种类的编程知识却很少。

过程编程到底是什么?与OOP有什么不同?它和函数式编程一样吗?

我曾经以为所有不是OO的程序都是程序性的。但是我开始认为这是不正确的。


9
分享您的研究成果对所有人都有帮助。告诉我们您尝试过的内容以及为什么它不能满足您的需求。这表明您已花时间尝试自我帮助,这使我们免于重复显而易见的答案,并且最重要的是,它可以帮助您获得更具体和相关的答案。另请参阅“ 如何提问
2014年

2
过程编程与功能编程不同。实际上,它与面向对象编程基本相同,只是减去了对象和类。
梅森惠勒

1
强制性OOP实际上过程编程,所以这正是您一直在做的事情
Ingo 2014年

Answers:


68

维基百科对这些术语有很好的解释。无论如何,以下是摘要:

  • 命令式编程将计算建模为一系列更改可变状态的语句
  • 过程式编程是命令式编程,它将代码分解为子例程。
  • 结构化编程是一种更严格的过程编程方法,它禁止任意跳转(例如goto)和全局状态更改。

  • 声明式编程与命令式编程相反-它指定要计算的内容而不是计算方式(例如SQL,正则表达式)。

  • 函数式编程将计算建模为(可能)产生值的表达式。函数是值,可以传递给其他函数或从其他函数返回。不鼓励突变。默认情况下,所有变量都是不可变的。结果,它比命令式更具声明性,因为它强调的是正在计算的内容,而不是实现它所需要的状态更改顺序。

  • 纯函数式编程完全禁止突变(尽管与流行的看法相反,仍然具有实现副作用的机制)。
  • 总体功能编程还禁止出现异常和无限循环。(数学中的总函数是为其所有输入返回值的函数。)

它们之间的关系有点复杂,因为OOP是一个非常繁琐的术语。您可以使用功能语言和过程语言中的对象,但是将自己宣传为OO的语言是过程性的。要进一步混淆问题:

  • 大多数人不知道对象和抽象数据类型之间的区别
  • 主流的OOP语言没有提及ADT,对其提供的支持很差,并且将对象称为“一种真实的方式”。
  • 没有人说过面向抽象数据类型的编程(因为这样做很愚蠢;您需要ADT和对象。)

这使人们认为OOP是实现抽象的唯一方法,而功能编程和OOP在某种程度上是对立的或互斥的。许多人还认为所有功能语言都是纯净的,不允许进行突变。

另外,人们通常会交替使用命令式/过程式命令,有时将其与OOP进行对比(这意味着更少的抽象代码,通常为C),有时将其与函数式编程进行对比。术语结构化程序设计大多下降了使用的,据我可以告诉(因为此时大多数人想当然地认为goto语句和全局被认为是有害的可能。)


3
“禁止跳跃”相当笼统;包括if / while / etc ..也许“禁止任意跳跃”?
Izkata 2014年

@Izkata好点,改变了。
2014年

1
实际上值得链接到Wikipedia条目。
haylem 2014年

这就是为什么它被称为“面向对象”而不是“仅对象”的原因。
JeffO

1
@OrangeDog与抽象数据类型有什么不同,抽象数据类型定义了一组封装的数据和可以作用于其上的函数?而且,您可以拥有不可变的对象,那么在那种情况下,状态是什么
Doval

12

过程编程是一种编程方法,它是许多其他语言设计(功能不一)的基本组成部分之一。

大多数语言都属于“过程编程”的范畴,对于大多数人来说,这可能是最自然的设计方法(如果您从面向对象的角度出发,那我就是少数派)。

BASIC是程序性的。

正如其他人所说,它是一种以顺序方式构造程序的机制。

  • 首先我做x
  • 第二我做
  • 第三我做Z

它需要一种定义“过程”的机制-类似于OO方法的命名代码块,可以接受零到许多参数,并可以选择返回一个值(通常将其称为函数-可能导致您对函数语言的困惑)

范式并不决定您要做的事情或事情的传递方式。

它仅描述了该程序将被构造为一系列以顺序方式运行的过程(或功能)。然后独立于过程定义数据。

这不同于面向对象的编程,后者围绕数据的集合和作用于该数据的方法(而非函数)构建程序。

考虑它的一种方法是根据数据范围。

在过程语言中,范围界定非常简单。变量可能在给定过程的范围内(在本地声明),直至调用事物的顶级事物(全局声明)的级别,并且它们之间嵌套了范围。

在面向对象的语言中,您添加了一个新的作用域上下文,即当前正在使用的对象的作用域上下文,它与上面的正交。

与面向对象相比,思考过程的另一种方法是考虑一种面向对象的语言,其中所有方法都必须声明为静态。结果是一种过程语言,其中可以使用类将过程分组在一起。


5

过程编程绝对不是功能编程。

过程编程是指当您将计算机模型当作一台机器,并且正在考虑它如何修改内存中的数据时。因此,首先A将值设置为3,然后再添加1并将其A再次存储在内存位置(覆盖先前的值)。

函数式编程可以说A是3,并且BA + 1,然后让计算机弄清楚如何计算B。定义后,A应该是不变的(不变的)。函数功能还允许您执行一些操作,例如将函数作为第一类值传递(函数可以将函数作为参数)。

面向对象的程序设计经常将两者结合起来,并且与两者正交。您可以使用函数式编程并返回一个不可变的对象,并且该对象可以具有一种方法,该方法可以返回一些计算值,甚至可以懒惰地返回它-这就是面向对象的函数式编程。您还可以有一个代表“存储库”(数据库的抽象版本)的对象,并且可以“存储”存储库中的内容并“取出”内容,然后让该对象处理执行此操作的所有详细信息。 。这基本上是面向对象的过程编程。


0

OOP只是过程编程的一种改进形式,它又属于命令式编程的更大家族。这种说法的证明是,许多C#/ Java程序员倾向于“做某事”,并且喜欢以下方法:

void doThisAndThat(....) { ... do something ... }

因此,该程序由一堆无效方法(以前称为过程(原文如此))和如下代码组成:

doThis();
if (state is that) doSomethingElse();
doThat();

是完美的过程编程。


doThisAndThat(....)暗示一种方法可以完成多项操作,而这通常不是一个好习惯。Java和C#开发人员大多遵循“单一责任原则”。我认为您的比喻有缺陷。 objectmentor.com/resources/articles/srp.pdf
JohnK 2014年

@JohnK我知道这不是好习惯。还是一个普通的。尤其是在Java开发人员中,是否可以通过人们每天对SO的看法来判断。
Ingo 2014年

@JohnK Java和C#开发人员大多遵循“单一责任原则” -Lip 服务?
Ingo 2014年

Java开发人员大多坚持单一职责吗?如果这在现实生活中是真的……
Sridhar Sarnobat 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.