Как лучше организовать код в проектах C++
В настоящее время я пытаюсь организовать свой код лучше.
Для этого я использовал пространства имен, группируя классы по компонентам, каждый из которых имеет определенную роль и несколько интерфейсов (фактически абстрактные классы).Я нашел, что это довольно хорошо, особенно когда мне пришлось переписать весь компонент, и я сделал это почти без влияния на другие. (Я думаю, что это было бы намного сложнее с кучей смешанных классов и методов)
И все же мне не 100 лет.% доволен этим. Особенно я хотел бы сделать лучшее разделение между интерфейсами, публичным лицом компонентов и их реализациями в behind. Я думаю, что "интерфейс" самого компонента должен быть более четким, я имею в виду, что новичок должен легко понять, какие интерфейсы он должен реализовать, какие интерфейсы он может использовать и что является частью реализации.
Скоро я начну более крупный проект, включающий до 5 разработчиков, и я хотел бы прояснить свой ум на этот счет.
Итак Что насчет тебя? как вы это делаете? как вы организуете свой код?
5 ответов:
Особенно я хотел бы сделать лучше. разделение между интерфейсами, публичное лицо компонентов, и их реализация в тылу.
Я думаю, что вы ищете фасад шаблон:
Фасад-это объект, который предоставляет упрощенный интерфейс для большого объема кода, такого как библиотека классов. -- ВикипедияВы также можете посмотреть на паттерны посредника и строителя, Если у вас есть сложные взаимодействия в ваших классах.
ИдиомаPimpl (aka compiler firewall) также полезна для сокрытия деталей реализации и сокращения времени сборки. Я предпочитаю использовать Pimpl над интерфейсными классами + фабриками, когда мне не нужен полиморфизм. Однако будьте осторожны, чтобы не злоупотреблять им. Не используйте Pimpl для легковесных типов, которые обычно выделяются в стеке (например, 3D-точка или комплексное число). Используйте его для больших, более долгоживущих классов, которые имеют зависимости от других классы / библиотеки, которые вы хотели бы скрыть от пользователя.
В крупномасштабных проектах важно не использовать директивы #include в заголовочном файле, когда достаточно простого прямого объявления. Только поместите директивы #include в заголовочный файл, если это абсолютно необходимо (предпочитайте помещать #includes в файлы реализации). Если все сделано правильно, правильная дисциплина #include значительно сократит время компиляции. Идиома Pimpl может помочь переместить #includes из заголовочных файлов в их соответствующие файлы реализации.
Связную коллекцию классов / функций можно сгруппировать в собственном пространстве имен и поместить в подкаталог дерева исходных текстов (этот подкаталог должен иметь то же имя, что и пространство имен библиотеки). Затем вы можете создать статический библиотечный подпроект / makefile для этого пакета и связать его с вашим основным приложением. Это то, что я бы назвал "пакетом" на языке UML. В идеальном пакете классы тесно связаны друг с другом, но слабо связано с классами вне пакета. Полезно нарисовать диаграммы зависимостей ваших пакетов, чтобы убедиться в отсутствии циклических зависимостей.
Есть два общих подхода:
]}
Если, кроме открытого интерфейса, вам нужны только некоторые вспомогательные функции, просто поместите их в безымянное пространство имен в файле реализации:
// header: class MyClass { // interface etc. }; // source file: namespace { void someHelper() {} } // ... MyClass implementation
Если вы хотите скрыть функции-члены, рассмотрите возможность использования идиомы PIMPL:
class MyClassImpl; // forward declaration class MyClass { public: // public interface private: MyClassImpl* pimpl; };
MyClassImpl
реализует функциональность, в то время какMyClass
перенаправляет вызовы публичного интерфейса в частную реализацию.
Вы можете найти некоторые из предложений в крупномасштабном программном обеспечении C++ полезными. Он немного устарел (опубликован в 1996 году), но все еще ценен, с указателями на структурирование кода, чтобы свести к минимуму проблему "перекомпиляции мира при изменении одного заголовочного файла".
Статья Херба Саттера о " Что такое класс? - Принцип интерфейса " представляет некоторые идеи, о которых многие, кажется, не думают при проектировании интерфейсов. Он немного устарел (1998), но, тем не менее, там есть кое-что полезное.
Сначала объявите переменные, которые вы можете использовать в одном строковом объявлении также так.
char Name[100],Name2[100],Name3[100]; using namespace std; int main(){ }
И если у вас есть длинный кусок кода, который можно использовать вне программы, сделайте его новой функцией. likeso.
void Return(char Word[100]){ cout<<Word; cin.ignore(); } int main(){ Return("Hello"); }
И я предлагаю любые внешние функции и объявления, которые вы помещаете в файл заголовка и связываете его likeso Dev-C++ #include " ресурс.h "