2

追加の機能を拡張する必要がある既存のメソッド (または一般的な関数) がありますが、コード内の他の場所でメソッドの使用を中断したくありません。例:

int foo::bar(int x)
{
 // a whole lot of code here
 return 2 * x + 4;
}

コードベースで広く使用されています。ここで、4 をパラメーターにする必要がありますが、既に foo::bar を呼び出しているコードは、期待どおりに受け取る必要があります。古いメソッドを拡張して名前を変更し、次のように新しいメソッドにラップする必要があります

int foo::extended_bar(int x, int y)
{
 // ...
 return 2 * x + y;
}

int foo::bar(int x)
{
 return extended_bar(x,4);
}

または、ヘッダーファイルでデフォルトの引数を宣言する必要があります

int bar(int x, int y=4);

機能を拡張するだけです

int foo::bar(int x, int y)
{
 // ...
 return 2 * x + y;
}

各バリアントの長所と短所は何ですか?

4

3 に答える 3

8

私は通常、デフォルトのパラメーターの代わりにラッパー関数を (ほとんどの場合、オーバーロードを介して) 使用します。

その理由は、下位互換性には 2 つのレベルがあるためです。

  1. ソース レベルの下位互換性があるということは、呼び出し元のコードを変更せずに再コンパイルする必要があることを意味します。これは、新しい関数シグネチャが古い関数シグネチャと互換性があるためです。このレベルは両方で達成できます。デフォルト値とラッパー/オーバーロード。

  2. より強力なレベルは、バイナリ レベルの後方互換性です。これは、呼び出し元のコードにアクセスできない場合など、再コンパイルしなくても機能します。関数を DLL などのバイナリ形式でデプロイすると想像してください。このような場合、動作させるためにシグネチャがまったく同じである必要があります。これはデフォルト値の場合とは異なり、このレベルの互換性が失われます。 .

ラッパー関数のもう 1 つの利点は、アプリケーションになんらかのログがある場合、古い関数に、将来のバージョンでは廃止されるため、新しい関数を使用することをお勧めするという警告を出力できることです。

于 2009-06-02T17:40:10.360 に答える
0

私は個人的に、暗黙の行動がすべての悪の根源 (の 1 つ) であると信じています。

呼び出されるターゲットの ID をメンテナーまたは呼び出し元に対して難読化するものには、特にそれが主要な API の一部である場合、非常に強力な正当化が必要です。

したがって、デフォルト操作のオプションには強く反対します。

さらに、特定の関数を異なる数のパラメーターで呼び出すことができる場合、関数の両方のバージョンで本質的に異なる何かがあるか、またはそれらがやりすぎていると思います。区別はおそらく名前にあるはずで、おそらく「_extended」よりも意味があるはずです

于 2009-06-02T18:06:40.380 に答える
0

C++ を長く使用するほど、デフォルトの関数パラメーターが気に入らなくなります。嫌いな特定の理由を特定することはできませんが、それらを使用すると、ほとんどの場合、後でそれらを削除することになります. だから私の(主観的な)投票は新しい名前付き関数に行きます - 名前はもちろん古いものと同じかもしれません。

于 2009-06-02T17:45:48.510 に答える