В наших в основном больших приложениях у нас обычно есть только несколько мест для «констант»:
- Один класс для графического интерфейса пользователя и внутренних констант (заголовки вкладок, заголовки групповых блоков, коэффициенты вычислений, перечисления)
- Один класс для таблиц и столбцов базы данных (эта часть является сгенерированным кодом) плюс читаемые имена для них (назначаются вручную)
- Один класс для сообщений приложений (регистрация, окна сообщений и т. Д.)
Константы обычно разделяются на разные структуры в этих классах. В наших приложениях C ++ константы определяются только в файле .h, а значения назначаются в файле .cpp.
Одним из преимуществ является то, что все строки и т.д. находятся в одном центральном месте, и каждый знает, где их найти, когда что-то должно быть изменено.
Особенно это нравится менеджерам проектов, когда люди приходят и уходят, и таким образом каждый может изменить такие тривиальные вещи, не углубляясь в структуру приложения.
Кроме того, вы можете легко изменить название похожих групповых блоков / вкладок и т. Д. Сразу. Другой аспект заключается в том, что вы можете просто напечатать этот класс и передать его непрограммисту, который может проверить, являются ли заголовки интуитивно понятными, а также являются ли сообщения пользователю слишком подробными или слишком запутанными и т. Д.
Однако я вижу определенные недостатки:
- Каждый отдельный класс тесно связан с классами констант
- Добавление / удаление / переименование / перемещение константы требует перекомпиляции как минимум 90% приложения (Примечание: изменение значения не происходит, по крайней мере для C ++). В одном из наших проектов C ++ с 1500 классами это означает около 7 минут времени компиляции (с использованием предварительно скомпилированных заголовков; без них - около 50 минут) плюс около 10 минут соединения с определенными статическими библиотеками.
- Создание оптимизированного по скорости выпуска с помощью компилятора Visual Studio занимает до 3 часов. Я не знаю, является ли огромное количество классовых отношений источником, но это может быть так.
- Вы попадаете в строки временного жесткого кодирования прямо в код, потому что вы хотите очень быстро что-то тестировать и не хотите ждать 15 минут только для этого теста (и, вероятно, каждого последующего). Все знают, что происходит с мыслями «Я исправлю это позже».
- Повторное использование класса в другом проекте не всегда так просто (в основном из-за других жестких связей, но обработка констант не делает это проще).
Где бы вы хранили такие константы? Кроме того, какие аргументы вы бы привели, чтобы убедить своего менеджера проекта, что есть лучшие концепции, которые также соответствуют перечисленным выше преимуществам?
Не стесняйтесь давать C ++ - конкретный или независимый ответ.
PS: я знаю, что этот вопрос довольно субъективен, но я, честно говоря, не знаю лучшего места, чем этот сайт для такого рода вопросов.
Обновленная информация об этом проекте
У меня есть новости о времени компиляции:
следуя сообщениям Caleb и gbjbaanb, я разбил свой файл констант на несколько других файлов, когда у меня было время. Я также со временем разделил свой проект на несколько библиотек, что стало теперь намного проще. Компиляция этого в режиме выпуска показала, что автоматически сгенерированный файл, который содержит определения базы данных (таблицы, имена столбцов и более - более 8000 символов) и создает определенные хэши, вызвал огромное время компиляции в режиме выпуска.
Отключение оптимизатора MSVC для библиотеки, которая содержит константы БД, теперь позволило нам сократить общее время компиляции вашего Проекта (нескольких приложений) в режиме выпуска с 8 часов до менее одного часа!
Нам еще предстоит выяснить, почему MSVC так сложно оптимизировать эти файлы, но пока это изменение снимает большую нагрузку, поскольку нам больше не нужно полагаться только на ночные сборки.
Этот факт - и другие преимущества, такие как менее тесная связь, лучшая возможность повторного использования и т. Д. - также показали, что тратить время на разделение «констант» не так уж и плохо ;-)
Update2
Поскольку этому вопросу все еще уделяется некоторое внимание:
вот что я делал в последние несколько лет:
Поместите каждую константу, переменную и т. Д. Точно в область, релевантную для нее: если вы используете константу только в одном методе, то можно определить ее в этом методе. Если один класс заинтересован в этом, оставьте это как частную реализацию этого класса. То же самое относится к пространству имен, модулю, проекту, сфере деятельности компании. Я также использую тот же шаблон для вспомогательных функций и тому подобное. (Это может не применяться на 100%, если вы разрабатываете публичную структуру.)
Это увеличило возможности повторного использования, тестирования и поддержки до такой степени, что вы не только тратите меньше времени на компиляцию (по крайней мере, на C ++), но и меньше на исправление ошибок, что оставляет вам больше времени для фактической разработки новых функций. В то же время разработка этих функций будет проходить быстрее, поскольку вы сможете повторно использовать больше кода. Это перевешивает любое преимущество, которое центральный файл констант может иметь по величине.
Обратите особое внимание на Принцип Интерфейса Разделения Интерфейса и Принцип Единой Ответственности, если вы хотите узнать больше.
Если вы согласны, ответьте на вопрос Калеба, так как это обновление - в основном более общее представление о том, что он сказал.