0

我帮助设计和实现了用 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();
             }
            }

类 bar 和 widget 可能不需要扩展 foo,但是这些对象中的方法不会知道 foo 在不发送参数的情况下知道的常见事物。

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

4

2 回答 2

1

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

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

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

于 2012-06-21T18:16:51.467 回答
1

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

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

“如果它叫起来像鸭子,看起来像鸭子但需要电池,它可能是鸭子,但可能不是。”</p>

Liskov 原则很简单,确保当你扩展某些东西时,你不会改变类的契约。如果一个类过去在函数上返回一些东西,而你扩展它以返回一些完全不同的东西,用户怎么知道如何适应?您正在破坏可重用性的目的,因为您提供了一个标识为它扩展的基类的类,但它的行为不像具有附加功能的基类。

我最建议的是,您始终尝试使您的类层次结构尽可能真实,但始终记住 SOLID 原则。有关 SOLID 的更多信息,请查看我的博客:

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

祝你好运

于 2012-06-21T18:20:36.913 回答