Я в настоящее время нахожусь в процессе попытки организовать мой код лучшим способом.
Чтобы сделать это, я использовал пространства имен, группируя классы компонентами, каждый имеющий определенную роль и несколько интерфейсов (на самом деле Абстрактные классы).
Я нашел, что это было довольно хорошо, особенно когда я должен был переписать весь компонент, и я не сделал почти ни с каким влиянием на другие. (Я полагаю, что это было бы намного более трудно с набором запутавшихся классов и методов),
Все же я не на 100% доволен им. Особенно я хотел бы сделать лучшее разделение между интерфейсами, общедоступной поверхностью компонентов и их реализациями в позади. Я думаю, что 'интерфейс' самого компонента должен быть более ясным, я подразумеваю, что новый посетитель должен понять легко, что взаимодействует через интерфейс, он должен реализовать, что взаимодействует через интерфейс, он может использовать и что является частью реализации.
Скоро я запущу больший проект, включающий до 5 devs, и я хотел бы быть ясным в своем уме на той точке.
Таким образом что относительно Вас? как дела это? как Вы организуете свой код?
Особенно я хотел бы сделать лучше разделение между интерфейсами, общественное лицо компонентов, а также их реализации в позади.
Я думаю, что вы ищете, - это фасад :
Фасад - это объект, который обеспечивает упрощенный интерфейс для большего количества корпуса кода, такой как библиотека классов. - Wikipedia
Вы также можете посмотреть посредством Mediator и Builder , если у вас есть сложные взаимодействия в ваших классах.
PIMPL IDIOM (брандмауэр компилятора AKA) также полезен для скрытия деталей реализации и сокращение времени сборки. Я предпочитаю использовать Pimpl Over Interface Classe + Factories, когда мне не нужен полиморфизм. Будьте осторожны, чтобы не перевернуть его, хотя. Не используйте Pimpl для легких типов, которые обычно выделяются на стеке (например, 3D-точка или сложное число). Используйте его для большего количества дольше проживаемых классов, которые имеют зависимости от других классов / библиотек, которые вы хотите скрыть от пользователя.
В крупномасштабных проектах важно не использовать директивы #Include в файле заголовка, когда будет делать простая передовая декларация. Только поставьте директивы #Include в заголовочном файле, если это абсолютно необходимо (предпочитаю положить #Includes в файлах реализации). Если сделано правильно, правильно #include дисциплина будет значительно сократить ваши времена компиляции. Pimpl IDIOM может помочь переместить #InCludes из файлов заголовка в соответствующие файлы реализации.
Когерентная коллекция классов / функций может быть сгруппирована вместе в своем собственном пространстве имен и поместить в подкаталог вашего исходного дерева (подкаталог должен иметь то же имя, что и пространство имен библиотеки). Затем вы можете создать статическую библиотеку SubProject / Makefile для этого пакета и связать его с помощью основного приложения. Это то, что я рассмотрел «пакет» в Умле Джаргона. В идеальной упаковке классы тесно связаны друг с другом, но свободно связаны с классами за пределами пакета. Полезно рисовать диаграммы зависимостей ваших пакетов, чтобы убедиться, что нет циклических зависимостей.
Вы можете найти некоторые из предложений в крупномасштабных программных программ C ++ полезны. Это немного датировано (опубликовано в 1996 году), но все же ценно, с указателями на структурирующий код, чтобы минимизировать «перекомпилировать мир при изменении файла одного заголовка».
Сначала заявляйте, что вы переменные, вы можете использовать их в одном объявлении строки.
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"
Вы не можете сделать это в одном запросе в Джангу. Вы можете получить клиента только с датой их самой последней покупки, такой как это:
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
пересылает вызовы общедоступного интерфейса к частной реализации.
Статья трав Sutter на « Что в классе? - Принцип интерфейса » представляет некоторые идеи, которые многие, похоже, не думают при разработке интерфейсов. Это немного датировано (1998), но там есть некоторые полезные вещи, тем не менее.