为什么要使用类而不是函数?

17

我知道类有一些优点,比如变量和函数作用域,但除此之外,相比于许多实例和抽象类,将函数分组似乎更容易。那么为什么将相似的函数分组成类是“常规做法”呢?


8
如果它只是一组函数,那么你做错了(商标)。 - user395760
面向对象编程是将操作数据的函数与数据本身分组,并隐藏其操作方式,以便通过继承来修改行为。 - user177800
@Jarrod 我认为,尽管信息隐藏可能是保护您希望扩展的类的完整性的有用方式,但它绝不是扩展的先决条件。如果他们愿意,一个人可以扩展一个只填充公共字段的类。行为将以与具有隐藏字段的类相同的方式扩展,并且将适用相同的好处。也就是说,在公共字段中不存在的基类中不存在扩展类中存在的缺陷。请注意,这并不是说我不强烈支持这两个原则,因为我确实支持。 - corsiKa
6个回答

17
简单的非面向对象程序可能是一长串命令。更复杂的程序会将命令列表分组成函数或子程序,每个函数或子程序可能执行一个特定的任务。在这种设计中,程序的数据通常可以从程序的任何部分访问。随着程序规模的增大,允许任何函数修改任何数据片段意味着漏洞可能具有广泛的影响。
相比之下,面向对象的方法鼓励程序员将数据放置在不直接可以被程序的其他部分访问的位置。相反,通过调用特别编写的函数(通常称为方法)来访问数据,这些函数要么与数据捆绑在一起,要么从“类对象”继承,并作为检索或修改数据的中介。将数据与一组管理和访问这些数据的方法结合起来的编程构造称为对象。
面向对象编程的优点:
- 可维护性:面向对象编程方法使代码更易于维护。因为对象是自包含的,所以容易确定错误的来源。 - 可重用性:由于对象包含用于操作数据的数据和方法,因此可以将对象视为自包含的黑盒子。这个特性使得在新系统中重用代码变得容易。消息提供对象数据和功能的预定义接口。通过这个接口,一个对象可以在任何上下文中使用。 - 可伸缩性:面向对象的程序也是可伸缩的。因为一个对象的接口提供了在新软件中重用对象的路线图,并提供了替换对象所需的所有信息,而不影响其他代码。这样就可以使用更快的算法和更新的技术来替换老化的代码。

14

面向对象编程(OOP)的目的不是“将相似函数分组到一个类中”。如果这是你所做的一切,那么你并没有实现OOP(尽管使用了面向对象语言)。将一堆函数替换为类有一个'变量和函数作用域' 的副作用,但我只把它看作是一个副作用。

OOP 是涉及到一些概念的,如封装、继承、多态、抽象以及其他很多。它是一种特定的软件设计方式,一种将问题映射到软件解决方案的具体方式。


4

将函数分组到一个类中并不是常见的做法。让我通过尝试不同的语言和范例分享一些我所学到的东西。

我认为这里的核心概念是命名空间。命名空间非常有用,几乎在任何编程语言中都存在。

命名空间可以帮助您解决一些常见问题,并模拟出许多领域中出现的各种模式,例如避免名称冲突、隐藏细节、表示层次结构、定义访问控制、对相关符号(函数或数据)进行分组、定义上下文或作用域...... 我相信还有更多应用。

类是命名空间的一种类型,不同语言之间甚至同一语言的不同版本也会有不同的类属性,例如一些提供访问修饰符,一些则没有;一些允许从多个类继承,其他则不行。人们一直试图找到最有用的功能混合,这在不同的编程语言中解释了可用选项的繁多。

那么,为什么要使用类呢?因为它们以一种似乎自然或直观的方式解决了某些问题。每当我们编写计算机程序时,都在试图捕捉问题的本质,如果可以使用上述某些模式来建模问题,那么使用语言的这些功能是很有意义的。

随着问题变得越来越清晰,您可能会意识到程序的某些部分可以通过使用不同的范例/功能/模式更好地实现,然后是重构的时候了。我有机会工作的大多数程序都在不断发展,直到资金/资源耗尽或者到达收益递减点,很多时候你会得到一些足够好的东西,目前没有继续开发的动力。


1

这不是规范,只是一种做法。类将方法(函数)和数据组合在一起,基于封装的概念。

对于较大的项目,通过这种方式进行分组通常更容易。许多人发现使用对象更容易理解问题。


面向对象编程的重点不在于将函数分组。面向对象编程实际上是关于封装、继承和多态性的。 - Al V

1

使用类的原因有很多,其中最重要的是逻辑封装。对象更贴近我们生活中的世界,因此通常比其他方法更直观。考虑一辆汽车,它具有诸如车身颜色、内饰颜色、发动机马力、功能、当前里程等属性。它还有方法,例如Start()、TurnRight(.30)、ApplyBrakes(.50)。当你用钥匙打开汽车门时,它会发出“叮”的声音。

可能最大的原因是,现在大多数应用程序似乎都有图形组件,而大多数图形用户界面库都是使用对象模型实现的。

多态性也可能是一个重要原因。能够通用地处理多种类型的对象非常有帮助。

如果您是数学家,则函数式风格可能更直观,如ML、F#。如果您正在以可预测的格式与数据交互,则声明式风格会更好,例如SQL或LINQ。


0
简单说,除了大家说的一切之外,我认为类最适合大型项目,特别是由多个程序员实施以保持整洁;在这种情况下使用功能可能会变得相当麻烦。
否则,对于您自己执行某些操作的简单程序/项目,函数就可以胜任。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接