1

次の2つの例の間に違いはありますか?他の例よりも1つを優先する必要があります。

例1:

class A
{
    int i;
    B* b;

    do_something();
    do_something_else();
}

A::do_something()
{    
    do_something_else();
}

例2:

class A
{
    int i;

    do_something()
    do_something_else(B* b)
}

A::do_something()
{
    B* b;
    do_something_else(b);
}

ここで、いくつかのメソッドを使用しているとしましょう。bそれらすべてに引数として使用させるか、引数を使用せずにメンバー変数を使用する方がよいでしょうか。2つのアプローチの間にパフォーマンスの違いはありますか?両方のメリットがわかりますが、どちらが望ましいですか?

4

4 に答える 4

12

変数が設計しているオブジェクトに属している場合は、変数をメンバーにします。一時変数のみを使用している場合は、それらをメンバーにしないでください。その場合、オブジェクトの設計が汚染されるだけです。

于 2012-06-21T10:03:57.853 に答える
8

これは、実際には、オブジェクトモデルがどのように組み合わされているか、および集計関係がモデル化しようとしているものを正確に表しているかどうかにかかっています。

Bあなたの場合、本当に持っている関係を示しているかどうかを考えてくださいA(つまり、A 持っている Bと言うのは本当ですか?)たとえば、ほとんどの場合、車にはエンジンがあるので、エンジンは合理的に所有/含まれている可能性があります車。この場合は、おそらく例1を使用する必要があります。

一方、直接的な関係はなく、A所有または包含せずに別のオブジェクトに作用する必要がある場合は、例2に固執する必要があります。例:

Dog myDog;
Stick aStick;
myDog.fetches(aStick);

明らかに、スティックは(うまくいけば)犬の不可欠な部分ではありません。

便宜のために変数(特にポインター)をクラスに組み込み、コードの見栄えを良くすることは魅力的です(つまり、それほど多くのパラメーターを渡す必要がないため)が、含まれているオブジェクトがコンテナーと強い関係を持っていない場合および/または別の場所で管理されている場合、複雑なライフサイクル管理の問題に頻繁に遭遇します。これは、そもそも集約から得ようとした非常に大きなメリットに対抗する可能性があります。

于 2012-06-21T10:23:32.613 に答える
3

適合するものが好ましい。

クラスインスタンスがポインタが指しているオブジェクトを所有する必要がある場合、それはメンバー変数である必要があります。それが関数の単なるパラメータであり、オブジェクトによって所有されることを意図していない場合は、それをメンバーにしないでください。

于 2012-06-21T10:04:13.143 に答える
2

関数呼び出し間で状態を維持する必要があるため、集約/構成(変数をメンバーとして保持)を使用します

オブジェクトモデルに関するアドバイスは適切ですが、純粋な製造クラスがある場合に遭遇することがよくあり、「has-a」と「is-a」はもはや実際には意味がありません。

このアドバイスを継続的に無視すると、代償が発生します。

  • オブジェクトのサイズが大きくなります。これは、オブジェクトのコピーを選択したときに、メモリとパフォーマンスに影響します。

  • メンバーがオブジェクト状態の一部であることを伝えます。つまり、このオブジェクトがオブジェクト状態の一部である方法を調べようとすると、他の開発者(数週間で「他の開発者」でもあることを忘れないでください)が混乱します。 。

  • ヘッダーのメンバーサイズを知る必要があります。これはヘッダーファイルに追加でインクルードされ、その慣習を維持し、基本ヘッダーの1行を変更すると数週間コンパイルされます。ヘッダーには最小限のインクルードのみが必要です。

したがって、この手法を使用して引数の数を減らすことはしないでください。(そして絶対的な真実はないことを忘れないでください)

于 2012-06-21T10:44:41.233 に答える