Распределение множества маленьких классов
У меня есть базовый класс под названием EventArgs
, Из этого вытекает множество специализаций, которые представляют аргументы события для определенного типа события. Потребителям этих событий может понадобиться несколько, много или очень мало этих классов аргументов.
У меня такой вопрос: вы бы предоставили файл заголовка для каждого типа (например, 50+ файлов заголовка для разных), попытались бы сгруппировать их в семейства и получить "общий" файл заголовка для них, или вы бы бросили осторожно к окну и добавьте их в один простой в использовании заголовочный файл, который можно просто включить?
Другой подход может состоять в том, чтобы иметь 50 заголовочных файлов, а затем я мог бы представить некоторые "семейные" заголовочные файлы, которые включали в себя определенные. Не уверен насчет соглашений об именах для таких вещей, поэтому очевидно, что и где.
Я знаю, что не может быть жесткого и быстрого правила, но мне интересно, что сделали другие разработчики, когда обнаружили, что пишут много маленьких классов.
Заранее спасибо.
5 ответов
Я должен был бы поместить два класса в отдельные заголовки в одном из следующих случаев:
- они огромные
- они не связаны или вряд ли будут использоваться вместе
- каждый из них вводит свои собственные зависимости заголовка
В противном случае, нет особого смысла их разделять. Я знаю, что у некоторых людей есть это правило "один класс на заголовок", но оно не выглядит разумным в вашем случае.
Что касается "семейств", включая множество небольших файлов, то в определенных системах сборки (и файловых системах) это может повлиять на время компиляции, и в любом случае я не вижу смысла в этом - обычно люди используют документацию или IDE. чтобы найти классы, не глядя на заголовки имен файлов. Так что вы могли бы сделать это только для упрощения включения, но почему бы не поместить их в один заголовок.
Я бы сгруппировал их по семьям в соответствии с классами, которые пользователи, вероятно, захотят использовать вместе. 50+ крошечных заголовочных файлов кажутся чрезмерными в любом случае.
Если они принадлежат к одной иерархии наследования, поместите их в один и тот же файл.h. Это поможет вам выбрать правильный порядок занятий. Одна из менее известных проверок времени компиляции в C++ основана на правильном порядке классов в файле.h.
Я был в подобной ситуации, когда я разрабатывал библиотеку GUI. Первоначально все компоненты (это были небольшие классы) имели общий заголовок и исходный файл. Это сработало довольно хорошо. Позже я попытался поместить их в отдельные файлы, но это ничего не улучшило. Это только добавило бремени тратить много времени на поиск этих файлов.
Помимо этого, возможно, вы можете черпать вдохновение из библиотеки Poco C++. Эта библиотека обычно следует за идиомой одного класса на заголовок, но есть исключения. Например, вся иерархия исключений кодируется в одном заголовочном и исходном файле с использованием системы на основе макросов (см. Exception.h и Exception.cpp).