在此之前,我发布了一些关于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名处理程序。我可以选择标准成员函数和lambdas。
在考虑成员函数时,我首先想到的是200个声明和200个实现以及一个大屁股源文件。
不是用所有这些处理程序污染我的类,我想“好吧,它们只是句柄,为什么不使用lambdas?看起来很简单,当构造类时,它可以将所有这些匿名函数分配给地图。完成了!
然后我意识到构造函数会很大。我可以调用一个'initializeMap`辅助函数,由于它的大小,可以想象它可以放在它自己的文件中。
你们觉得怎么样?
.h
文件中的200个声明,.cpp文件中的200个实现(以及其他函数).h
文件中的200个声明,一个单独的'handlers.cpp`实现文件initializeMap
函数中为其自己的文件分配了200个lambdas。提前致谢!
答案 0 :(得分:2)
我的意见是,尽可能使用lambdas。它们更易于维护。例如,如果您有成员函数,则每次更改时都必须更新声明和定义,并且还必须为其分配唯一的名称。 Lambdas是更好的选择。如果我可以对成员变量进行自动类型推导,我就不会使用成员函数。
答案 1 :(得分:1)
你真的需要这些功能是动态的吗?因为如果您唯一关心的是不污染主类,那么有更好(更快)的解决方案,比如创建子类,或者只是将所有代码分成多个文件。
如果您的标题包含200个函数,但从不更改,它不会使您的项目膨胀太多,因为它只会在那里。另一方面,一个臃肿的构造函数更糟糕,因为你有必要在某个时候更改它,然后它将不得不重新编译所有这200个初始化。
那个编译时间可能不会那么长,但为什么还要麻烦?
我只是在主类或其他专用类或文件中使用声明来保存它们的函数,但不能在ctor中动态地使用它们。