我帮助设计和实现了用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知道的常见事情而不发送参数。
似乎有太多的冗余,只是在寻找最佳实践。
答案 0 :(得分:1)
如果您的应用程序有意义,那就没问题了。
举例来说,这正是PHP的DOM库的结构。几乎所有东西都是节点 - 文档,元素,属性,字符数据。它们都共享祖先DOMNode
,即使它们彼此嵌套。
因此,如果它真的有意义(在你的抽象例子中很难说),那么绝对没有理由不这样做。实际上,如果各种对象共享功能,那么它可能是“最佳实践”。
答案 1 :(得分:1)
创建一个框架需要大量的尝试才能让你堕落然后重新站起来。
关于你的问题,最重要的是要确保你不会陷入Liskov替换原则所描述的陷阱:
“如果它像鸭子一样嘎嘎叫,看起来像鸭子,但需要电池,它 可能是一只鸭子,但可能不是。“
Liskov原则很简单,确保延伸时 某事,你没有改变班级的合同。如果是一个班级 用于返回函数上的某些内容并将其扩展为返回 根本不同的东西,用户将如何知道如何适应? 由于您提供的目的,您正在挫败可重用性的目的 一个标识为它扩展的基类的类,但它没有 表现得像添加了功能的基类。
我最建议的是,您总是尽量使您的班级层次结构尽可能真实,但始终要记住SOLID原则。有关SOLID的更多信息,请访问我的博客:
http://crazycoders.net/2012/03/confoo-2012-make-your-project-solid/
祝你好运