OO编程有哪些好处?它会帮我写出更好的代码吗?

时间:2008-09-25 19:42:52

标签: php oop

我是一名PHPer,并没有编写面向对象的代码。

OO相对于过程代码有什么优势,我在哪里可以学习如何将这些想法应用到PHP?

19 个答案:

答案 0 :(得分:41)

它不会自动帮助您。您可以编写比结构程序更糟糕的“OO”程序,反之亦然。 OOP是一个允许您创建更强大的抽象的工具。

  • 与每个强大的工具一样,您必须正确使用它。
  • 与每个强大的工具一样,学习如何正确使用它需要时间。
  • 与每一个强大的工具一样,你会犯错误。
  • 与每个强大的工具一样,你必须练习很多。
  • 与每个强大的工具一样,你应该阅读很多关于它的内容,并阅读其他人的想法。向他人学习。
  • 但是,正如每个强大的工具一样,有些人滥用它。学会不学习他们的不良做法。这很难。

答案 1 :(得分:22)

对象有助于保持代码在不同部分之间隔离,因此如果您需要对一个部分进行更改,您可以确信它不会影响其他部分:松散耦合。

然后,当您已经完成了一段时间后,您将开始发现为一个应用程序创建的对象在其他应用程序中也很有用,并且您也开始获得更好的代码重用。因此,新应用程序已完成部分工作,并使用经过时间考验的代码:软件构建速度更快,错误更少。

答案 2 :(得分:13)

人们会从各个角度告诉你关于OOP的各种事情。但是如果你想形成自己的观点,而不是拿别人的观点,那么我建议阅读Bertrand Meyer的“面向对象的软件构建”。

基本上,他采用非OOP编程技术,并分析其基本缺陷。然后,他得出了一种解决这些缺陷的替代技术。换句话说,他从第一原则中得出OOP。这是一项了不起的工作,非常有说服力。

阅读它,你将了解为什么,何时以及以何种方式支持推理。

答案 3 :(得分:8)

对象有助于封装复杂性。对于大多数PHP编程来说,为任何相当复杂的应用程序编写好的,干净的代码是不可能的。编写OO PHP可以帮助您将代码放入自己的框中,将其与其他所有代码隔离开来。这有几个好处。

  1. 只要您的对象具有明确定义的输入和输出,对象执行其操作的方式根本不重要 - 存储/检索数据可以从平面文件到XML到memcache到MySQL到Oracle,以及你只需要关心一个单一的物体。
  2. 只要您的对象具有明确定义的输入和输出,您就可以将其完全替换为具有相同输入/输出的另一个对象。在运行时确定您是否需要MySQL,Postgres,memcached或HTTP POST / GET请求到印度尼西亚的粗略服务器。
  3. OO使单元测试更容易。如果你可以定义一个特定对象应该做什么(即它应该给你一个给定输入的结果)那么你可以轻松地编写代码来测试针对该代码的数千个值并检查结果,你会立即知道是否有什么东西符。
  4. 您隐藏在对象中的代码越多,在使用该功能时就必须看到的代码越少。我在PHP中编写了一个轮询应用程序,它处理了轮询的所有方面 - 数据库交互,轮询生成,投票,排名,排序和显示 - 我只需要在我的网站上使用一行代码(Poll::Display())来实现应用程序可以做的全部内容 - 这使得维护我的主页变得更加容易。
  5. 记住一件事 - 与Python或Ruby等语言相比,PHP中的OO(甚至PHP5)并不是很好的OO。 Python中的所有对象模型是让OO编程真正为我点击的原因 - 作为一名前PHP程序员(以及经过双重认证的Zend工程师),如果你想了解什么是OO,我强烈推荐探索Python的OO就是这样。它将帮助您编写更好的PHP代码,至少。

答案 4 :(得分:7)

没有人提到的一件事是OO代码有助于编写可读代码:

sherry.changePhoneNumber();
phoneCompany.assignNewPhoneNumberTo(sherry);
sherry.receive(new PhoneNumber().withAreaCode("555").withNumber("194-2677"));

我从这种美学中得到strange satisfaction

答案 5 :(得分:7)

是的,如果你真的明白了。

它可以帮助您直观地了解较大系统的各个部分如何相互交互。它在设计层面非常有用。

