1

状況は次のとおりです。元のオブジェクトの変更を避けるために、オブジェクトの複製のどこの部分を決定しようとしています。

2 つのオプションがあります。

  • 呼び出し元でオブジェクトを複製し、複製されたオブジェクトをメソッド (「呼び出し先」) に渡すことで、呼び出し先による潜在的な変更を防ぎます。
  • 呼び出し先は渡されたオブジェクトを変更するため、呼び出し先でオブジェクトを複製します。これにより、呼び出し元が引数オブジェクトの変更を望んでいないことが前提になります

この6歳の答えをさまざまな意見で見つけました。残念ながら、本当のコンセンサスがあったようには見えません。

オブジェクトのコピーをメソッドに渡す -- 誰がコピーを行うのか?

コード形式での私の質問は次のとおりです。

  • 呼び出し元でオブジェクトを複製し、複製したオブジェクトをメソッドに渡しますか?
public static void Main()
{
    var foo = new Foo();
    Bar.Baz(foo.DeepClone());
}

public static class Bar
{
    public static void Baz(Foo foo)
    {
        /* ... modifies members in foo ... */
    }
}

public class Foo { /* ... */ }
  • 呼び出し先でオブジェクトを複製しますか?
public static void Main()
{
    var foo = new Foo();
    Bar.Baz(foo);
}

public static class Bar
{
    public static void Baz(Foo foo)
    {
        foo = foo.DeepClone();
        /* ... modifies members in foo ... */
    }
}

public class Foo { /* ... */ }

だから、私の質問は次のとおりです。

  • 特に C# と .NET ランドで、複数の言語間でオブジェクトを複製する場所に関する経験則は何ですか?

  • 答えに関係なく、引数を変更するメソッドまたはオブジェクトを複製するメソッドの動作を文書化する良い方法は何ですか?

4

2 に答える 2

2

メソッドの目的はオブジェクトを変更することですか? 次に、メソッド内で複製しないでください。あなたは副作用が起こることを望んでいます。通常、メソッド名は、ミューテーションが予想されるという事実を明確に示します (例: UpdateCustomer)。

入力を変更することがメソッドの明示的な目的でない場合、変更は実装の詳細であり、メソッドは変更が漏れないようにする必要があります。それはクローニングによってそれを行うことができます。

メソッドは、入力を単なるスクラッチ スペースとして使用しないでください。Win32 API の中には、ひどく混乱するようなことをするものがあります。

于 2015-06-17T22:52:57.323 に答える
1

constness を強制 (および文書化) する最善の方法は、読み取り専用インターフェイスを定義し、パラメーターをそのインターフェイスとして定義することです。インターフェイスを受け入れるものはすべて定数であり、完全なオブジェクトを受け入れるものはオブジェクトを変更する可能性があります。

このアプローチに従っている場合、変更可能なオブジェクトを渡してオブジェクトを変更する許可を呼び出し先に与えているため、呼び出し元が副作用を望まない場合は複製する必要があります。

于 2015-06-17T23:12:23.827 に答える