Композиция и круговая зависимость

  • Канал содержит элементы типа E.
  • Канал также имеет порт, который дает доступ к элементам в канале.

Это должно выглядеть примерно так:

template<
    typename E>
class IOutPort{
public:

    ...

    /**
    *    Takes an element (chosen by the implementation) that is in channel
    *
    *    @return
    *        The element
    */
    virtual E take() = 0;
};

template<
    typename E>
class IChannel {
public:

    ...

    /**
    *    Gives access to the out port of this channel
    *
    *    @return
    *        A smart pointer to the channel's port
    */
    virtual std::shared_ptr<IOutPort<E>> getOutPort() = 0;
};

Они оба должны ссылаться на себя..
Кроме того:

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

Разрыв круга с помощью weak_ptr может привести к преждевременному разрушению канала!

Какому шаблону лучше всего следовать, не объединяя два интерфейса??

EDIT: @Edwin Да, я уже проверил существующие обсуждения... Ответ, который я ищу, более этичен, чем технический...

По существу, каковы преимущества композиции на таком языке, как C++, в котором отсутствует управление памятью и удобство использования «этого» во время построения, когда составному объекту требуется доступ к компоновщику?

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


person MrAduer    schedule 07.12.2011    source источник
comment
Я не знаю, заметили ли вы, но многие темы, заданные на боковой панели справа, звучат ужасно похоже на то, что вы спрашиваете. Вы проверили их сначала, прежде чем публиковать вопрос?   -  person Edwin    schedule 08.12.2011


Ответы (1)


Вопрос слишком абстрактный и отделен от приложения. Что происходит, когда ваши вещи в канале меняются, кто отвечает за распространение через порт? Будет ли приложение лучше обслуживаться потоковым протоколом, а не объектно-ориентированным API? Сколько каналов и сколько прослушивателей портов будет?

person peter karasev    schedule 07.12.2011
comment
Он работает в параллельной среде. Когда агент готов обработать один элемент, он вызывает «взять» из порта. Другие могут делать то же самое... Но только один элемент извлекается из порта за раз, поэтому реализация и политика планировщика способствуют некоторой форме сериализации. Абстракция «канал» предназначена для сокрытия семантики вставки элемента: это может быть очередь ограниченного размера, очередь с приоритетом (каждая вставка должна нести информацию о приоритете...), рандеву между вставщиком и ожидающий покупатель и т. д. - person MrAduer; 08.12.2011