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


PHP Abstract Object Design with Common Ancestor Redundancy

我帮助设计和实现用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 在不发送参数的情况下知道的常见事情。

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

创建一个框架需要大量的尝试,这些尝试会让你跌倒,然后重新站起来。

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

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

利斯科夫原理很简单,确保当你扩展时 有些东西,你没有改变类的契约。如果类 用于返回函数上的内容,并将其扩展为返回 完全不同的东西,用户将如何知道如何适应? 您正在破坏可重用性的目的,因为您正在提供 标识为它扩展的基类的类,但它没有 行为类似于基类,但添加了功能。

我最建议的是,你总是试图让你的类层次结构尽可能现实,但要始终记住SOLID原则。有关 SOLID 的更多信息,请查看我的博客:

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

祝你好运

如果它对您的应用程序有意义,则没有问题。

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

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