具有共同祖先冗余的PHP抽象对象设计

时间:2012-06-21 18:11:49

标签: php oop inheritance object abstract

我帮助设计和实现了用PHP编写的Droid API。虽然它工作得很好,但我总是希望重构我的代码。

在其他具有共同祖先的对象中是否可以使用对象?

这可能是一个基本问题,但我似乎无法找到信息来支持这是否是不良做法。

目标是让类foo为所有人提供常用的常量和方法。

示例:

            abstract class foo {
             //constants
             //common methods to all
            }

            class bar extends foo{
             //represents something
            }

            class widget extends foo {
             //represents something else
            }

            class controller extends foo{
                //controls flow
                public function __construct(){
                    $this->my_bar= new bar();
                    $this->my_widget= new widget();
             }
            }

类栏和窗口小部件可能不需要扩展foo,但这些对象中的方法不知道foo知道的常见事情而不发送参数。

似乎有太多的冗余,只是在寻找最佳实践。

2 个答案:

答案 0 :(得分:1)

如果您的应用程序有意义,那就没问题了。

举例来说,这正是PHP的DOM库的结构。几乎所有东西都是节点 - 文档,元素,属性,字符数据。它们都共享祖先DOMNode,即使它们彼此嵌套。

因此,如果它真的有意义(在你的抽象例子中很难说),那么绝对没有理由不这样做。实际上,如果各种对象共享功能,那么它可能是“最佳实践”。

答案 1 :(得分:1)

创建一个框架需要大量的尝试才能让你堕落然后重新站起来。

关于你的问题,最重要的是要确保你不会陷入Liskov替换原则所描述的陷阱:

  

“如果它像鸭子一样嘎嘎叫,看起来像鸭子,但需要电池,它   可能是一只鸭子,但可能不是。“

     

Liskov原则很简单,确保延伸时   某事,你没有改变班级的合同。如果是一个班级   用于返回函数上的某些内容并将其扩展为返回   根本不同的东西,用户将如何知道如何适应?   由于您提供的目的,您正在挫败可重用性的目的   一个标识为它扩展的基类的类,但它没有   表现得像添加了功能的基类。

我最建议的是,您总是尽量使您的班级层次结构尽可能真实,但始终要记住SOLID原则。有关SOLID的更多信息,请访问我的博客:

http://crazycoders.net/2012/03/confoo-2012-make-your-project-solid/

祝你好运