在OOP中,依赖项是否应该引用其父级?

时间:2010-06-29 14:11:33

标签: php oop dependencies associations

我有一个Order对象来代表预期订单/收据。这是一个实体。它有一个身份。

我有一个Writer对象来读取Order对象的属性并很好地显示它。

为客户的账单明细的所有部分提供个人吸气器是一件苦差事。

所以,我想让Writer对象从Order对象中获取Client的Billing Details Value Object。 (我猜客户的账单明细值对象被称为'依赖' - 如果我错了,请纠正我)

现在,如果我这样做,我希望这种依赖关系“知道”原始持久数据是否会发生变化

即。如果countryId从'214'变为'35'

因此,依赖性可以返回新的countryAsPrettyString'Mexico',而不是“厄瓜多尔”的旧值。

所以我想我会在订单对象中有一个工厂方法,并且可以将订单对象注入客户的账单明细值对象的构造函数中,因此账单明细对象总是从订单的原始持久数据属性中获取它的属性。

您对此行动计划的反应如何:

A:Blimey显然这是实现它的唯一方法

B:我的天哪!在几个月的时间内留出一些时间来解决一些严重的问题 - 你会产生一些纠结 - 我觉得你。

或  C:[其他]


我问cos这对我来说似乎是一种双向联想。

订单 帐单明细对象

结算明细对象 订单

我已经读过双向关联是不好的OOP练习。

4 个答案:

答案 0 :(得分:0)

不确定我是否确切地知道你在问什么,但这可能会有所帮助:

Change bidirectional association to unidirectional

而且:

Change unidirectional association to bidirectional

答案 1 :(得分:0)

所有这一切都是因为“为客户的账单明细的所有部分提供个人吸气器是一件苦差事。”。

我不知道你的类是如何实现的,但是可以使用PHP的__call来自动构建这些getter吗?

如果您要设置一个约定,getBillingWhatever in Order将返回$ billing-> getWhatever()并实现__call以提供此功能,该怎么办?

答案 2 :(得分:0)

我建议你创建一个Address类。如果需要两者,您的Order对象可以有两个属性,BillingAddress和ShippingAddress。您有一个Writer类来为Order创建视图。创建AddressWriter类以创建Address对象的视图。然后你可以做这样的事情:

public function printOrder($order)
{
    // print order stuff here...

    $addressWriter = new AddressWriter();

    echo "<h1>Billing Address</h1>";
    $addressWriter->printAddress($order->getBillingAddress);

    echo "<h1>Shipping Address</h1>";
    $addressWriter->printAddress($order->getShippingAddress);

    // print more order stuff ...
}

答案 3 :(得分:0)

拥有子类保持对父类的引用会拉紧耦合。如果必须这样做,我建议你让父母成为一个接口,并让孩子参考接口。或者,您可以尝试通过关联数组或数据容器将相关信息传递给子类。