1

我有一个执行某些任务的过程,但根据其输入以两种略有不同的方式执行它。具体来说,它扩展了后缀树中的后缀;如果后缀在一个节点处结束,情况很简单,但是当后缀在叶边缘内结束时,需要做一些额外的工作。我提到这个细节是为了解释为什么我将这两种行为包含在一个函数中(它反映了 Dan Gusfield 对 Ukkonen 后缀树构造算法的描述的“规则 2”:http: //www.stanford.edu/~mjkay/gusfield .pdf)。

无论如何,一旦函数完成了这项工作,调用者需要知道这两种情况中的哪一种被执行了。我认为枚举将是共享此信息的好方法,因为它使案例明确(而不是将案例任意映射到布尔或整数)。

TLDR:要与调用者共享信息,我应该通过引用此过程传递一个枚举还是返回一个枚举?我觉得通过引用传递枚举更好,因为它避免了“具有副作用的函数”,但想知道是否有通常“正确”的方式来做到这一点。或者,这是否真的表明我应该用两个单独的程序替换我的单个程序?

4

4 回答 4

3

在我看来,返回枚举更有意义,因为它是调用函数的结果。如果您将值传递给函数,并且该函数应该修改该值,则使用引用会更有意义。

您可以在 C++ 标准库中的insert方法中看到类似的示例:unordered_map

template <class P> 
std::pair<iterator, bool> insert( P&& value );

该方法返回一个布尔值(在一对内),说明该值是否插入到映射中。这实际上与您正在处理的案例非常相似。

于 2012-07-19T16:52:23.697 回答
2

我认为最好将枚举作为函数的结果返回,因为它更具可读性且更易于编写:

MyEnum res = myfunc();

然后

MyEnum res;
myfunc(res);
于 2012-07-19T16:52:47.083 回答
2

我觉得通过引用传递枚举更好,因为它避免了“具有副作用的函数”

恰恰相反,实际上......通常,如果你修改你的论点,那是一个副作用。

没有理由避免退回任何东西。

于 2012-07-19T17:01:45.800 回答
0

当枚举存储在内存中时,它们只是整数值,编译器会强制检查用于枚举的值的范围。话虽如此,整数数据类型按值返回是高效且安全的。

除非您的函数确实返回多个值,否则调用者无需将枚举作为引用传递并取回结果。

YourEnum result
result = MyFunc()

PS:我通常遵循的规则来决定是否应该返回一个值,或者让调用者传递一个指针/引用并返回值是返回的数据是简单的还是复杂的数据类型。;)

于 2012-07-19T17:05:10.543 回答