Существуют ли существенные недостатки в дизайне, связанные с сохранением определения класса в foo.h и разделением реализации функций на foo_apples.cpp и foo_oranges.cpp.
для выбора nits: Существуют ли существенные недостатки в дизайне, связанные с сохранением объявления класса в foo.h и разбиением определений методов на foo_apples.cpp и foo_oranges.cpp.
1) яблоки и апельсины могут использовать одни и те же частные программы. примером этого может быть реализация, найденная в анонимном пространстве имен.
в этом случае одним из требований было бы убедиться, что ваши статические данные не определены многократно. встроенные функции в действительности не являются проблемой, если они не используют статические данные (хотя их определения могут многократно экспортироваться).
Чтобы преодолеть эти проблемы, вы можете склониться использовать хранилище в классе - что может привести к появлению зависимостей за счет увеличения количества данных / типов, которые в противном случае были бы скрыты. в любом случае это может увеличить сложность или заставить вас писать свою программу по-другому.
2) увеличивает сложность статической инициализации.
3) увеличивает время компиляции
альтернатива, которую я использую (кстати, многие разработчики ненавидят) в действительно больших программах, заключается в создании коллекции экспортируемых локальных заголовков . эти заголовки видны только для пакета / библиотеки. в вашем примере это можно проиллюстрировать, создав следующие заголовки: Foo.static.exported.hpp
(при необходимости) + Foo.private.exported.hpp
(при необходимости) + Foo.apples.exported.hpp
+ Foo.oranges.exported.hpp
.
тогда вы бы написали Foo.cpp так:
#include "DEPENDENCIES.hpp"
#include "Foo.static.exported.hpp" /* if needed */
#include "Foo.private.exported.hpp" /* if needed */
#include "Foo.apples.exported.hpp"
#include "Foo.oranges.exported.hpp"
/* no definitions here */
Вы можете легко настроить разделение этих файлов в соответствии с вашими потребностями. если вы пишете свои программы с использованием соглашений c ++, редко возникают коллизии между огромными TU. если вы пишете как программист на C (много глобальных переменных, злоупотребление препроцессором, низкие уровни предупреждений и свободные объявления), то при таком подходе будет выявлено множество проблем, которые вы, вероятно, не захотите исправить.