是与PHP不同的类分组方式


Is the way of grouping classes different with PHP?

如标题所示;在PHP中对类进行分组的方式与在Java中进行分组的方式有什么不同吗?我目前正在阅读O'Reilly的书《OOA&D》,在书中的章节中,我学会了用一个类来完成每个特定的任务,而不是用一个类来完成一个分组。最近,我查看了一些日历代码,类有数千行,其中包含了要使用的所有内容。然而,这对我来说就像它违反了让许多对象做一个任务的观点,但鉴于PHP是web开发,它应该是不同的吗?如矿物。

答案:使用好的设计原则,即使在PHP中。

除了不创建怪物类(也称为神类或对象)之外,以下模式值得特别提及:

  • 对象命名:
    • 类名应该是名词,因为它们是对象。
    • 方法名应该是动词,因为它们是动作。
  • 凝聚力。简短的版本基本上是:方法做一件事,把它做好。
  • 属性可见性:变量应该是private,除非你有很好的理由不这样做,在这种情况下,使用protected。几乎总是应该避免public
  • 使用接口和抽象。几乎没有人在PHP中使用接口,但他们应该使用。这意味着我可以编写自己的实现细节,但仍然与一些使用该类的服务挂钩。

    一篇有点过时的关于PHP设计模式的文章,仍然值得一读,但是很难看。

    短版:

    如果你曾经依赖于一个数组来保存一个特定的结构,它可能应该在一个类。


    我生活中的一个例子:ActiveRecord

    如果我想建立一个网站,不需要任何特定的活动记录实现吗?目前,一旦我选择了一种实现,我就会陷入困境,因为它们都是如此独特。如果他们实际上实现了ActiveRecordInterface,如果我想改变,我将能够交换出我的实际ActiveRecordEngine

  • 我在15年前学习了面向对象编程,并一直在c++、Java、Pascal中使用它。那时的PHP远没有现在强大。PHP花了大约10年的时间来正确地实现对象。它们最终工作得很快,引用被正确传递。

    不幸的是,许多从PHP开始的开发人员并没有掌握正确的面向对象的软件设计。类通常被用作"库",每个人都在谈论解耦和所有东西都是独立的,所以在许多情况下,类不会有父类。

    没有每个人都同意和使用的坚实基础。当您转向框架时,就正确的OOP而言,有些框架更好,而另一些则最差。例如,合适的Code Igniter框架是快速、安全、易用的,但它的OOP设计非常糟糕。主要原因是与PHP4的兼容性。

    对于结构更好的框架,只需查看其中一些组件的源代码:

    Yii中的选项卡:http://code.google.com/p/yii/source/browse/tags/1.1.8/framework/web/widgets/CTabView.php

    Agile Toolkit中的选项卡:https://github.com/atk4/atk4/blob/master/lib/View/Tabs/jUItabs.php

    标签在CakePHP:http://bakery.cakephp.org/%20articles/view/4caea0e3 ac74 - 409 b - 8693 - 435282 - f0cb67

    我的结论是语言本身是可以的,但是有很多写得很糟糕的代码。

    不应该是这样的。monser类总是"不好"的,因为它很难修复bug/实现新功能或维护代码。

    仅仅因为人们写了代码并提供了源代码并不意味着它总是好的代码。

    你习惯的原则(小班只做好一件事)是好的。但并不是每个开发人员都遵循这些原则。

    在PHP的世界里,很多人从早期就开始努力,那时所有的东西都是在一个单一的过程式的整体代码块中——我已经看到了一些仍然在日常使用的可怕的例子。对于一些人来说,将一个人的思维方式从那种结构转变为面向对象结构可能是一个很大的飞跃,甚至对于没有这种背景的人来说,他们将学习的许多代码示例都是如此,所以看到怪物类并不奇怪。

    简短的回答是用你习惯的方式和别人教你的方式写代码。听起来你比大多数PHP开发人员有更好的编码实践,所以不要因为其他人的做法不同就觉得你必须改变。

    不知道这是否回答了您的问题,但我的经验是,由于PHP对名称空间和封装的支持较差,PHP脚本和插件(如您提到的日历)以怪物类的方式构建是相当常见的。Javascript也是如此,在某些情况下(例如jQuery)也倾向于使用超大类。