Встречал и сам писал библиотеки одного .hpp файла. Удобно, что не нужно повторять код. Чем это может быть плохо? Вот пример довольно популярной и удачной библиотеки.
Ответ
Плохо в этом то, что вы теряете преимущества раздельной компиляции.
Во-первых, это время. Ваша функция будет компилироваться каждый раз, когда cpp-файл включает этот header. Хуже того, теперь при каждом изменении подробностей реализации придётся перекомпилировать не один cpp-файл с имплементацией, а все, которые включают ваш header.
Во-вторых, это увеличивающееся количество зависимостей. Если вам для декларации функции не нужны другие header'ы, а для имплементации нужны, то теперь вы вынуждены включать всё в header, и значит, все, кто его используют ваш header, тоже будут «видеть» эти другие header'ы.
К этому непосредственно примыкает и проблема номер 3: кольцевые зависимости. Допустим, у вас есть две функции в разных файлах, которые вызывают друг друга. Если в header'ах только декларации функций, то cpp-файлах можно подключить недостающий header, и функции могут легко ссылаться друг на друга. В случае, когда имплементация в header'е, такое не пройдёт из-за взаимной рекурсии включений, и вам придётся идти на уродливые трюки наподобие «точно знать, какие функции нужны другому header'у, и предварительно объявить их перед включением».
И наконец, вы теряете инкапсуляцию: любой может видеть вашу имплементацию, и это провоцирует кодировать используя знание о том, как же там всё реально устроено (что по очевидным причинам плохо).
Заметьте, что если ваша функция — шаблонная, то вам скорее всего таки придётся объявлять её полностью в header'е, и столкнуться со всеми вышеперечисленными проблемами.
Комментариев нет:
Отправить комментарий