如果您只是编写几行代码,那么您将获得的唯一好处是,使用分解为精心设计的对象而不仅仅是函数的库通常会更容易一些。

为了充分利用它,您还需要遵循合理的OO设计实践。始终使用许多小类封装所有数据,从不使用大型“全能”类。让课程为你工作,而不是要求它提供数据和在课外进行工作等。

它可能暂时不会对你有所帮助,如果你总是在做小网站(我不能肯定地说这个,我真的不会做php),但是随着时间的推移和大项目它可以是非常宝贵的。

答案 6 :(得分:6)

对我来说,一个巨大的胜利就是继承,或者制造一个几乎与另一个完全相同但却有一些差异的物体。这是我办公室的一个真实案例:

我们需要代码来处理客户发送给我们的TIFF文件,将它们转换为标准格式,将有关该文件的一些信息插入数据库,然后发送结果电子邮件。我在一组类中编写了这个(在Python中,但想法是一样的)。 “fetcher”类从POP3邮箱收到电子邮件,并将其发送到“容器”类,该类知道如何从电子邮件中读取附件。该类将每个图像移交给执行必要处理的“文件对象”类。

好吧,有一天我们有一位想发送PDF文件的客户。我将“TIFF文件对象”类子类化并重写了“normalize”函数,将PDF作为输入,但保留了其他所有代码。它第一次工作,我很高兴。

对我们的邮件服务器的更改意味着我需要通过IMAP获取电子邮件。再次,我将“POP3 fetcher”子类化,以便它可以说IMAP。问题解决了。

另一位客户希望向我们发送CD,因此我将“email container”类子类化为“filesystem directory”类。瞧 - 完成了。

在每种情况下,新代码与旧代码的95%相似。例如,“TIFF文件对象”类有大约15种方法。 “PDF文件对象”类只定义了一个:将特定格式的文件转换为标准的方法。它从其父类获得的所有其他内容。

现在,你绝对可以在程序上做同样的事情,例如写下:

if fileobjecttype == 'TIFF':
    data = <snip 30 lines of code to read and convert a TIFF file>
elif fileobjecttype == 'PDF':
    data = <another 45 lines to read a PDF>
elif fileobjecttype == 'PNG':
    data = <yep, another one>

最大的区别在于我相信你可以让OOP看起来更干净,更有条理。我的PDF类看起来像:

class PDFReader(GenericImageReader):
    def normalize(self):
        data = <45 lines to read a PDF>

就是这样。你可以一眼就看出它只有一件事与它继承的类不同。它还会迫使您 - 或者至少强烈鼓励您 - 在应用程序的各个层之间建立干净的界面。在我的示例中,PDFReader不知道并且不关心其图像是来自POP3邮箱还是CD-ROM。 POP3提取器完全不了解附件,因为它的工作只是收发电子邮件并传递它们。在实践中,这使我们能够以绝对最少的编码或重新设计来做一些非常棒的事情。

OOP并不神奇,但它是保持代码组织的一种非常棒的方式。即使你不到处使用它,它仍然是你真正应该发展的技能。

答案 7 :(得分:4)

有一段时间,当我第一次开始编程时,我编写了面向用户的代码。它工作得很好,但很难维护。

然后,我学会了OO,我编写的代码变得更容易维护,更容易在项目之间共享,生活也很好...除了我的用户之外的所有人。

现在,我知道计算机编程的真正银弹。我编写OO代码,但首先我客观化我的用户。将人们视为对象起初可能看起来很粗鲁,但它使一切变得更加优雅 - 您可以编写所有软件以使用明确定义的界面,当用户发送意外消息时只能忽略它,或者,如果标记有足够重要性的标志,则向它们抛出异常。

生活,有OO,很好......

答案 8 :(得分:3)

我认为OOP适合那些在“对象”中思考的人,其中一个对象由数据以及对该数据进行操作的函数组成。

  • 如果您倾向于将功能和他们操作的数据视为单独的事物,那么您就是程序员。
  • 如果您倾向于将功能及其操作的数据视为连接,那么您就是面向对象的程序员。

我要小心不要出去学习模式。为了很好地完成面向对象的编程,你需要像面向对象的程序员一样自学 think 。您需要达到理解的程度,并将其命名为:

  • 封装
  • 类与实例/对象
  • 继承和多态

