2017-11-03 8 views
-1

次のコードサンプルでは、​​プロセスが異なるコンテキストに割り当てられています。各Appオブジェクトは1つのコンテキストにのみバインドされます。すべてのプロセスが同じコードを実行しますが、コンテキストに属するものだけがAppのメソッドを実行します。この目標を実装するために、コードに示すように、私はif制御ステートメントをAppクラスのすべてのメソッドに追加する必要があります。だから私の質問:いくつかのエレガントな方法で同じ作業を行うのですか?冗長性を避けるため、次のコードをどのように再設計しますか?

class Context { 
    public: 
     bool ContainsCurrentProcess(); 
     ... 
    private: 
     std::vector<int> procs_; 
     ... 
}; 

bool Context::ContainsCurrentProcess() { 
    if (current_process_id belongs to procs_) 
     return true; 
    else 
     return false; 
} 

class App { 
    public: 
     App(Context *ctx, ...) {} 
     void Method1(); 
     void Method2(); 
     void Method3(); 
     ... 
    private: 
     Context *ctx_; 
     ... 
}; 

void App::Method1() { 
    if (ctx_->ContainsCurrentProcess()) { 
     ... 
    } 
} 

void App::Method2() { 
    if (ctx_->ContainsCurrentProcess()) { 
     ... 
    } 
} 

void App::Method3() { 
    if (ctx_->ContainsCurrentProcess()) { 
     ... 
    } 
} 
+1

https://codereview.stackexchange.com/helpに適しているかもしれません。私はヘルプページにリンクしていますので、セクションを読んで自分の考えをどうやって作るのかを教えてください。 – user4581301

+0

私はソフトウェアエンジニアリングコミュニティ(https://softwareengineering.stackexchange.com/questions/360179/how-to-the-refactor-the-following-parallel)に転記したので、この質問をトピックとしてクローズすることにしました。 -code-to-avoid-redundant-checking)を使用します。私はそれがより適していると思う。 –

答えて

1

あなたの質問に直接お答えください:いいえ、ありません。あなたの現在の流れを再設計しない限り。すべてのクラスメンバーに同じ 'if'ステートメントを自動的に適用する魔法の方法はありません。

しかし、詳細を共有すると、コードを再設計してこの必要性を取り除くことは可能でしょう。たぶんあなたは、文脈にないプロセスの最初の場所にAppのインスタンスを必要としません。

+0

C++では関数参照と同じようなラムダ式があるようですので、プライベートメソッドなら除外し、bodyを各関数のパラメータとして渡すことができますか? – ByeBye

+0

@ByeBye各関数に1ライナーを追加する必要がありますが、if文よりも単純ではありません。 – Valentin

+0

このように重複が存在するのを避けたいのであれば。だから、それぞれのメソッドに 'doIfContainsCurrentProcess(a - > expression)'(javaスタイル、それはC++のようには見えません)のようなものを持っています。 – ByeBye

関連する問題