我需要在C ++中为类实现一个接口,我需要询问与两种集相关的事件,比如说这里的人和动作。我需要在所有可能的组合中询问人员标识符和操作标识符(所有这些组合,仅指定其中一个标识符或指定它们)
选项1)
// Asks for all events occured for every combination
int getNumberofEvents(float param1)
// Asks for all events occured for idPerson AND all possible value of idAction
int getNumberofEvents(int idPerson, float param1)
// Asks for all events occured in idAction AND all possible value of idPerson
int getNumberofEvents(int idAction, float param1)
// Asks for all events occured in idPerson AND idAction
int getNumberofEvents(int idPerson, int idAction, float param1)
这个选项很清楚,但我需要为每个可能的组合实现不同的接口,因此如果我包含一个新的标识符(2³),将有8种方法。
选项2)
static const int ALL_PERSONS= 0;
static const int ALL_ACTIONS= 0;
int getNumberofEvents(int idPerson, int idAction, float param1)
对于此选项,只有一个方法界面,但我引入了一个公共幻数来搜索“所有可能的id”
关于可用性和进一步的可维护性,现在我想到这两者之间的最佳选择(当然,还有其他更好的选择,我不包括在内)。
感谢。
答案 0 :(得分:2)
您可以修改选项2以避免幻数,也可以避免为action参数传递person id的问题,反之亦然:
struct Person
{
explicit Person(int x) : id (x) {}
int id;
static Person ALL;
};
Person Person::ALL(0);
struct Action
{
explicit Action(int x) : id (x) {}
int id;
static Action ALL;
};
Action Action::ALL(0);
int getNumberofEvents(const Person& person, const Action& action, float param1);
// ...
int count = getNumberOfEvents(Person(3), Action::ALL, 1.0f);
答案 1 :(得分:1)
您似乎正在彻底改变C ++在标准库中包含的内容:std::count_if
请注意,它允许任意复杂的条件,因为它接受一个能够过滤和决定哪些对象匹配的仿函数对象。使用C ++ 11,lambdas比以往更容易提供条件。
您可以公开begin()
和end()
迭代器,让用户调用std::count_if
,或者写
int getNumberofEvents(std::function<bool (const descriptor&)> filter, float param1);
让用户以非常自然的方式编写查询表达式:
getNumberOfEvents([](const descriptor& x) { return x.Action == ACTION_RAISE; }, 5.7);
答案 2 :(得分:0)
绝对使用选项2.代码的用户不必查找他们想要调用的方法,他们只能在某些情况下使用您定义的常量。它使用户的生活变得更容易,只有一个函数名称可以使用,这样他们就不必经常引用你的.h文件来找出他们想要的众多函数中的哪一个(命名为同一个东西)使用。