Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
int GetControlImplementationsCount()
{
//return 17;
return 18;
}
CControlImplementation* GetControlImplementation(int index)
{
switch (index)
{
case 0: return new CButtonImp();
case 1: return new CFormImp();
case 2: return new CLabelImp();
case 3: return new CHorizontalAlignment();
case 4: return new CVerticalAlignment();
case 5: return new CMouseButton();
case 6: return new CActionEvent();
case 7: return new CMouseEvent();
case 8: return new CWindowEvent();
case 9: return new CCheckBoxImp();
case 10: return new CComboBoxImp();
case 11: return new CListBoxImp();
case 12: return new CRadioButtonImp();
case 13: return new CTextBoxImp();
case 14: return new CItemEvent();
case 15: return new CTextEvent();
case 16: return new CButtonGroupImp();
case 17: return new DialogImpl();
}
return NULL;
}
ну хотя бы так:
1) сделать абстрактный класс-фабрику с функцией Create, которая вертает указатель на CControlImplementation
2) сделать набор специализированных фабрик, по одной на каждый тип, наследованных от абстрактной. можно шаблон сделать и просто заинстансить с разными параметрами.
3) сохранить их по указателям на абстрактную фабрику где-нибудь в массиве или мапе или еще чем
4) в функции GetControlImplementation по индексу выбирать фабрику и звать у нее Create
Обращаю внимание на функцию GetControlImplementationsCount. Предложенный способ, на мой взгляд, не позволяет красиво ее реализовать (придется каждого потомка CControlImplementation отдельно регистрировать --- заносить в массив).
P.S. Может здесь более глубокая ошибка проектирования и GetControlImplementationsCount не нужна?
Фабрику или хотябы
список типов надо было использовать с автоматическим подсчётом кол-ва классов. Руки отрывать за такое надо и на костёр. А то константу использовали, да ещё и в коде.
1) сделать абстрактный класс-фабрику с функцией Create, которая вертает указатель на CControlImplementation
2) сделать набор специализированных фабрик, по одной на каждый тип, наследованных от абстрактной. можно шаблон сделать и просто заинстансить с разными параметрами.
3) сохранить их по указателям на абстрактную фабрику где-нибудь в массиве или мапе или еще чем
4) в функции GetControlImplementation по индексу выбирать фабрику и звать у нее Create
P.S. Может здесь более глубокая ошибка проектирования и GetControlImplementationsCount не нужна?
ЗЫ и автор очевидно не знаем про enum
можешь покурить паттерны
http://ru.wikipedia.org/wiki/Шаблон_проектирования
№6, а какой из них. И из приведенного кода не ясна семантика системы.
фабрика конечно же 🙂
список типов надо было использовать с автоматическим подсчётом кол-ва классов. Руки отрывать за такое надо и на костёр. А то константу использовали, да ещё и в коде.