В ООП должны ли зависимости содержать ссылку на своего родителя? - PullRequest
1 голос
/ 29 июня 2010

У меня есть объект Order для представления предполагаемого заказа / квитанции. Это сущность. У него есть личность.

У меня есть объект Writer, который читает свойства объекта Order и хорошо его отображает.

Это немного хлопотно - иметь отдельных получателей для всех частей Платежных реквизитов Клиента.

Итак, я подумываю о том, чтобы позволить объекту Writer получить объект значения данных для платежа клиента из объекта Order. (Я полагаю, что объект значения платежных данных клиента называется «зависимостью» - исправьте меня, если я ошибаюсь)

Теперь, если я сделаю это, я бы хотел, чтобы эта зависимость "знала", если исходные постоянные данные изменятся

т.е.. если countryId изменится с '214' на '35'

Так что зависимость может вернуть новую страну asPrettyString «Мексика», скажем, вместо старого значения «Эквадор».

Так что, я думаю, у меня был бы метод фабрики в Объекте заказа, и я мог бы внедрить Объект Заказа в конструктор Объекта Значения данных для выставления счета Клиента, чтобы Объект данных для выставления счета всегда выводил свои свойства из свойств исходных постоянных данных Заказа.

Является ли ваша реакция на этот план действий:

A: Блими, это очевидно, что это практически единственный способ сделать это

или

Б: Господи! Отведите некоторое время на серьезные головные боли через несколько месяцев - вы создадите клубок ассоциаций - я чувствую к вам.

или C: [Другое]


Я спрашиваю, потому что это кажется двунаправленной ассоциацией для меня.

Заказ имеет Объект платежных данных

и

Объект платежных данных имеет Заказ

и я прочитал, что двунаправленные ассоциации являются плохой практикой ООП.

Ответы [ 4 ]

0 голосов
/ 20 сентября 2010

Наличие дочернего класса содержит ссылку на родительский класс, усиливающий сцепление.Если это необходимо сделать, я предлагаю вам сделать родительский интерфейс интерфейсом, а потом сделать так, чтобы ребенок ссылался на интерфейс.Или вы можете попытаться передать соответствующую информацию дочернему классу через ассоциативный массив или контейнер данных.

0 голосов
/ 29 июня 2010

Все это началось, потому что «Это немного тяжелая работа - иметь отдельных получателей для всех частей платежных данных клиента».Можно ли было бы использовать PHP __ call для автоматической сборки этих методов получения?предоставить эту функциональность?

0 голосов
/ 29 июня 2010

Я собираюсь предложить вам создать класс Address.Ваш объект Order может иметь два свойства, BillingAddress и ShippingAddress, если вам нужны оба.У вас есть класс Writer для создания представления для заказа.Создайте класс 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 ...
}
0 голосов
/ 29 июня 2010
...