只有在程序员编程风格越多的情况下,它才能帮助您成为更好的程序员,他在解决问题和编写优雅代码方面的范围越大。你不能去编写面向对象的所有代码并自动拥有良好的代码,但是如果你真的了解OOP是如何工作的,并且你不仅仅是复制粘贴当时流行的一些设计模式,那么你可以写一些漂亮的好的代码,特别是在编写大型应用程序时。

答案 9 :(得分:3)

似乎每个人都在按字面意思回答你的问题,即OO的具体利弊。

你应该学习OO,但不是因为OO有你需要的特殊魔法。

更通用的形式是:

  • 问:“我应该学习(OO,FP,并发,基于逻辑,事件驱动......)编程吗?”
  • 答:“是的,即使你不是每天都直接使用它,学习新的范例总是有用的。”

答案 10 :(得分:2)

我会这样说:如果你写任何复杂的东西,你应该编码你想到的概念,而不是试图用你所使用的语言某种原生的概念来思考。这样可以减少错误。这些概念的形式化称为设计。

函数式编程允许您定义与动词相关的概念,因为每个函数本质上都是动词(例如,print())。另一方面,OO编程还允许您定义与名词相关的概念。

答案 11 :(得分:2)

我是一个长期的程序化PHP程序员,偶尔会涉及面向对象的PHP。乔尔上面的答案是对这些好处的一个很好的总结。在我看来,一个微妙的次要好处是,它迫使你从一开始就更好地定义你的要求。您必须了解对象与将对其起作用的方法之间的关系。

帮助过渡的好书是Peter Lavin的“面向对象的PHP” alt text

答案 12 :(得分:2)

答案 13 :(得分:1)

答案 14 :(得分:1)

大型系统(如Wordpress,Drupal或XOOPS)使用OOP概念。你可以看到他们在那里使用的好处。代码重用,模块化,可维护性和可扩展性。

您可以修改对象的某些部分,它会影响整个应用程序;没有搜索替换你做过某些操作的所有地点(并且可能错过了它)。

您可以重复使用对象,从而节省大量的复制和粘贴。修补错误需要修补一个对象,而不是16页代码,它们都做同样的事情。

当你封装逻辑并“隐藏”实现时,你可以更容易地使用这些对象,从你忘记为什么做某事的6个月后,以及使用你的代码的那个人或者gal 。例如,你在Wordpress中循环播放的所有内容都是调用函数。我不需要知道它是如何工作的,我只需要知道如何调用它。

OOP实际上是包含在对象方法/函数中的过程代码。您仍然需要知道如何编写体面的线性代码以实现对象的方法和功能。它使重用,扩展,修复,调试和维护您的事物变得更加容易。

答案 15 :(得分:1)

我想说有两个主要好处:

  • 封装:可以隐藏不应从库外部调用的库中的代码,防止误操作,并在保留外部接口的同时简化库内部结构的更改。在良好的面向对象设计中,一旦代码完成,就会更容易地引入更改。
  • 抽象:不是处理数组,而是处理员工,部门等。这意味着您可以专注于业务逻辑,并编写更少的代码行。更少的线意味着更少的错误。

重用我不会严格限定OO的好处,因为在纯粹的程序模型中,智能图书馆组织也允许您重用代码。

另一方面,与过程模型相比,在PHP中使用大量对象往往会降低性能,因为每个请求都有太多的对象构造开销。在程序风格和oo风格的代码之间找到一个很好的平衡势在必行。

答案 16 :(得分:0)

要在PHP中学习OO,我建议尝试使用一些好的书面OO PHP框架。

您可能需要查看Zend Framework

答案 17 :(得分:0)

我也是一名PHP,虽然我确实有很强的OOP背景,但我会说使用OOP和PHP的最佳书籍必须是PHP 5 Objects Patterns and Practice

答案 18 :(得分:0)

我在PHP中使用OOP做的最好的事情之一是类生成器。 在任何给定的表中,它将涉及几乎相同的SQL操作:

  • 插入
  • 更新
  • 选择
  • 删除
  • 存在(检查是否存在行)
  • 搜索
  • 列表

现在我不再需要编写所有这些SQL语句,除非在特殊情况下。在上面的操作中,我不仅将编码减少到1分钟,而且还节省了调试代码的时间。

因此,只要表结构发生变化,我就会重新生成类。

也许你应该尝试相同的方式,因为它适用于我和我的客户喜欢它!