Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 面向对象编程背后的理论_Oop - Fatal编程技术网

Oop 面向对象编程背后的理论

Oop 面向对象编程背后的理论,oop,Oop,Alonzo Church的lambda演算是函数语言背后的数学理论。面向对象编程有一些形式化的理论吗?我想看看维基百科的OO页面,里面有原则、基本原理和历史 我的理解是,随着90年代GUI走向主流,各种语言中的特性和思想最终形成了一种进化过程。但我可能大错特错 编辑:更有趣的是,人们仍然在争论“是什么使OO语言OO”。我不确定定义OO语言的功能集是否得到普遍认可。OOP是一个混合的功能包,不同的语言以稍微不同的方式实现。OOP没有单一的形式化定义,但许多人试图基于声称是面向对象的语言的共同特性

Alonzo Church的lambda演算是函数语言背后的数学理论。面向对象编程有一些形式化的理论吗?

我想看看维基百科的OO页面,里面有原则、基本原理和历史

我的理解是,随着90年代GUI走向主流,各种语言中的特性和思想最终形成了一种进化过程。但我可能大错特错


编辑:更有趣的是,人们仍然在争论“是什么使OO语言OO”。我不确定定义OO语言的功能集是否得到普遍认可。

OOP是一个混合的功能包,不同的语言以稍微不同的方式实现。OOP没有单一的形式化定义,但许多人试图基于声称是面向对象的语言的共同特性来描述OOP。来自维基百科:

Benjamin Cuire Pierce和其他一些研究人员认为,任何将OOP提取到最小功能集的尝试都是徒劳的。尽管如此,他还是确定了在大多数面向对象语言中支持OOP编程风格的基本功能:

  • 动态分派–在对象上调用方法时,对象本身通过在运行时在与对象关联的表中查找方法来确定执行的代码。该特性将对象和抽象数据类型(或模块)区分开来,抽象数据类型(或模块)对所有实例的操作都有固定(静态)实现。这是一种编程方法,它提供了模块化组件开发,同时又非常高效
  • 封装(或多方法,在这种情况下,状态保持分离)
  • 亚型多态性
  • 对象继承(或委托)
  • 开放递归–一个特殊变量(语法上可能是关键字),通常称为this或self,它允许一个方法体调用同一对象的另一个方法体。这个变量是后期绑定的;它允许在一个类中定义的方法调用后来在其子类中定义的另一个方法

我遇到过一个关于强定义和约束子类型的正式定义是。这当然不是面向对象编程的全部,但它可以作为开发中正式基础的一个链接。

阿巴迪和卡德利已经写过,你可能想研究一下。另一个解释是古老的TAPL(IIRC,它们在类型化的lambda演算中将对象作为递归记录进行处理)。我真的不太懂这些东西。

面向对象是心理学而不是数学。

如果你仔细想想,它更像人类的工作方式,而不是计算机的工作方式。 我们认为我们将对象分类。例如,这张桌子是一种座椅家具

以Jean Piaget(1896-1980)为例,他致力于儿童认知发展理论的研究。 说:

皮亚杰在计算机科学和人工智能领域也有相当大的影响

他发现的一些认知概念(暗示着面向对象的概念):

分类根据共同特征将对象分组的能力

类包含比简单分类更高级的理解,即某些类或对象集也是较大类的子集。(例如,有一类物体被称为狗。也有一类物体被称为动物。但是所有的狗也是动物,所以动物的类别包括狗)


阅读更多内容:皮亚杰的发展理论

关于Petri网呢?对象可能是一个地方、一个组成部分、一个弧、消息和标记。我还没有对它进行透彻的思考,所以可能有一些我不知道的缺陷,但是你可以调查——有很多与Petri网相关的理论工作

例如,我发现:

  • 可读PDF:
    • 历史(简化)是这样的:

      首先是spagetti代码。 然后是过程代码(如C和Pascal)。 然后是模块化代码(就像在modula中一样)。 然后是面向对象的代码(如smalltalk中的代码)

      面向对象编程的作用是什么

      只有回忆起历史,你才能理解

      起初,代码只是给计算机的一系列指令(字面上是二进制表示) 然后是宏汇编程序。带助记符的指令。 然后人们发现有时候你的代码会被重复。 所以他们创造了后藤。但是GOTO(或分支或跳转等)不能返回到调用它的位置,不能给出直接返回值,也不能接受形式参数(必须使用全局变量)。 针对第一个问题,人们创建了子例程(类似GOSUB)。可以重复调用并返回调用位置的指令组。 然后人们发现,如果例程有参数并且可以返回值,那么它们会更有用。 为此,他们创建了函数、过程和调用约定。在称为堆栈的抽象之上调用的那些抽象。 堆栈允许形式参数、返回值和所谓的递归(直接或间接)。 有了堆栈和函数被任意调用(甚至是间接调用)的能力,就有了过程编程,解决了GOTO问题。 但随后出现了大型项目,以及将过程分组为逻辑实体(模块)的必要性

      在这里,您将了解面向对象编程的发展原因

      当您有一个模块时,您就有了模块局部变量

      想想这个:

      Module MyScreenModule;
      
      Var X, Y : Integer;
      
      Procedure SetX(value : Integer);
      Procedure SetY(value : Integer);
      
      End Module.
      
      有X和Y变量是该模块的局部变量。在这个例子中,X和
      Var Screens :  Array of Record X, Y : Integer End;
      
      Procedure SetX(ScreenID : Integer; X : Integer);
      Procedure SetY(ScreenID : Integer; Y : Integer);
      
      Class MyScreenModule;
      
      Field X, Y : Integer;
      
      Procedure SetX(value : Integer);
      Procedure SetY(value : Integer);
      
      End Class.
      
      ScreenNumber1 := New MyScreenModule;
      
      ScreenNumber1::SetX(100);
      
      y + 1 = f(u, x)
      x + 1 = g(u, x)