我正在使用非常面向对象(OO)的风格进行Java编程。OOP对我来说非常直观,但是我对其他种类的编程知识却很少。
过程编程到底是什么?与OOP有什么不同?它和函数式编程一样吗?
我曾经以为所有不是OO的程序都是程序性的。但是我开始认为这是不正确的。
我正在使用非常面向对象(OO)的风格进行Java编程。OOP对我来说非常直观,但是我对其他种类的编程知识却很少。
过程编程到底是什么?与OOP有什么不同?它和函数式编程一样吗?
我曾经以为所有不是OO的程序都是程序性的。但是我开始认为这是不正确的。
Answers:
维基百科对这些术语有很好的解释。无论如何,以下是摘要:
声明式编程与命令式编程相反-它指定要计算的内容而不是计算方式(例如SQL,正则表达式)。
函数式编程将计算建模为(可能)产生值的表达式。函数是值,可以传递给其他函数或从其他函数返回。不鼓励突变。默认情况下,所有变量都是不可变的。结果,它比命令式更具声明性,因为它强调的是正在计算的内容,而不是实现它所需要的状态更改顺序。
它们之间的关系有点复杂,因为OOP是一个非常繁琐的术语。您可以使用功能语言和过程语言中的对象,但是将自己宣传为OO的语言是过程性的。要进一步混淆问题:
这使人们认为OOP是实现抽象的唯一方法,而功能编程和OOP在某种程度上是对立的或互斥的。许多人还认为所有功能语言都是纯净的,不允许进行突变。
另外,人们通常会交替使用命令式/过程式命令,有时将其与OOP进行对比(这意味着更少的抽象代码,通常为C),有时将其与函数式编程进行对比。术语结构化程序设计大多下降了使用的,据我可以告诉(因为此时大多数人想当然地认为goto语句和全局被认为是有害的可能。)
过程编程是一种编程方法,它是许多其他语言设计(功能不一)的基本组成部分之一。
大多数语言都属于“过程编程”的范畴,对于大多数人来说,这可能是最自然的设计方法(如果您从面向对象的角度出发,那我就是少数派)。
BASIC是程序性的。
正如其他人所说,它是一种以顺序方式构造程序的机制。
它需要一种定义“过程”的机制-类似于OO方法的命名代码块,可以接受零到许多参数,并可以选择返回一个值(通常将其称为函数-可能导致您对函数语言的困惑)
范式并不决定您要做的事情或事情的传递方式。
它仅描述了该程序将被构造为一系列以顺序方式运行的过程(或功能)。然后独立于过程定义数据。
这不同于面向对象的编程,后者围绕数据的集合和作用于该数据的方法(而非函数)构建程序。
考虑它的一种方法是根据数据范围。
在过程语言中,范围界定非常简单。变量可能在给定过程的范围内(在本地声明),直至调用事物的顶级事物(全局声明)的级别,并且它们之间嵌套了范围。
在面向对象的语言中,您添加了一个新的作用域上下文,即当前正在使用的对象的作用域上下文,它与上面的正交。
与面向对象相比,思考过程的另一种方法是考虑一种面向对象的语言,其中所有方法都必须声明为静态。结果是一种过程语言,其中可以使用类将过程分组在一起。
过程编程绝对不是功能编程。
过程编程是指当您将计算机模型当作一台机器,并且正在考虑它如何修改内存中的数据时。因此,首先A
将值设置为3,然后再添加1并将其A
再次存储在内存位置(覆盖先前的值)。
函数式编程可以说A
是3,并且B
是A + 1
,然后让计算机弄清楚如何计算B
。定义后,A
它应该是不变的(不变的)。函数功能还允许您执行一些操作,例如将函数作为第一类值传递(函数可以将函数作为参数)。
面向对象的程序设计经常将两者结合起来,并且与两者正交。您可以使用函数式编程并返回一个不可变的对象,并且该对象可以具有一种方法,该方法可以返回一些计算值,甚至可以懒惰地返回它-这就是面向对象的函数式编程。您还可以有一个代表“存储库”(数据库的抽象版本)的对象,并且可以“存储”存储库中的内容并“取出”内容,然后让该对象处理执行此操作的所有详细信息。 。这基本上是面向对象的过程编程。
OOP只是过程编程的一种改进形式,它又属于命令式编程的更大家族。这种说法的证明是,许多C#/ Java程序员倾向于“做某事”,并且喜欢以下方法:
void doThisAndThat(....) { ... do something ... }
因此,该程序由一堆无效方法(以前称为过程(原文如此))和如下代码组成:
doThis();
if (state is that) doSomethingElse();
doThat();
是完美的过程编程。