面向对象编程与过程编程 - 最大的区别是啥? [复制]

Posted

技术标签:

【中文标题】面向对象编程与过程编程 - 最大的区别是啥? [复制]【英文标题】:Object oriented programing vs procedural progaming - Whats the big difference? [duplicate]面向对象编程与过程编程 - 最大的区别是什么? [复制] 【发布时间】:2012-01-27 08:21:19 【问题描述】:

可能重复:OOP vs Functional Programming vs Procedural

最近我被介绍了 OO 方法,到目前为止我一直在使用函数编写 php

现在,老实说,我真的不明白: 当我使用“函数”的想法时,我只包含一个名为,例如,functions.php 的文件,其中包含我需要的所有函数,包括变量,当我需要使用那段代码时,我只是调用它并设置变量,如果有默认变量则留空。

现在据我了解 OO,我没有编写很多没有“类别”的函数,而是将它们收集在一个“类”中(例如,所有使用 db 的函数都在“db”下' class) - 我没有给他们 vars,而是在类中预先声明了这些 vars。

所以,感觉就像我基本上在做同样的事情。我知道变量在 OOP 中不是全局的,它们是每个实例的,这对于编写更易于理解的代码来说是可以的,但除此之外,我真的感觉不到这样做有很大的不同:

$html = new html();
$html->src='http://***.com';
$html->desc='Great place to learn & share knowledge';
$html->link();

--

html_link('http://***.com','Great place to learn & share knowledge');

我同意,对于没有编写该代码但看不到每个人都在谈论的巨大好处的人来说,它可能更具可读性:重用、有条理、更快等等。

分享您的想法,也许我会明白如何从 OOP 中受益 :)

提前致谢, 哎呀。

【问题讨论】:

您的意思不是“功能性”,而是“程序性”。函数式是完全不同的(想想 Lisp)。 如果你问我,PHP 的“面向对象”支持在很大程度上是作为事后的想法。如果您发现它有用,请使用它,但当语言的某些方面让人感觉是人工的、未经深思熟虑或令人费解时,请不要感到惊讶。 如果您只是将类用作命名空间来对函数进行分组,那么它就不是真正的 OOP。 不可变变量可能是“经典”函数式和 OO 之间的最大区别。 【参考方案1】:

阅读多态性。一旦你理解了这一点,你就成功了一半。一个类不仅仅是一个函数的聚合(用oo说话的方法),一个类的实例封装了状态和行为。您还应该学习设计模式以充分实现 oo 范式的强大功能。从四人组开始 (http://en.m.wikipedia.org/wiki/Design_Patterns) 以及 fowlers 企业模式 (http://martinfowler.com/articles/enterprisePatterns.html)

【讨论】:

【参考方案2】:

OOP 的基本本质是,您将功能(方法)和数据(属性)放在一个地方,即类/对象。 当您只编写函数和使用变量时,两者都是分开的。

注意:函数式编程不是您现在所做的。有一个范式functional programming,其中不存在循环等结构,一切都用函数表示。

【讨论】:

【参考方案3】:

当您所做的只是编写不保留任何上下文等的简单函数时,过程式编程会容易得多。

一旦您想使用具有完全相同参数的两个函数,使用对象会容易得多,因为它需要的代码更少。

以下示例假设您有一个网站 (SO),并希望为单独的页面创建 URL。您需要在一个中心位置定义“基本位置”,以避免在域更改后重新编写所有页面。

$url = new URL('http://***.com');
echo $url -> link('home'); // http://***.com/home
echo $url -> link('review'); // http://***.com/review

用函数做到这一点:

echo linkURL('http://***.com', 'home');
echo linkURL('http://***.com', 'review');

如您所见,您甚至可能都懒得使用函数。

然后是面向对象之前的方法:

$context = prepareURL('http://***.com'); // returns <something>
echo createURL($context, 'home');
echo createURL($context, 'review');

这种方法在使用函数的同时仍然具有上下文。但是,您可能已经注意到,这与 OO 非常接近。

【讨论】:

以上是关于面向对象编程与过程编程 - 最大的区别是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

面向对象编程是啥意思

面向对象编程与面向过程编程的区别(翻译版)

C语言和VB的区别是啥?

面向过程与面向对象编程的区别和优缺点

面向过程编程与面向对象编程

面向过程 VS 面向对象 的编程区别