В моей компании мы используем кроссплатформенную библиотеку утилит, предоставляющую множество услуг.
Это включает в себя как кроссплатформенный код (например, класс потока, заключающий в себе либо Win32, либо pthread API), так и каждый специфический для компании код (например, классы для обработки собственного протокола связи между нашими серверами и нашими клиентскими приложениями).
Нам необходимо доставить часть этих функций клиенту, который согласен использовать те же параметры компилятора и компилятора, что и в библиотеке.
В настоящее время мой дизайн направлен на то, чтобы каждая версия нашей библиотеки имела бинарный интерфейс, совместимый с предыдущими:
- Доставка библиотеки DLL / SO
- Использование простых и понятных соглашений об именах (вдохновлено Java camelCaseNaming и т. Д.)
- Использование STL
- Использование глобального пространства имен (и префикс любого макроса с не двусмысленным именем, чтобы избежать конфликта имен)
- Выбор всех классов, которые необходимо использовать
- Кислородная обработка всего (и предоставление «публичной части» клиенту)
- Упрощение и унификация наших интерфейсов
- В наших классах PImpl нет виртуальных методов
- Нет встроенного кода, за исключением исключения (даже константы являются экспортированными значениями констант, определены в скомпилированном источнике и просто объявлены в общедоступном заголовке)
- Исключительный встроенный код для служебных / косвенных функций без большого количества кода внутри (например, функция подкачки была бы встроенной, вызывая не встроенный метод подкачки объекта, который она обменивает)
- Исключительный встроенный код для некоторых простых «классов значений» без реального кода, чтобы избежать ненужных накладных расходов (например, класс комплексных чисел будет встроен)
- Предложение высокоуровневых сервисов (о которых описываются классы PImpl-ed) через встроенный код (то есть клиент может повторно использовать / модифицировать его для своих нужд)
Мой список полон, или я что-то упустил, что упростило бы дальнейшее обслуживание / развитие?
Является ли один из моих пунктов ошибкой?