12

だから、このようなもの

public void MyMethod(object parameter)
//....
    BuildSomething(parameter);
    BuildLayers(parameter);
    BuildOtherStuff(parameter);
}

public void BuildSomething(object parameter)
{
//...
    parameter.SomeProperty = "sadsd";
//...
}

これがアンチパターンである場合、それは何と呼ばれますか? (おそらく) 問題は、パラメーターを暗黙的に変更し、変更された値を使用していることです。
このアンチパターンが何であるかを知りたいだけです

ありがとう

4

3 に答える 3

20

副作用です。

これらは通常は良くなく、コードの推論と理解を困難にするため、コード臭と見なされます。

ただし、このパターンが役立つ場合もあります。

C# では、メソッドに副作用があることが予想されることを示すために、 refandoutキーワードを具体的にコード化しました。

于 2012-12-28T12:43:52.870 に答える
0

私は別の見方をしています。

パラメータ値を変更すると、デバッグ プロセスやコードの可読性に小さな問題が生じる可能性がありますが、この慣行を「アンチパターン」と呼んでも意味がありません。

Java や C# などの最新の OO 言語設計に基づいて、パラメーター値を変更するのが見苦しい、間違っている、または推奨されない場合は、型パラメーターを参照ではなくインスタンスのコピーとして定義するという考えを支持します。

そして、Oded が言ったことに反対して、refまたはoutキーワードは、インスタンス値全体を本当に変更して完全に置き換えたいコンテキストでのみ使用する必要があると思います。このキーワードの 1 つを使用して、「ねえ、実行スタック中にパラメーター値が変更される可能性があります」と伝えるのは、少し不注意に聞こえます。クライアントの 1 人が関数シグネチャを見て、すべてを置き換えることができると本当に信じている場合はどうなるでしょうか? (予期しない動作が発生した場合)。

于 2012-12-28T13:42:41.037 に答える
0

parameterの型が実際objectには ではなく、 と呼ばれる書き込み可能なプロパティまたはフィールドを含むクラス型であると仮定するとSomeProperty、メソッドが入ると、 の値はparameter何らかのオブジェクトの ID になります (たとえば、プログラムが始まりました)。私が知る限り、そのパラメーターの値 (それが参照するオブジェクトのIDを意味する) は、メソッド全体で同じままです。

渡されたパラメーターの値を変更する (たとえば、 と言う) ことは、何が起こっているのかが明らかなほどメソッドが十分に小さい場合を除きparameter = someOtherObject、コードのにおいがする可能性があります。

于 2013-01-08T00:28:40.463 に答える