在您的博客中,您似乎既熟悉命令式编程也喜欢函数式编程,并且熟悉面向对象编程所涉及的基本概念,但是您从未真正对它进行“点击”使它有用。我将尝试根据这些知识进行解释,并希望它对您有所帮助。
从本质上讲,OOP是一种使用命令式范例通过创建对问题域建模的“智能”数据结构来更好地管理高度复杂性的方法。在(标准过程非对象程序)程序中,您有两个基本知识:变量和知道如何处理它们的代码。该代码从用户和其他各种来源获取输入,将其存储在变量中,对其进行操作,并生成输出数据,该数据将传递给用户或其他各种位置。
面向对象编程是一种采用基本模式并以较小的比例重复该程序来简化程序的方法。就像程序是一个包含大量数据的代码,这些代码知道如何处理程序一样,每个对象都是绑定到知道如何处理程序的代码的一小段数据。
通过将问题域分解为较小的部分,并确保将尽可能多的数据直接绑定到知道该如何处理的代码,您可以更轻松地对整个过程以及子过程进行推理。构成过程的问题。
通过将数据分组为对象类,您可以集中处理与该数据相关的代码,从而使相关代码更易于查找和调试。并且通过将数据封装在访问说明符后面,并仅通过方法(或属性,如果您的语言支持它们,则通过属性)对其进行访问,则可以大大降低数据损坏或违反不变性的可能性。
通过使用继承和多态性,您可以重用先前存在的类,对其进行自定义以满足您的特定需求,而不必修改原始类或从头开始重写所有内容。(如果可以避免的话,这绝对是不应该做的事情。)请小心理解基本对象,否则可能会导致袋鼠杀手。
对我而言,这些是面向对象编程的基本原理:通过创建对象类,继承和多态性来实现复杂性管理,代码集中化和改进的问题域建模,并通过使用封装和增强功能来提高安全性而不会牺牲功能或控制力属性。我希望这可以帮助您理解为什么这么多的程序员觉得它有用。
编辑:在评论中回应乔尔的问题,
您能解释一下“面向对象程序”包含的内容(除了您所概述的这些奇特的定义之外)与命令式程序根本不同的内容吗?您如何“使球滚动?”
这里有一点免责声明。我的“面向对象程序”模型基本上是Delphi模型,它与C#/。NET模型非常相似,因为它们是由前Delphi团队成员创建的。我在这里所说的话可能不适用于其他面向对象的语言,或者可能不太适用。
面向对象程序是其中所有逻辑都围绕对象构造的程序。当然,这必须在某个地方引导。典型的Delphi程序包含初始化代码,该代码创建一个名为的单例对象Application
。在程序开始时,它将调用Application.Initialize
,然后从头开始对Application.CreateForm
要加载到内存中的每种表单都调用,然后Application.Run,
在屏幕上显示主表单并启动输入/事件循环,该循环构成了任何形式的核心。交互式计算机程序。
应用程序和表单将轮询来自OS的传入事件,并将其转换为对对象的方法调用。很常见的一件事是使用事件处理程序,即.NET中的“代理”。一个对象的方法说:“执行X和Y,但还要检查是否已分配了此特定事件处理程序,如果已分配则调用它。” 事件处理程序是方法指针(一种非常简单的闭包,其中包含对该方法的引用和对对象实例的引用),用于扩展对象的行为。例如,如果我的表单上有一个按钮对象,我将通过附加一个OnClick事件处理程序来自定义其行为,该事件处理程序会导致其他对象在单击按钮时执行一个方法。
因此,在面向对象的程序中,大多数工作是通过定义具有一定职责的对象并将它们链接在一起来完成的,无论是通过方法指针还是通过一个对象直接调用在另一个对象的公共接口中定义的方法。(现在我们回到封装了。)这是一个想法,在我上大学的OOP课程之前,我没有任何回溯的想法。