0

我需要在 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”

关于可用性和进一步的可维护性,现在我想到这将是这两者之间的最佳选择(当然,还有其他更好的选择,我不包括在内)。

谢谢。

4

3 回答 3

2

您可以修改选项 2 以避免幻数,也可以避免为 action 参数传递人员 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);
于 2013-11-08T05:49:48.497 回答
1

您似乎严重地重新发明了标准库中包含的 C++ 内容:std::count_if

请注意,它允许任意复杂的条件,因为它接受一个仿函数对象,该对象能够过滤并决定哪些对象匹配。使用 C++11,lambda 使提供条件比以往任何时候都容易。

您可以公开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);
于 2013-11-07T20:18:04.690 回答
0

绝对选择选项 2。您的代码的用户不必查找他们想要调用的方法,在某些情况下他们只需能够使用您定义的常量。它使用户的生活变得更加轻松,只需使用一个函数名称,这样他们就不必不断引用您的 .h 文件来确定他们想要的众多函数中的哪一个(命名相同)使用。

于 2013-11-07T20:13:36.947 回答