Много функций против Много Лямбд? - PullRequest
2 голосов
/ 08 января 2011

Я опубликовал несколько вопросов до этого относительно использования std::function для быстрых делегатов и способов, которыми можно хранить std::function в коллекции, чтобы продемонстрировать поведение события, которое можно добавить, и удален в. Я также поинтересовался наилучшей практикой при написании целой тонны маленьких классов типа EventArg, и это небольшое дизайнерское решение также было положено на ум. Это отличное сообщество!

Теперь, не обращая внимания на преамбулу, я должен определить свою структуру, и пришло время написать все обработчики, которые будут обрабатывать входящие данные. У меня есть std::map, это выглядит так:

typedef std::function<void(const CommandData&)> CommandDelegate;
typedef boost::shared_ptr<CommandDelegate> CommandDelegatePtr;
typedef std::map<short, CommandDelegatePtr> CommandMap;

И я хочу добавить к этому около 200 обработчиков. У меня есть выбор между стандартными функциями-членами и лямбдами.

Первое, о чем я подумал, когда думал о функциях-членах, это 200 объявлений и 200 реализаций и один исходный файл с большой задницей.

Вместо того, чтобы загрязнять мой класс всеми этими обработчиками, я подумал: «Ну, это всего лишь дескрипторы, почему бы не использовать лямбда-выражения? Кажется, достаточно просто, когда класс создается, он может назначать все эти анонимные функции карте. сделал!

Тогда я понял, что конструктор будет огромным. Я мог бы вызвать вспомогательную функцию initializeMap, которая могла бы быть в своем собственном файле из-за размера.

Что вы, ребята, думаете?

  1. 200 объявлений в файле .h, 200 реализаций (среди прочих функций) в файле .cpp
  2. 200 объявлений в файле .h, отдельный файл реализации 'handlers.cpp`
  3. Нет объявлений, в ctor выделено 200 лямбд
  4. Нет объявлений, 200 лямбд, назначенных в функции initializeMap в своем собственном файле.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 08 января 2011

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

1 голос
/ 08 января 2011

Вам действительно нужны эти функции, чтобы быть динамическими?Потому что, если ваша единственная задача - не загрязнять ваш основной класс, существуют лучшие (более быстрые) решения, такие как создание подкласса или просто разделение всего кода на несколько файлов.

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

Вероятно, время компиляции не будеттак или иначе, но зачем вообще беспокоиться?

Я бы просто оставил их функции с объявлениями, либо в вашем основном классе, либо в каком-то другом выделенном классе или файле, но не инициализировал бы их динамически в ctor.

...