2015-01-14 45 views
1

我目前在建设一个新的 “框架” “CMS”为我的网站的过程 - 在此之前,一切都在使用“程序”的方法建立(使用全局,以防止冗余信息等)。这并不是什么值得炫耀的东西。这是我第一次走出了“面向对象”的工作,所以尽量不要用我可能扭曲的逻辑被吓坏了。是否允许类的“双重依赖”?

我似乎遇到了一些有点粗略。逻辑上(据我所知),它似乎是最好的解决方案,但即使如此,它似乎并不正确。

例如,说我有下面的类:

class BindClass { 

    public $DATABASE; 
    public $USER; 
    function __construct($database,$user) { 
    $this->DATABASE = $database; 
    $this->USER = $user; 
    } 

} 

$DATABASE是类Database的实例,值$USER是类User的一个实例:

$database = new Database(); // Database 
$user = new User($database); // User Information 
$bind = new BindClass($database,$user); 

注意如何User取决于Database(要访问用户信息),以及如何BindClass同时取决于UserDatabase。既然User已经包含Database,那在技术上会不会是两个Database的情况全都说&做完了?

是不是达到我想要的结论(BindClass能够访问的User & Database“属性”)以适当的方式,如果是这样,什么是“正确的方式”?我最关心的是,我“包括”一些已经被“连接”到Database

+0

@JasonMcCreary解释?我使用了不正确的术语吗?该网站的“以前”迭代并没有太多开始,也没有完成。 –

+0

+为问题的OOP部分。你是对的,理想情况下你不需要在课堂上重叠。虽然你没有解释“BindClass”的用途,但几乎肯定不应该存在。 –

+0

@JasonMcCreary'BindClass'应该是“持有”各种依赖的东西,这样我就不必手动确定这些依赖关系的位置。 –

回答

1

TL; DR:你举的例子的设计是完全正常的,其实它是如何事情应该在没有特定信息来实现这些类是什么,它们究竟是什么应该做一个教科书式的范例。

我主要关心的是我“包括”了一些已连接到数据库的 。

您的主要关注点应该是确保每个类都准确地涉及并将其依赖关系及其预期的公共接口传达给外部世界。

如果一个类如Database确实需要一些User的服务,以自身的客户提供服务,然后Database应采取的UserInterface一个实例(这是更好地使用这个,而不是具体的类型接口)作为依赖项,例如通过需要该类型的构造函数参数。

从上面的完全独立,如果它是有道理的Database,以便更好地履行其预期功能然后通过各种手段给它返回的UserInterface实例的公共方法暴露有点像User给客户(再次,不是具体的类型要好得多,尽管在这种情况下,我们谈论的是PHPDoc的意见作为语言不能强制基于返回值的类型限制)。如果Database的工作不是为其客户提供User然后它不必在意它已经有User,并且这些客户可能希望为他们自己的目的获得一个。

注意,你没有这两个实例一User这里,只有两个引用同一个实例 - 没有开销。但是,如果你想无论出于何种原因(单元测试是一个相当常见的情况),那么你可以两个实例,如果你有BindClass这将是不可能做拉UserDatabase