1. C++ / Говнокод #1242

    +19.1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    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;
    }

    вот так кладут в ДВО РАН.

    Запостил: guest, 23 Июня 2009

    Комментарии (10) RSS

    • Все же интересно: а как правильно?
      Ответить
    • ну хотя бы так:
      1) сделать абстрактный класс-фабрику с функцией Create, которая вертает указатель на CControlImplementation
      2) сделать набор специализированных фабрик, по одной на каждый тип, наследованных от абстрактной. можно шаблон сделать и просто заинстансить с разными параметрами.
      3) сохранить их по указателям на абстрактную фабрику где-нибудь в массиве или мапе или еще чем
      4) в функции GetControlImplementation по индексу выбирать фабрику и звать у нее Create
      Ответить
    • Обращаю внимание на функцию GetControlImplementationsCount. Предложенный способ, на мой взгляд, не позволяет красиво ее реализовать (придется каждого потомка CControlImplementation отдельно регистрировать --- заносить в массив).
      P.S. Может здесь более глубокая ошибка проектирования и GetControlImplementationsCount не нужна?
      Ответить
    • Это называется прототип
      Ответить
    • и по хорошему у CControlImplementation должен быть метод, который возвращает свой тип.
      ЗЫ и автор очевидно не знаем про enum
      Ответить
    • #1,
      можешь покурить паттерны
      http://ru.wikipedia.org/wiki/Шаблон_проектирования
      Ответить
    • №5, enum все равно предполагает перечисление всех подходящих классов в отдельном месте.

      №6, а какой из них. И из приведенного кода не ясна семантика системы.
      Ответить
    • №7,
      фабрика конечно же :)
      Ответить
    • и да, данный экземпляр кода по задумке авторов должен был выполнять роль фабрики.
      Ответить
    • Фабрику или хотябы
      список типов надо было использовать с автоматическим подсчётом кол-ва классов. Руки отрывать за такое надо и на костёр. А то константу использовали, да ещё и в коде.
      Ответить

    Добавить комментарий