Удалить неиспользуемый метод в зависимости - PullRequest
2 голосов
/ 19 апреля 2011

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

Чтобы упростить построение проекта, каждый процесс сначала создает библиотеку, а затем связывается с этой библиотекой (используя специализированное основное), чтобы построить собственно процесс.Все части, которые управляют связью (то есть все сквозные объекты), также содержатся в других более общих библиотеках.

Теперь проблема состоит в том, что код для использования универсальной библиотеки содержит методы, которые ссылаются на другие объекты извторой процесс.Таким образом, структура выглядит примерно так:

  • ProcessA:
    • Зависит от libA libGeneric
  • ProcessB:
    • Зависитв libB libGeneric
  • 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
  }
};

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

1 Ответ

1 голос
/ 19 апреля 2011

Одним из способов решения этой проблемы является динамическое связывание с libB (если вас интересует размер исполняемого файла).

Другой вариант - вынести общий код из libA и libB в библиотеку (LibC).Тогда ваши программы должны будут связываться с libA и libC, а также с libB и libC.

Я не вижу другого способа обойти это.

...