1

我有一个与此类似的功能:

void fillset(std::set<int>& myset)
{

while(...) {
object[i]->fillset(myset);
}

if(...) 
    otherfillset(myset)

}

现在我注意到这个函数经常是这样使用的:

bool isAllowed() {

std::set<int> myset;

fillset(myset);

return !myset.empty();


}

现在,在这种情况下调用整个 fillset() 方法是没有用的,因为它需要一些时间来执行。在这种情况下,我可以在找到一个元素后立即返回。有没有一种简单的方法来重构它而不必复制填充集的代码?我在想这样的事情:

template<bool return_as_soon_as_not_empty>

void fillset(std::set<int>& myset)
{

while(...) {
object[i]->fillset(myset);
if( return_as_soon_as_not_empty && !myset.empty()) {
return;
}
}

if(...) 
    otherfillset(myset)

}

你觉得这个怎么样?欢迎任何其他想法

4

3 回答 3

3

你真正想做的是创建一个新函数canFillSet()并调用它。

所有“修复”该方法的fillSet()方法都会导致它做一些从其名称和签名中不明显的事情=>这些方法是通往灾难的道路,它们会在以后修改程序时导致错误。

于 2013-07-24T13:56:02.260 回答
1

这样做会改变fillset(). 它不再用所有元素填充集合,它只用第一个元素填充它。

isAllowed()更好的解决方案是通过对象级联

bool isAllowed() {
    while (...) {
        if (object[i]->isAllowed())
            return true;
    }
    return false;
}
于 2013-07-24T13:48:33.533 回答
0

如果你能真正保证填充集合没有副作用,你可以做出你推荐的改变。但是,如果需要填充该集合以使其他东西正常工作,则您可能会改变该行为。

您可以将 early-return 变量称为类似single_fill或暗示您只是在寻找一个要填充的对象而不是整个可能的集合。您还应该考虑将该变量设为可选并默认为false.

于 2013-07-24T13:49:30.257 回答