何时从过程式编程转向面向对象编程?

3
在大多数关于OOP的讨论中,人们都说它的优点是可重用性。你需要花费额外的工作来定义你的类,但之后你就能够创建许多实例和扩展这些对象,从而节省时间。
这似乎意味着,在将所有内容写入对象的时间成本等同于你将要节省的时间之前,你不应该从过程式编程转向OOP编程。
一般来说,什么时候是从过程式编程切换到OOP编程的好时机?你通常会寻找哪些迹象/特征来知道你的项目需要进行这种转换呢?

2
面向对象编程并不是“唯一的方法”,你仍然可以拥有良好组织、可重用的代码,而不必使用面向对象编程。但确实,面向对象编程是一种自然的方式,可以使事情变得更加容易。 - Kos
PHP是一种混合语言。如果您仅使用过程式编程或全面采用面向对象编程,那么您的使用方式是错误的,并且很可能会生成低劣的API。 - mario
@mario:很有趣。有相关的阅读材料吗? - Jonah
@JonahBron:这里有一篇关于对象化的文章:http://devzone.zend.com/article/1236#Heading20 - 而且在SO上也有一些有趣的重复问题,如https://dev59.com/vHI_5IYBdhLWcg3wFu_L - 如果我没记错的话,在程序员SE上也有一篇好的文章。 - mario
@Kos 当然,这意味着“有些人可能会觉得面向对象编程更自然和更容易。” 各有所好。 是的,我知道你是在2.42年前发布的。 - Tortoise
1
@Tortoise :) 我对面向对象编程的看法已经发生了很大变化;现在我认为面向对象编程是一种关于程序思考的方式,而不仅仅是编写程序的方法。 - Kos
7个回答

4
我假设这个问题是从初学者的角度来看的。一旦程序员有了编写面向对象代码的经验,您当然可以使用此架构从头开始编写项目。实际上,我认为自上而下的方法在处理大型项目时可以节省大量时间。
对于您所概述的自下而上的情况,我会说您需要感受一下。请参考this维基百科文章以获取更多有关不同方法的信息。
针对PHP,我建议您可以使用以下方法进行迁移:
1. 将尽可能多的代码(例如:相关函数)放入包含文件中。 2. 为该文件创建一个容器类。您可以通过以static方式调用所有函数,甚至使用静态(单例)类来开始使用它们。 3. 逐渐转换为实例范式,而不是全局数据/静态函数范式,这是过程式编程的不良之处。
这个过程是学习面向对象编程的最佳方法,最终您会看到好处。它也将教你我的初始观点:将某物转换为面向对象需要比从一开始就有一个良好(高阶)设计要花费更长的时间。

我不确定我同意你的观点。我见过太多想要成为面向对象编程者的代码是按照你所描述的方式创建的。不幸的是,这并不能让人理解面向对象编程背后的主要原则。其中最重要的一点是要理解一个对象是什么,它能做什么,不能/不应该做什么等等。面向对象编程远不止于代码重用。此外,我不认为过程式编程是不好的。每个面向对象程序中也都有过程式代码。大多数情况下,面向对象编程依赖过程式代码来工作(例如:PHP是用C编写的,Java也是如此)。 - netcoder
我也曾经参与过一个类似的项目,问题不在于它没有朝着正确的方向前进,而是转化得不够充分。有些人认为GOTO并非“总是”不好。我认为过程式编程可能有其应用场景。然而,这两种方式都还没有在我领导的项目中找到应用的机会 :) - zanlok
最近我主要在做C#,强类型系统的优势和更大的架构模型变得越来越明显,大多数人可能会同意面向对象编程成为未来的潮流是有原因的吧? - zanlok

3

如果这不是一个非常非常简单的应用程序,那么现在就是使用面向对象编程的时候了。事实上,有人认为你应该始终采用面向对象编程,因为在未来想要扩展程序时会更加困难。


2
完全同意这个观点。如果你只是处理10行批处理脚本或等效物,那么可以使用几行过程式代码来完成工作,但对于任何你打算长期使用的东西,其他人可能需要维护的东西,或者任何规模较大的东西(超过100行代码),我认为你最好投资于面向对象编程。 - DarinH

1

我认为这取决于上下文。对于使用现有OOP框架的图形应用程序,权衡是瞬间的--在某些情况下,您必须费尽心思才能编写过程化GUI代码。

然而,如果您正在进行原始数据处理并且不与任何OOP框架进行交互,也许您会发现OOP从来没有意义。


1

在项目中转换到面向对象编程可能非常耗时。我怀疑这样做是否有益,因为它需要大量的编码、大量的测试,然后还需要进行大量的重构。整个面向对象编程的概念与过程式编程不同。

因此,我建议不要在项目中进行转换,而是尽快开始在新项目中使用面向对象编程。当你感到舒适时,可以开始考虑为现有项目设计面向对象的方案,并逐步实现面向对象的功能。虽然这将是很多工作,但它可能会感觉像是重新编写整个项目。


0

我会在其他地方寻找需要转换的迹象。尽管我是面向对象编程(OOP)的大支持者,但代码重用在OOP语言中通常只比较好。

OOP只是帮助组织代码的另一个工具,就像过去的函数一样。它是一个伟大而有用的工具。但主要的好处是使编写和维护代码更容易。

如果是我,如果转换到OOP几乎需要完全重写,我会等待一些更明显的转换实际效益出现。如果你的代码能够正常工作,我不知道为什么你要重写它。


2
“使用面向对象编程语言进行代码重用通常只会略微提高效率。” 我的看法是,这使得它非常容易。特别是在不同框架之间移动库时。 - Jonah
是的,它确实可以使编程更容易。它还提供了扩展现有代码的工具。只是在实践中,我并没有真正看到人们重复使用更多的代码。我最近与许多人一起工作,他们拥有巨大的库,没有使用任何面向对象编程。这只是一种观察。你的情况可能会有所不同。 - Jonathan Wood

0

这取决于任务,但是我已经做过两种方式,以下是我的想法:

  1. 您是否觉得工作需要模块化?能够从一个中心位置管理相似或不同的事物吗?有许多重复的元素吗?快速开发或管理更改是否很重要?

  2. 您是否认为您正在解决的问题是可预测和重复的?任务最好通过遵循步骤来解决还是应用算法来解决?

如果更像1,则选择面向对象编程(OOP),否则如果更像2,则选择过程式方法。

如果不确定,请使用您熟悉的方法。


0

改变正在进行的项目的编程风格很少是一件好事。

如果您想在实体之间获得更清晰的责任,您可以始终将面向对象原则应用于过程式代码。

例如,可以查看这本非常有趣的书,了解ANSI-C中的面向对象编码。


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