Разбор ООП с Delphinum

26.92K
.
Delphinum, у меня нет скайпа, гг.

Я просто уже уверен в том что тут лучше делать всё через горизонтальное пере использование.
Меня только смущает что при этом класс коллектора выйдет каким то притянутым за уши:

class EntityCollector implements EntityCollectorInterface {
    use EntityCollectorTrait;
}


и это всё что в нём будет.
.
если у тебя подразумевается повторное использование EntityCollectorTrait где то еще, то норм.
.
Delphinum, ну да, в EntityManager'e.
.
L!MP, я не знаю как там у тебя реализовано, но обычно (та же доктрина) менеджер не есть коллекция, менеджер это фассад для: Unit of Work + Object reflector + Query builder + Mapper - а коллекция это просто массив (или объект его представляющий) со всякими полезными плюшками и дочной в виде ProxyCollection для LazyLoad
.
я, к примеру, в моей новой, мегакрутой (и никогда не завершенной) CMS использую в качестве Collection простой массив, а Manager так вообще из современного умеет только проксировать связи для Lazy Load через Closure
.
Delphinum, ну названия ж я просто как попало написал.
Это не библиотека работы с БД и даже не с данными вообще.
.
L!MP, ну я то не знаю что это, у меня для понимания только названия ))
.
Delphinum, я не стал писать реальные названия классов чтоб не переводить внимание с вопроса на сам контекст, так как он не важен.

Так то речь идёт о DI контейнере.
У него есть биндинги, он сам является коллекцией биндингов, плюс есть возможность создания конекстных биндингов, а значит и есть пул коллекций для каждого контекста.
Вот я у хотел понять как лучше разделить функциональность коллекций между самим контейнером и собственно коллекциями.

Раньше я просто делал базовую коллекцию и проксировал к ней вызовы внутри контейнера.
То есть:
class Container {
    protected $bindings;

    public function __construct() {
        $this->bindings = new BindingCollector;
    }

    public function hasBinding($type) {
        return $this->bindings->hasBinding($type);
    }
}

А потом подумал что зачем так делать, можно же реализовать функционал коллекции внутри самого контейнера.
.
L!MP, я плохо понял твою задачу, если честно. Что за биндинги у тебя в DI?
.
И варианта тут как бы два теперь: унаследовать контейнер от коллекции или выделить функционал коллекции в трейт который потом применить как в контейнер, так и в классе коллекции.

Первый вариант туп потому что коллекция не является надмножеством контейнера и наследование делать не кошерно.

А второй вариант туп, потому что коллекция как самостоятельный класс все равно нужен, но так как весь её функционал будет реализован в трейте, то сам класс коллекции будет просто содержать его подключение (как я выше давал пример кода).
Всего: 713