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() メソッド全体を呼び出しても、実行に時間がかかるため、この場合は役に立ちません。この場合、1 つの要素が見つかるとすぐに戻ることができます。フィルセットのコードを複製せずにこれをリファクタリングする簡単な方法はありますか? 私は次のようなことを考えていました:

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たり、可能なセット全体ではなく 1 つのオブジェクトのみを探していることを暗示したりすることができます。また、その変数をオプションにしてデフォルトを にすることも検討する必要がありますfalse

于 2013-07-24T13:49:30.257 に答える