Вопрос к Гуру.
Есть проект на С, достаточно объёмный, в к-м реализован (естественно на C)
аналог паттерна фабрика.
Сейчас, в связи со значительный расширением функционала возникла идея перевести код на С++,
благо архитектура очень хорошо подходит под ООП и аналог ООП на С уже реализован.
Однако есть вопрос:
Основа системы — механизм создания/удаления экземпляров разл. классов.
Есть файл, в к-м описывается, сколько, каких, в каком порядке и с какими параметрами надо создать экземпляров классов.
//заголовочникtypedef struct _UNI_FACE{
long Id;
_UNI_FACE* (*Constructor) (CCModule* pCCModule);
void (*Destructor) (_UNI_FACE* This);
} UNI_FACE;
unsigned long Id = pCCModule->ulModuleId;
long i;
long size=0;
UNI_FACE* current = NULL;
#pragma segment="CID_INIT_SEGMENT"
UNI_FACE **pointer = (UNI_FACE**)__segment_begin("CID_INIT_SEGMENT");
#pragma segment="CID_INIT_SEGMENT"
size=__segment_size("CID_INIT_SEGMENT");
size /= sizeof(UNI_FACE *); //4; for (i = 0; i < size; i++) {
if (pointer[i]->Id == Id) {
current = pointer[i];
break;
}
}
if (!current) {
return NULL;
}
current = (UNI_FACE *)current->Constructor(pCCModule);
if (!current) {
return NULL;
}
LInsert(&configuration_head,current);
pCCModule — данные о классе и его парамерах
CID_INIT_SEGMENT — сегмент, в к-м храняться данные о имеющихся в системе типах классов.
Для каждого класса есть константная структура, указатель на к-ю и кладётся в сегмент CID_INIT_SEGMENT
путем добавления/исключения соотв. .с файлов можно добавлять и удалять типы классов в системе.
Теперь проблема — рассмотрел реализации такого механизма на С++. Предлагается либо в реализации фабрики заранее задавать
switch с прямыми вызовами конструкторов соотв. классов, либо иметь массив (Id,*класс), в к-м регистрировать имеющиеся классы.
Оба подхода неприемлемы, т.к. требуют при изменении состава классов менять код фабрики (или её инициализации). Существует ли иной путь?
Здравствуйте, anidal, Вы писали:
A>Оба подхода неприемлемы, т.к. требуют при изменении состава классов менять код фабрики (или её инициализации). Существует ли иной путь?
Ну и регишь все классы в системе в месте их описания, создавая соотетствующий статический объект.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
А существующую систему менять и не собираюсь, а на сл. прибор сл. соображения:
1. Отсутствие наследования на С ->оверхед по коду, от 20 до 40 %. — а это уже экономия ценного ресурса — Flash.
2. Надоело писать велосипеды типа списков, деревьев и пр.
3. Квалификацию повышать надо? А за счёт работодателя и приятно и полезно
P.S. Embeded C++ генерит весьма эффективный код, на С иногда так не напишешь, только на ассемблере.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, anidal, Вы писали:
A>>Оба подхода неприемлемы, т.к. требуют при изменении состава классов менять код фабрики (или её инициализации). Существует ли иной путь?
E>Да, заводишь шаблонный класс примерно такой:
Здравствуйте, anidal, Вы писали:
E>>Ну и регишь все классы в системе в месте их описания, создавая соотетствующий статический объект. A>Понял, спасибо.
Для "спасибо" тут есть кнопки
Ты главное, это, пока не накопишь опыта разработки под С++ с шаблонами поаккуратнее. Не пиши их много, а то у новичков в С++ часто бывают с этим проблемы, AFAIK.
Удачи.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, anidal, Вы писали:
A>Теперь проблема — рассмотрел реализации такого механизма на С++. Предлагается либо в реализации фабрики заранее задавать A>switch с прямыми вызовами конструкторов соотв. классов, либо иметь массив (Id,*класс), в к-м регистрировать имеющиеся классы. A>Оба подхода неприемлемы, т.к. требуют при изменении состава классов менять код фабрики (или её инициализации). Существует ли иной путь?
IMHO радикально проще и прямее
И пользователям MyInterface, кстати, не надо знать о MyInterfaceImpl1.h, MyInterfaceImpl2.h и т. д...
Если таки хочется обязать пользователя иметь в классе-реализации статическое поле с TypeId, то можно приделать в ObjectFactory::Registrar() занчение параметра по умолчанию T::TypeId, например.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, remark, Вы писали:
R>Здравствуйте, anidal, Вы писали:
A>>Теперь проблема — рассмотрел реализации такого механизма на С++. Предлагается либо в реализации фабрики заранее задавать A>>switch с прямыми вызовами конструкторов соотв. классов, либо иметь массив (Id,*класс), в к-м регистрировать имеющиеся классы. A>>Оба подхода неприемлемы, т.к. требуют при изменении состава классов менять код фабрики (или её инициализации). Существует ли иной путь?
Здравствуйте, anidal, Вы писали:
A>К сожалению, это Embedded C++ — boost не подцепишь.
Буст там не главное. Просто из буста он взял shared_ptr. Можно и не брать. В конце концов из фабрики можно и T* возвращать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, anidal, Вы писали:
A>Здравствуйте, remark, Вы писали:
R>>Здравствуйте, anidal, Вы писали:
A>>>Теперь проблема — рассмотрел реализации такого механизма на С++. Предлагается либо в реализации фабрики заранее задавать A>>>switch с прямыми вызовами конструкторов соотв. классов, либо иметь массив (Id,*класс), в к-м регистрировать имеющиеся классы. A>>>Оба подхода неприемлемы, т.к. требуют при изменении состава классов менять код фабрики (или её инициализации). Существует ли иной путь?
Здравствуйте, remark, Вы писали:
R>Здравствуйте, anidal, Вы писали:
A>>Здравствуйте, remark, Вы писали:
R>>>Здравствуйте, anidal, Вы писали:
A>>>>Теперь проблема — рассмотрел реализации такого механизма на С++. Предлагается либо в реализации фабрики заранее задавать A>>>>switch с прямыми вызовами конструкторов соотв. классов, либо иметь массив (Id,*класс), в к-м регистрировать имеющиеся классы. A>>>>Оба подхода неприемлемы, т.к. требуют при изменении состава классов менять код фабрики (или её инициализации). Существует ли иной путь?