Очень хороший вопрос, и ответ не простой. Несколько вещей, чтобы рассмотреть. Вот несколько мнений из моего опыта.
Общий код и локальная копия проекта
Одним из важных решений является то, использовать ли «общий» код библиотеки, который автоматически обновляется из центрального расположения («библиотека повторного использования» вашей компании), или сохранять локальную копию проекта.
Это подробно обсуждается в этом вопросе .
Преимущество центральной библиотеки заключается в том, что однажды проделанная работа может принести пользу многим проектам. Сложность с локальной копией проекта заключается в том, что исправления и улучшения не вносятся обратно в центральную библиотеку, а исправления ошибок в центральной библиотеке могут не вноситься в ваш проект.
Но потенциальная трудность с использованием центральной библиотеки заключается в том, что люди, занимающиеся их конкретной деятельностью, изменяют ее неконтролируемым образом в соответствии со своим проектом, и она непреднамеренно нарушает другие проекты. Я видел это лично в «обычном» коде, который был полон #ifdefs и регулярно ломал другие проекты.
Чтобы получить хорошую выгоду от общего кода, также известного как центральная библиотека повторного использования:
Библиотека:
- должен иметь четко определенные требования, API и модульные тесты
- необходимо избегать кода, специфичного для проекта; оно должно быть универсальным
- должен иметь механизм для точной настройки параметров проекта (это можно эффективно рассматривать как часть API)
- должен иметь официальный процесс выпуска, с номерами версий и исправлениями, проблемы должны отслеживаться.
Индивидуальные проекты:
- не должен автоматически и вслепую получать «последнюю версию», но должен иметь возможность получить конкретный «выпуск» с указанным номером версии. Тогда проекты должны контролировать, обновляются ли они до более новой версии. Проект должен иметь возможность четко отслеживать «мы используем версию 1.2.3 библиотеки xyz».
- следует избегать "разветвления" кода библиотеки, если это возможно. Например. избегайте добавления специфичных для проекта «функций» в код библиотеки.
- должен отслеживать любые локальные изменения кода библиотеки
- должен рассматривать ошибки как ошибки библиотеки, которые должны быть исправлены в центральной библиотеке, если это вообще возможно. У компании должны быть процессы, чтобы исправить их в центральной библиотеке, протестировать библиотеку с помощью собственного набора модульных тестов (вероятно, улучшив модульные тесты, чтобы в будущем обнаружить ошибку). Затем выпустите новую версию центральной библиотеки по мере необходимости и разверните ее в других проектах, если / когда эти проекты сочтут нужным.
Если в компании нет такого процесса, то проект должен просто сделать локальную копию фрагмента кода (скажем, скопированного из предыдущего проекта), а затем взять на себя полную ответственность за проект. , Вы все еще получаете некоторую выгоду от повторного использования в этой ситуации, потому что вы не переписываете его с нуля.
Конфигурация для конкретного проекта
Если для кода требуется специфичная для проекта конфигурация, в идеале это должно быть как можно меньше, так как часть кода не должна быть разбросана по пачке исходных файлов. В идеале, один заголовочный файл. Но вполне возможно и файл .C (скажем, если вам нужно определить некоторые справочные таблицы). Библиотека должна предоставить шаблон с хорошо прокомментированными параметрами.
Хороший пример того, как это можно сделать, см. В ОСРВ µC / OS-II ( book ) от Jean Labrosse, от Micrium .