У меня есть проект, который содержит несколько подмодулей, которые взаимодействуют с использованием некоторых объектов, которые сериализуются одним процессом, а затем десериализуются другим процессом и используются в этой другой точке.Таким образом, эти объекты должны содержать логику для использования в первом процессе, во втором процессе, а также логику сериализации и десериализации.
Чтобы упростить построение проекта, каждый процесс сначала создает библиотеку, а затем связывается с этой библиотекой (используя специализированное основное), чтобы построить собственно процесс.Все части, которые управляют связью (то есть все сквозные объекты), также содержатся в других более общих библиотеках.
Теперь проблема состоит в том, что код для использования универсальной библиотеки содержит методы, которые ссылаются на другие объекты извторой процесс.Таким образом, структура выглядит примерно так:
- ProcessA:
- Зависит от libA libGeneric
- ProcessB:
- libGeneric содержит код, который ссылается на части libA и libB
Таким образом, я получаю зависимость processA для libB, которая мне не нужна.Зависимость просто для удовлетворения компоновщика, потому что код, который использует libB, никогда не вызывается (но компоновщик не будет этого знать).Так что сейчас я связываю в libB с processA, хотя код из этой библиотеки не будет выполняться.
Есть ли лучший способ справиться с такой ситуацией?Другой идеей было бы просто определить интерфейс и включить только те методы, которые фактически используются повсюду в libGeneric, и поместить другие методы в libB.Однако тогда я бы отделил объект от libGeneric, что усложнило бы его обслуживание.
Я использую G ++ 4.4 для компиляции.
edit: так как я не могу опубликовать код из реального проекта здесьнекоторый структурированный псевдокод, который мог бы показать проблему более четко:
class Record {
public:
void produce(...) // called from Process A
std::string serialize() const;
void deserialize(const std::string &);
void do_something(queue) { // called from process B
// this logic is actually more complicated (depends on subclasses of Record)
// i.e. cannot be moved out of this class without getting ugly
queue.add_for_further_processing( this ); // The queue is part of ProcessB
}
};
Из этого лучший метод, кажется, удаляет все потоки (часть которых является частью очереди) в общий подмодуль, а затем все процессы используют это.