Как лучше организовать код в проектах C++

Я в настоящее время нахожусь в процессе попытки организовать мой код лучшим способом.

Чтобы сделать это, я использовал пространства имен, группируя классы компонентами, каждый имеющий определенную роль и несколько интерфейсов (на самом деле Абстрактные классы).

Я нашел, что это было довольно хорошо, особенно когда я должен был переписать весь компонент, и я не сделал почти ни с каким влиянием на другие. (Я полагаю, что это было бы намного более трудно с набором запутавшихся классов и методов),

Все же я не на 100% доволен им. Особенно я хотел бы сделать лучшее разделение между интерфейсами, общедоступной поверхностью компонентов и их реализациями в позади. Я думаю, что 'интерфейс' самого компонента должен быть более ясным, я подразумеваю, что новый посетитель должен понять легко, что взаимодействует через интерфейс, он должен реализовать, что взаимодействует через интерфейс, он может использовать и что является частью реализации.

Скоро я запущу больший проект, включающий до 5 devs, и я хотел бы быть ясным в своем уме на той точке.

Таким образом что относительно Вас? как дела это? как Вы организуете свой код?

5
задан f4. 21 January 2010 в 19:41
поделиться

5 ответов

Особенно я хотел бы сделать лучше разделение между интерфейсами, общественное лицо компонентов, а также их реализации в позади.

Я думаю, что вы ищете, - это фасад :

Фасад - это объект, который обеспечивает упрощенный интерфейс для большего количества корпуса кода, такой как библиотека классов. - Wikipedia

Вы также можете посмотреть посредством Mediator и Builder , если у вас есть сложные взаимодействия в ваших классах.

PIMPL IDIOM (брандмауэр компилятора AKA) также полезен для скрытия деталей реализации и сокращение времени сборки. Я предпочитаю использовать Pimpl Over Interface Classe + Factories, когда мне не нужен полиморфизм. Будьте осторожны, чтобы не перевернуть его, хотя. Не используйте Pimpl для легких типов, которые обычно выделяются на стеке (например, 3D-точка или сложное число). Используйте его для большего количества дольше проживаемых классов, которые имеют зависимости от других классов / библиотек, которые вы хотите скрыть от пользователя.

В крупномасштабных проектах важно не использовать директивы #Include в файле заголовка, когда будет делать простая передовая декларация. Только поставьте директивы #Include в заголовочном файле, если это абсолютно необходимо (предпочитаю положить #Includes в файлах реализации). Если сделано правильно, правильно #include дисциплина будет значительно сократить ваши времена компиляции. Pimpl IDIOM может помочь переместить #InCludes из файлов заголовка в соответствующие файлы реализации.

Когерентная коллекция классов / функций может быть сгруппирована вместе в своем собственном пространстве имен и поместить в подкаталог вашего исходного дерева (подкаталог должен иметь то же имя, что и пространство имен библиотеки). Затем вы можете создать статическую библиотеку SubProject / Makefile для этого пакета и связать его с помощью основного приложения. Это то, что я рассмотрел «пакет» в Умле Джаргона. В идеальной упаковке классы тесно связаны друг с другом, но свободно связаны с классами за пределами пакета. Полезно рисовать диаграммы зависимостей ваших пакетов, чтобы убедиться, что нет циклических зависимостей.

4
ответ дан 15 December 2019 в 06:27
поделиться

Вы можете найти некоторые из предложений в крупномасштабных программных программ C ++ полезны. Это немного датировано (опубликовано в 1996 году), но все же ценно, с указателями на структурирующий код, чтобы минимизировать «перекомпилировать мир при изменении файла одного заголовка».

1
ответ дан 15 December 2019 в 06:27
поделиться

Сначала заявляйте, что вы переменные, вы можете использовать их в одном объявлении строки.

 char Name[100],Name2[100],Name3[100];
 using namespace std;
int main(){

 }

И если у вас длинный кусочек кода, который может быть использован из программы, сделает ее новой функцией. вот так.

void Return(char Word[100]){
cout<<Word; 
cin.ignore();    
} 
int main(){ 
Return("Hello");
} 

И я предлагаю любые внешние функции и декларации, которые вы помещаете в заголовочный файл и связываете об этом вот так Dev-c ++ #include "Resource.h"

-6
ответ дан 15 December 2019 в 06:27
поделиться

Вы не можете сделать это в одном запросе в Джангу. Вы можете получить клиента только с датой их самой последней покупки, такой как это:

from django.db.models import Max
customers = Customer.objects.annotate(Max('purchase__date'))

, но вы автоматически не получаете доступ к фактической покупке таким образом.

-121--3713338-

Существует два распространенных подхода:

Если, помимо общедоступного интерфейса, вам нужен только функции помощника, просто поместите их в неназванное пространство имен в файле реализации:

// header:

class MyClass {
// interface etc.
};

// source file:

namespace {
    void someHelper() {}
}

// ... MyClass implementation

, если Вы хотите скрыть функции участников, рассмотреть возможность использования Pimpl IDIOM:

class MyClassImpl; // forward declaration

class MyClass {
public:
    // public interface
private:
    MyClassImpl* pimpl;
}; 

MyClassimpl реализует функциональность, а MyClass пересылает вызовы общедоступного интерфейса к частной реализации.

4
ответ дан 15 December 2019 в 06:27
поделиться

Статья трав Sutter на « Что в классе? - Принцип интерфейса » представляет некоторые идеи, которые многие, похоже, не думают при разработке интерфейсов. Это немного датировано (1998), но там есть некоторые полезные вещи, тем не менее.

0
ответ дан 15 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: