2013-05-04 17 views
4

使用类作为方法集合开始使用面向对象的PHP是明智的吗?这种方法有什么缺点吗?通过使用类作为方法的集合OOP开始?

我知道OOP远不止这些,但是我的PHP项目太小,无法利用OOP所提供的所有功能。另一方面,我的项目变得太大而无法通过程序编程来更新/维护。

我看了一下OOP很多话题和偶尔有人说“面向对象不仅仅是一种收藏功能多”(或东西沿着这些路线)。这让我想:这可能是事实,但也可能是我通过这样做最终进入OO编程世界的机会。

所以,这是一个聪明的第一步,真正开始使用和学习OOP?还是有我需要知道的严重缺点?

+2

如果它可以帮助你编写更好的代码,为什么不呢? – phant0m 2013-05-04 11:47:58

+1

这不是面向对象的编程(完全),即基于调用的编程。您可能想了解[实用模式](http://c2.com/cgi/wiki?UtilityPattern)并查看[实用程序类是邪恶的?](http://stackoverflow.com/q/3340032/367456) - 请记住,不同的编程语言有不同的需求。在PHP中,您应该了解静态和动态方法调用的不同之处。 – hakre 2013-05-04 12:01:24

+2

如果你想采用这种方法,只需获得一本[关于重构的好书](http://martinfowler.com/books/refactoring.html),并应用你学到的东西。你最终会写出更好的代码。 – Yoshi 2013-05-04 12:09:44

回答

1

OOP基本上只是一套方法。但是在编程中思考是不同的。在类中,你封装了类似的funcionality。代码更具可读性,您不需要一遍又一遍地写入相同的功能。它也更安全(私人成员),如果你正在编写图书馆,最终用户只能改变你想要的东西等。 因此,我不会建议尝试绕过使用功能集的OOP,而是使用真正的OOP。没有理由不。

1

我不建议,你会习惯写掩蔽为OOP,这是不是真的,你想要的程序代码。开始时可能很难,但要学习面向对象的所有功能,阅读模式,强调编码标准,最重要的是使用面向对象体系结构研究应用程序。

2

你的问题真广,但它值得一个简单的答案,你可以记住并保持与你,而你继续你的旅程到面向对象的分析和设计(OOAD)的世界。

那么,这是真正开始使用和学习OOP的第一步吗?还是有我需要知道的严重缺点?

你可以想象,我们不可能直接回答这个问题。什么是聪明的,什么不取决于我们自己的许多能力。例如。对于某些人来说,它可能很聪明,因为它可以帮助他们尽早地制止错误,这是一条路。对于其他人来说,这可能是彻头彻尾的灾难,因为他们没有发现任何错误,继续开发软件,因为他们认为:如果我没有发现错误,这是完全正确的。

那么如何解决这个困境呢?很简单,我们在OOP中有两个部分,您可以轻松了解并与您保持联系。第一种叫做S.T.U.P.I.D. - 你可以想象这是什么意思,如果事情属于这一类,第二个被称为S.O.L.I.D.它同样是自言自语,如何对待那里的一些东西。

+0

我的广泛的问题值得“它取决于”--answer。感谢您与易记的指南链接。 – Abe1984 2013-05-04 12:55:29

2

声明:我还没有处理过的,而PHP的,所以我的语法可能是错误的。

术语OOP有点模糊imo,这意味着不同的人在听到它时会想到稍微不同的东西,所以当你听到矛盾的事情时不要混淆。

使用类一起构造类似的函数不会损害你的代码,但是你基本上只是使用类作为函数的名称空间。通常情况下,您需要以某种方式定义类,以便您的系统的某个方面进行封装,这意味着只有该类的代码才会直接处理该方面,而其他人则只使用该类。

例如,您可以有一个管理打印作业队列的类。如果您有一些想要打印文档的代码,则它不必知道作业排队或如何发送到打印机,它只需知道打印作业队列对象(我们称之为$jobQueue ),它可能有一个像$jobQueue->enqueue($document)这样的方法。

现在你可能会说:“那代码也可以同样使用全局函数enqueueJob($document),”直到你想有一个以上的队列(对于不同的打印机)是真的,并以不同的方式工作队列(将作业存储在数据库中,存储在内存中或根本不存在 - 想象一下直接进入回收站的队列:))。使用OOP,这种场景是没有问题的,并且这些细节完全隐藏在想要打印文档的代码中 - 所有它必须关心的是它有一个带有enqueue方法的作业队列对象。

为了获得这种作业队列的“互换性”,他们需要有一个通用的接口(在这种情况下,这种方法是enqueue方法),必须仔细选择它以涵盖想要打印的代码的所有需求的东西,但没有对打印队列的工作方式做太多的假设。例如,您可以想象enqueue方法将文件路径作为参数告诉队列将文件存储到哪里 - 但该接口对于在数据库上运行的队列无用。这是找到好的抽象艺术

现在回到你原来的问题,只要没有考虑到新类应该提供哪些抽象/接口,就把相关函数组合到一个类中,并不是真正的OOP。没有这一点,所有使用这个新类的代码将被硬连线使用,如果您决定需要不同类型的打印机队列,则需要更改/重新检查。 :)

但是,“不是OOP”是不一样的“不是一个好主意”。我说去做,重新安排你的功能。在我看来,重要的是要记住,并非每件事都需要成为一个对象或适合某种抽象。但是也许你会发现你确实有一些功能可以完成类似的功能(文件队列,数据库队列),这些功能可以抽象成一个通用接口。

+0

非常感谢。你的回答不仅为我阐明了“抽象”和“界面”,而且也使我确信自己的方法正确。 – Abe1984 2013-05-04 13:32:12

0

有些东西是功能性的,程序性的和基于对象的。使用最适合这种情况的那种。这个哲学你不会有太大的错误。

0

由于这个问题是不是真的有关的PHP,但一般的面向对象,这个答案应该是有效的许多语言。

OOP中存在不同的模式。我建议阅读关于“四人帮”的文章。这是一本非常好的书,它解释了在做OOP时可以使用的一些最基本的模式。

您应该考虑将所有函数存储在命名空间中,而不是使用类来保留一组静态函数。

类通常定义对象(如物理对象)。任何物理对象都有一组属性和行为。

当设计一个类时,你试图定义这些行为和属性。例如,一个包。

class Bag: 
    // Methods 
    function open: ... 
    function close: ... 
    function empty: ... 
    function add(item): ... 
    // Properties 
    array items: [] 
    bool is_open: false 

某些属性或方法可以隐藏或可见的世界。在我的例子中,当你尝试清空或添加一个对象到一个封闭的包里时,你可以使函数add抛出一个异常。很显然,这里的所有方法都与实际对象有关。

添加与包无关的方法或属性应该属于不同的名称空间或类。这真的取决于你想要做什么。