Несколько ресурсов в моей системе используют концепцию коллекций объектов на основе коллекций Java.Объектно-ориентированный метод Bridge
Этот класс коллекции (абстрактный) обеспечивает базовую функциональность для другого конкретного класса, называемого списками, которые позволяют находить объекты через Индексы коллекции.
Я буду использовать в качестве примера свой класс HTTP-заголовков для объяснения.
У меня в своем конструкторе экземпляр этого класса классов. Каждое поле заголовка HTTP добавляется в коллекцию через метод Headers :: addHeader().
Очевидно, что у меня есть геттер метод, называемый getHeaders(), которые возвращают коллекции хранения, а не в коллекции объектов.
Итак, если мне нужно указать заголовок вне этого класса, мне просто нужно позвонить $ obj -> getHeaders(), и у меня есть ArrayObject со всеми добавленными объектами.
Хорошо!
Но в последнее время возникла необходимость использовать один из методов List, Списки :: find(), который находит объект, даже не знающий имя объекта или его конкретную позицию в хранилище коллекции.
Поскольку объект List находится в закрытом свойстве, Headers :: getHeaders() возвращает хранилище коллекций, и я не хочу нарушать инкапсуляцию, делая это свойство общедоступным, я не могу получить доступ к этому методу.
Все, что я код, помимо функциональности, должны быть зрительно изящным, и создать еще один метод получения, скажем, getHeadersLists() будет продуцируют вызов, как:
$obj -> getHeadersLists() -> find('foo');
Это некрасиво!
Итак, я быстро добавил __call() в заголовках класса и он работал отлично:
$obj -> find('foo');
Но кто-то я знаю (и он очень сведущим в Object Orientation теме) сказал мне, что это не так.
Мой аргумент был исключительно ориентирован на удобочитаемость, и он противопоставлял аргументы «в ориентации объектов, магических методах и читаемости не может сосуществовать».
И что? Что я должен сделать, чтобы создать этот «мост» между этими двумя классами, не используя _call() и сохраняя принципы ориентации объекта?
Я знаю, я мог бы вернуть объект коллекции в заголовках :: getHeaders() и использовать что-то вроде:
$obj -> getHeaders() -> find();
Но что-то я узнал об ориентации объектов ответственность. Ответственность этого метода, как сказано в заявлении, заключается в том, чтобы вернуть все Заголовки, а не внешний объект.
+1 для этого же здесь. –
Хорошо, но защищенная видимость в этом случае не поможет, потому что я не вызываю метод в контексте наследования. Подумайте так: Header ** использует ** Списки, а не Header ** - это ** Список. И, расширяя список, мой класс заголовков станет зависимым. –