2011-01-08 44 views
2

我在此之前发布了几个关于使用std::function而不是快速代理的问题,以及如何将std::function存储在集合中以显示可添加和删除的事件的行为。在编写一整套小型的课程时,我还询问了最佳实践,并且这个小小的设计决定也已经得到了解决。这是一个伟大的社区!很多功能vs很多Lambdas?

现在,序言一边,我必须有我的结构,现在是编写所有处理传入数据的处理程序的时候了。我有一个std::map,看起来像这样:

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

我想约200处理程序添加到这一点。我可以选择标准成员函数和lambda表达式。

当我想到成员函数时,我首先想到的是200个声明和200个实现以及一个大屁股源文件。

我并没有用所有这些处理程序污染我的班级,我认为“嗯,它们只是句柄,为什么不使用lambdas?似乎很简单,当构建类时它可以将所有这些匿名函数分配给地图。完成任务!

然后我意识到构造将是巨大的。我可以称之为“initializeMap`辅助函数可以想见,走在它自己的文件,因为大小。

你们觉得呢?

  1. 200报价.h文件,200个实现(除其他功能)在cpp文件
  2. 200声明在.h文件,单独的“handlers.cpp`实现文件
  3. 没有声明,分配在构造函数200层的lambda
  4. 否声明,在其自己的文件中分配了initializeMap函数中的200个lambda表达式。

在此先感谢!

回答

2

我的意见是,尽可能使用lambda。他们更易于维护。例如,如果您有成员函数,则每次更改时都必须更新声明和定义,并且还必须为其指定唯一的名称。兰姆达斯是最好的选择。如果我可以对成员变量进行自动类型推演,我就不会使用成员函数。

1

你真的需要这些功能是动态的吗?因为如果你唯一的担心是不污染你的主类,那么有更好的(更快的)解决方案,比如做一个子类,或者把所有的代码分成多个文件。

如果你有200个函数的标题,但永远不会改变,它不会让你的项目膨胀得太多,因为它只是躺在那里。另一方面,臃肿的构造函数更糟糕,因为您有更高的机会需要在某个时间更改它,然后它将不得不重新编译所有这些200个初始化。

编译时间可能不会那么长,但为什么要麻烦呢?

我只是将它们的声明保存在主类或其他专用类或文件中,但不能在ctor中动态生成它们。

+0

不确定你的意思是'动态'...数据是用代码进来的,并且必须调用该代码的适当处理程序,因此具有`std :: function`的地图。如果这不是动态的意思,你是什么意思? – 2011-01-08 14:22:29

+0

我只是指lambda函数。对不起,如果我不清楚。 – Cray 2011-01-08 14:26:00