什么是面向对象编程的好处? 这会帮助我写出更好的代码? [关闭](What are the b

2019-07-04 02:35发布

我是PHPer,而不是在写面向对象的代码。

什么是面向对象的程序上的代码的优势,我在哪里可以学习如何将这些理念应用到PHP?

Answer 1:

它不会自动帮你。 你可以写比结构化程序雪上加霜“OO”的节目,反之亦然。 OOP是一种工具,它允许你创建更强大的抽象。

  • 正如每一个强大的工具,你必须正确地使用它。
  • 正如每一个强大的工具,它需要时间来学习如何正确使用它。
  • 正如每一个强大的工具,你会犯错误。
  • 正如每一个强大的工具,你将不得不多多练习。
  • 正如每一个强大的工具,你应该读了很多关于它,读什么其他人的想法。 向别人学习。
  • 但是,与每一个强大的工具,还有人在那里谁滥用它。 学会不向他们学习不好的做法。 这很难。


Answer 2:

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

然后,当你这样做了一段时间,你会开始发现你的一个应用程序创建的,也有用其他人的对象,你开始得到更好的代码复用为好。 因此,新的应用程序有已经完成的工作的一部分,并使用经过时间考验的代码:软件是建立与更少的错误更快。



Answer 3:

人会告诉你各种各样的事情有关OOP,从不同的角度。 但是,如果你想形成自己的观点,而不是拿别人的话,我建议您阅读伯特兰·迈耶的“面向对象的软件建设”。

从本质上讲,他以非面向对象的编程技术,并分析了它们的基本缺陷。 然后,他得出一种替代技术,它解决了这些缺陷。 换句话说,他得出OOP从第一原理。 这是一个了不起的一件作品,也很convinving。

读它,你就会了解为什么,何时,何种的方式,你可以用推理的备份。



Answer 4:

对象帮助封装复杂性。 对于大多数PHP编程,这是不可能写出好的,干净的代码用于任何合理复杂的应用。 写作OO PHP可以帮助你把代码放到了自己的盒子,从一切隔离。 这样做有几个好处。

  1. 只要你的对象有明确定义的输入和输出,方式,对象做什么它不会在所有问题 - 存储/检索数据可以从平面文件到XML到内存缓存到MySQL到Oracle,你永远只有一个单独的对象担心自己。
  2. 只要你的对象有明确定义的输入和输出,可以完全与具有相同的输入/输出的另一个对象替换它。 在运行时决定是否要MySQL和Postgres的,memcached的,或HTTP POST / GET请求,以在印尼一个粗略的服务器。
  3. OO使得单元测试更容易。 如果你可以定义一个特定的对象应该做的事情(即什么样的结果,应该给你一个给定的输入),那么你可以很容易地编写代码来测试数千个针对代码值和检查结果,你会立刻如果事情知道休息。
  4. 你的代码,你越是“隐藏”的对象,它的少,你必须看到,当你使用该功能。 我写了一个投票应用程序在PHP一旦处理投票的各个环节-数据库交互,投票产生,投票,排名,排序和显示-而我只需要一行代码在我的网站( Poll::Display()以实现什么样的应用程序可以做的全部 - 这使保持我的主页更容易。

请记住一两件事 - 二OO PHP(甚至PHP5)相比,像Python或Ruby语言不是很好OO。 的一切都是一个对象在Python模型是什么让我面向对象编程真的点击我 - 作为前PHP程序员(和双认证的Zend工程师),我强烈建议探索Python的面向对象的,如果你想了解什么OO是怎么一回事。 它会帮助你写出更好的PHP代码,至少是。



Answer 5:

是的,如果你真的得到它。

它可以帮助你直观了解一个更大的系统的部分可以相互交流。 这是在设计层面是非常有用的。

如果你是刚刚写的几行代码,你会得到的唯一好处是,它通常是一个小更容易使用分为不仅仅是功能精心设计的对象库。

为了利用好它,你也需要遵循声音OO设计实践。 始终封装中的所有数据,使用许多小课,从来没有大的“一揽子”类。 具有类做你的工作给你,而不是要求它的数据,并做外部类的工作,等等。

它可能不会帮助你多大一会儿,可能从来没有,如果你总是在做小网站(我不能说这是肯定的,我不会做PHP),但随着时间的推移和它可以大项目是无价的。



Answer 6:

有一件事情没有人提的是面向对象的代码编写容易可读的代码:

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

我得到一个奇怪的满意度从这种美学。



Answer 7:

对我来说,巨大的胜利是继承,或进行其行为几乎完全一样的另一但有一些差异的对象。 下面是从我办公室的一个真实世界的例子:

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

好了,有一天,我们有一个客户谁想要发送PDF文件。 我子类的“TIFF文件对象”类,并改写了“正常化”功能采取了PDF作为输入代替,但留下的代码每隔位不变。 它工作在第一时间和我非常高兴。

我们的邮件服务器的变化意味着我需要通过IMAP获取邮件。 同样,我子类的“POP3提取器”,以便能够说话IMAP。 问题解决了。

另一位顾客想要邮寄给我们的CD,所以我子类的“邮件容器”类与“文件系统目录中”级。 瞧 - 完成。

在每个这样的情况下,新的代码是类似于旧代码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不是魔术,但它让你的代码组织了一个漂亮的很好的方式。 即使你没有任何地方使用它,它仍然是,你真的应该制定一个技能。



Answer 8:

曾经有一段时间,回来时,我第一次开始编程,我写了面向用户的代码。 它的工作很好,但很难维持。

于是,我学会OO,代码我写变得更容易维护,更容易项目之间共享,生活还是不错的......每个人,除了我的用户。

现在,我知道计算机编程的真实银弹。 我写的面向对象的代码,但首先我客体我的用户 。 对待人民为对象开始会觉得粗鲁,但它使一切更优雅-你写的所有软件有明确定义的接口工作,而当用户发送一个意外的消息,你可以仅仅忽略它,或者,如果标有一个标志,表示足够的重视,在他们抛出异常。

生活,OO,是好的...



Answer 9:

我认为OOP适合那些谁认为在“对象”,其中一个对象包括数据以及对该数据操作功能。

  • 如果你倾向于认为的功能和它们作为单独的东西要操作的数据,那么你是一个程序的程序员。
  • 如果你倾向于认为的功能,它们为连接操作的数据,那么你是一个面向对象的编程人员。

我告诫不要外出和学习模式 。 为了做到面向对象的程序设计好,你需要教自己认为这样一个面向对象的编程。 你需要去的地步,你明白和可以命名的点好处:

  • 封装
  • 班VS实例/对象
  • 继承和多态

这将帮助你成为一个更好的程序员仅仅在于更多的款式编程的程序员都知道的感觉,更多的范围内他的保留节目解决问题和编写优雅的代码。 你不能去,并且写所有的代码,并自动具有良好的代码,但如果你真正了解OOP是如何工作的,以及你不只是复制粘贴一天的一些流行的设计模式,面向对象的,那么你可以写一些漂亮好的代码,编写一个大型应用程序时尤其如此。



Answer 10:

似乎每个人都回答您的问题从字面上看,即具体的收益/ OO的缺点。

你应该学会OO,但不是因为OO有你需要的任何特殊魔力。

更一般的形式是:

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


Answer 11:

我会这样说:如果你写什么复杂的,你应该编码您认为在概念,而不是试图想这在某种程度上原产于您所使用的语言概念。 这样,你做少的错误。 这些概念的形式称为设计。

函数式编程,您可以定义与动词相关的概念,因为每个函数基本上是一个动词(如打印())。 面向对象编程,而另一方面,还允许你定义与名词相关联的概念。



Answer 12:

为了阐述Joeri的回答一点:

国际标准化组织定义封装做为“的属性,它包含的对象的信息访问只能通过在该对象支持的接口交互。”

因此,如某些信息是通过这些接口可访问的,有些信息必须被隐藏并在对象内不可访问。 属性这样的信息呈现出被称为信息隐藏,其中通过帕尔纳斯主张模块应该被设计为隐藏既困难决定和可能改变的决定来定义。

需要注意的是两个字:变化。 信息隐藏涉及潜在的事件,如在未来艰难的设计决策的变化。

考虑具有两个方法的类:)方法(它是隐藏在类内的信息,和方法B(),其是公众,因此直接访问由其他类。

有一定的概率方法a()未来的变化将需要在其它类方法的改变。 还有一定的概率方法b()以后的变化需要在其它类的方法的改变。 这样的波纹变化将用于方法发生的概率的(),但是,通常将低于用于方法B()仅仅是因为方法B()可以在由多个类可信赖。

这降低了纹波影响的概率是封装的关键优势。

考虑源代码相关的最大可能数目(MPE - 的缩写,是从图论)中的任何程序。 从以上的定义推断,我们可以说,给出了两个方案提供相同功能的用户,最低MPE程序更好的封装,并在统计上较为知名封装程序将是更便宜的维护和发展,因为成本的给它的最大电位的变化将是比最大电位变化到较差的封装系统更低。

考虑,而且,只有方法和没有阶级,因此没有从彼此信息隐藏方法手段的语言。 比方说,我们的节目有1000点的方法。 这是什么程序的MPE?

封装理论告诉我们,给定的n公共节点的系统,这个系统的MPE为n(n-1)。 因此,我们的1000种公共方法的MPE为999,000。

现在,让我们打破这种系统分为两类,各有500点的方法。 正如我们现在有课,我们可以选择有一些方法的公共和一些方法私有。 这将是的情况下,除非每一个方法实际上是依赖于每个其他方法(这是不太可能)。 比方说,在每类50层的方法是公开的。 什么将系统的MPE是什么?

封装理论告诉我们它是:N((N / R)-1 +(R-1),P),其中R是类数,p是每级的公共方法的数量。 这将使我们的两班制的499,000的MPE。 因此,在该双级系统的变化的最大潜在成本已经是比未包封系统的显着更低。

比方说,你打破你的系统分为3类,每一类有333类(当然,一个会有334),并再次用每50种公共方法。 什么是MPE? 再以上述公式中,MPE将约为482,000。

如果系统被分成4个等级的每个250种的方法中,将MPE将是449000。

如果可能似乎是在我们的系统中增加类的数量将始终降低其MPE,但事实并非如此。 封装理论表明,在其中该系统应被分解以尽量减少MPE类的数目是:R = SQRT(N / P),这为我们系统实际上是4. 6类A系统中,例如,将有一个MPE的465666。

负担的原则有两种形式。

强劲的形式规定,转化实体的集合的负担转化实体的数量的函数。 弱形式规定,转化实体的集合的最大潜力负担转化实体的最大潜在数量的函数。

在稍微更详细地,创建或修改任何软件系统的负担的创建或修改程序单元的数量的函数。

依赖特定的,修改后的程序单元的程序单元有受到影响较不依赖于修改的程序单元的程序单元的概率较高。

最大的潜在负担的修改程序单元可以并处是依赖于它的所有程序单元的冲击。

减少一个修改的程序单元上的依赖关系因此减少它的更新将影响其它程序单元的概率,进而减少最大电位负担该程序单元可以强加。

减少系统中的所有程序单元之间的依赖关系的最大可能数目,因此减少了对特定节目单元的冲击会导致更新其它程序单元的概率,并因此减少所有更新的最大潜能负担。

因此,封装是面向对象的基石和封装有助于我们减少所有程序单元之间的依赖关系的最大潜在数量和减轻负担的原则的弱势形态。



Answer 13:

我是一个长期的过程,PHP程序员谁偶尔涉足面向对象PHP。 上述乔尔的回答是的好处一个很好的总结。 在我看来,一个微妙的第二个好处是,它迫使你更好地从一开始就定义您的要求。 你必须了解的对象,并且会在他们行事方法之间的关系。

一本好书,以帮助过渡是彼得·拉文的“面向对象的PHP”。



Answer 14:

一个大的系统中,如WordPress,Drupal或XOOPS,使用OOP概念。 你可以看到他们有使用的好处。 代码重用,模块化,可维护性和可扩展性。

你必须修改对象的部件的能力,并影响整个应用程序; 没有搜索要替换的每一个现场你做了一些操作(也可能是失踪了)。

您可以遍布重用的对象,节省了一个可怕的很多的复制和粘贴。 修补一个bug需要修补的一个对象,而不是16个页面的代码都做同样的事情。

当你封装逻辑和“隐藏”的实施,它更容易使用的对象,无论是对你从现在开始,当你忘了为什么你做了什么,以及谁使用你的代码中筑巢人或加仑6个月。 例如,你通过WordPress的帖子做循环是调用一个函数。 我并不需要知道它是如何工作的,我只需要知道如何调用它。

OOP是真的程序代码包裹在对象方法/函数。 你还需要知道如何才能实现目标的方法和功能编写体面的线性码。 它只是使得它更容易重用,规模化,修复,调试和维护你的东西。



Answer 15:

http://www.onlamp.com/pub/a/php/2005/07/28/oo_php.html



Answer 16:

我会说,有两个主要的优点:

  • 封装:在不应该从库外称为可隐藏库,防止误用,以及缓和改变到库的内部结构,同时保持外部接口的代码。 在一个良好的面向对象设计,变化引入更容易,一旦完成了代码。
  • 抽象:而不是处理你处理与员工,部门数组的数组,等等。 这意味着你可以专注于业务逻辑,写更少的代码。 更少的线意味着更少的错误。

重用我不会严格资格作为一种面向对象的利益,因为在一个纯粹的程序模型的智能图书馆组织可以重复使用代码。

在另一方面,使用大量的对象在PHP中往往比一个程序模型来降低性能,因为有太多的对象构造开销为每个请求。 寻找过程式和面向对象的代码风格之间的良好平衡是必要的。



Answer 17:

要了解OO在PHP我建议尝试使用一些好的书面OO PHP框架。

你可能想看看Zend框架 。



Answer 18:

我是一个PHP藏汉,虽然我有一个强大的面向对象的背景,我会说使用OOP与PHP的最好的书必须是PHP 5的对象模式与实践



Answer 19:

其中一个是我在PHP做了与OOP的最好的事情是类发生器。 在任何给定的表,它会涉及到几乎相同的SQL操作:

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

现在,我不必再编写所有这些SQL语句,除了在特殊条件。 不仅我在上面做编码减少到1分钟,我还保存时间从调试代码。

所以每当有更改表结构,我只是重新生成类。

也许你应该尝试一样,它为我的作品和我的客户喜欢它!



文章来源: What are the benefits of OO programming? Will it help me write better code? [closed]
标签: php oop