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

    +14

    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
    typedef CStatisticsCalculator* (*TCalcCreator)(string&, const TUltimateStatDataPtr&);
    typedef std::map <CStatisticsCalculator::eCalcKind, boost::tuple<string, TUltimateStatDataPtr, TCalcCreator>> TCalcImplMap; 
    
    static TCalcImplMap CalcsMap;
    
    CStatisticsCalculator* CStatisticsCalculator::MakeNewCalculator(CStatisticsCalculator::eCalcKind Kind, 
                                                                    const TUltimateStatDataPtr& Data )
    {
        if (CalcsMap.empty())
        {
          CalcsMap[eCalcKind::eExtremeDealPrice] = 
            boost::make_tuple(string("be.commons.calculators.extreme_prices"), Data,
                   [](string& Name, const TUltimateStatDataPtr& Data_)->CStatisticsCalculator* 
                       { return new CExtremePricesCalculator(Name.c_str(), Data_);});
        
          CalcsMap[eCalcKind::eTurnOver] = 
            boost::make_tuple(string("be.commons.calculators.turnover"), Data,
                   [](string& Name, const TUltimateStatDataPtr& Data_)->CStatisticsCalculator* 
                       { return new CTurnOverCalculator(Name.c_str(), Data_);});
          
        };             
        
        auto i = CalcsMap.find(Kind);
        
        if (i == CalcsMap.end())
            return 0;
        
        auto& tpl = i->second;
        
        return tpl.get<2>()(tpl.get<0>(), tpl.get<1>());
    };

    Фабричный метод теперь выглядит так

    Запостил: ABBAPOH, 16 Апреля 2014

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

    • > return tpl.get<2>()(tpl.get<0>(), tpl.get<1>());
      Автор кода не осилил крестолямбды? :)

      P.S. Что-то меня очень смущает сохранение Data в мап... Будет использоваться не та Data, которую передали, а та, которую передавали при первом вызове функции... Так и надо?

      P.P.S. Ну и непотокобезопасно.
      Ответить
    • Паттерн Farm.

      Название и классификация паттерна
      Ферма - паттерн, разводящий объекты.

      Назначение
      Задает структуру фермы - пула объектов, которые создают другие объекты. Сам пул инициализируется лениво, неохотно.

      Мотивация
      Создание объекта - непростая операция, а если имеется семейство полиморфных классов и выбор конкретного класса зависит от некоторого параметра, то задача усложняется экспонециально.
      Решение предлагает паттерн ферма. Реализация замысловата и выглядит как настоящая работа. Объем написанного кода заставить вас почувствовать себя проектировщиком с большим окладом.*

      Применимость
      Используйте ферму:
      - в пятницу вечером после юбилея коллеги;
      - в понедельник утром, когда не выспался и злой;
      - если религия не позволяет написать switch-case-case-case-default-throw.

      Структура
      ┌─────────┐
      │  CFarm  │
      └─────────┘
      // todo: допилить нах


      Участники
      CFarm - класс, который создает объекты
      CStabling - конюшня, хранит объекты, создающие объекты.
      IHorse - интерфейс лошади.
      CHorsea4bf356e, CHorse2, CHorseGovno - результаты совокупления на ферме.

      Результаты
      Ощущение хорошо выполненной работы гарантировано.

      Известные применения
      http://govnokod.ru/15763

      Родственные паттерны
      Factory Method, Prototype

      * эвфемизм вполне уместен
      Ответить
      • А так посмотрит менеджер - красиво задокументировано, солидно выглядит, непонятные слова, какой-то серъезный паттерн.
        >Известные применения
        >http://govnokod.ru/15763
        Особо доставило. Прям как список противопоказаний в лекарствах.
        Ответить
      • ---
        заставить

        +++
        заставит

        Пардон, опечатался.
        Ответить

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