5

すでにいくつかのプロパティ値が設定されているウィジェットを取得する必要があります。ウィジェットの名前を変更する必要があります。私はオプション3に惹かれていますが、その理由を明確にするのに苦労しています。

public void Do(Widget widget) { // 1
    widget.Name = "new name";
}

public void Do(ref Widget widget) { // 2
    widget.Name = "new name";
}

public Widget Do(Widget widget) { // 3
    widget.Name = "new name";
    return widget;
}

オプション3に惹かれる理由を説明するために、いくつかの質問と回答を集めて悪魔の代弁者を演じたいと思います。

オプション1:渡されたウィジェットを変更しないのはなぜですか?1つのオブジェクトを「返す」だけです。渡されたオブジェクトだけを使用しないのはなぜですか?

オプション2: voidを返さないのはなぜですか?パラメータオブジェクト自体への実際のメモリポインタを使用することを署名で伝達しないのはなぜですか?

オプション3:渡したのと同じオブジェクトを返すのは奇妙ではありませんか?

4

4 に答える 4

12

オプション1:これは最も一般的なアプローチです。参照自体を変更したくない場合はrefは必要ありません。渡されたオブジェクトが実際に変更されることが期待されるように、メソッドに適切な名前を付けてください。

オプション2:これは、渡された参照自体を変更する場合、つまり、新しいWidgetインスタンスを作成するか、既存のウィジェットを指すように参照を設定する場合にのみ役立ちます(これは、インスタンスの総数をすべて少なくしたい場合に役立ちます。同じプロパティがあります。Flyweightパターンを参照してください。通常、この場合、返されるウィジェットは不変である必要があり、代わりにファクトリを使用します)。あなたの場合、これは適切ではないようです。

オプション3:これにより、流暢な「ビルダー」アプローチが可能になります。つまり、ウィジェットへの変更を連鎖させて、より表現力豊かで自己文書化すると考える人もいます。Fluentインターフェースも参照してください

于 2011-09-22T15:52:12.500 に答える
6

オプション1:

罰金。まさに私が使うもの。ウィジェットのコンテンツを変更することはできますが、ウィジェット自体を変更することはできません。

オプション2:

いいえ。いいえ。いいえ。参照自体は変更しないため、を使用する必要はありませんref。参照自体を変更した場合(たとえばwidget = new Widget()out/refは正しい選択ですが、私の経験では、それが必要になることはめったにありません。

オプション3:
オプション1と同様ですが、流暢なスタイルのAPIでチェーンできます。個人的にはこれが好きではありません。コピーを返し、元のオブジェクトをそのままにしておく場合にのみ、その署名を使用します。


ただし、ここで最も重要なことは、メソッドにどのように名前を付けるかです。名前は、元のオブジェクトが変更されていることを明確に示す必要があります。

多くの場合、オプション4を選択します。型を不変にして、コピーを返します。しかし、明らかにエンティティであり、そのような価値がないウィジェットでは、これは意味がありません。

于 2011-09-22T15:53:01.913 に答える
4

3つのオプションの間に実際には機能的な違いはありません。(違いはありますが、質問に関連するものはありません。)シンプルに保つ-オプション1を使用します。

于 2011-09-22T15:53:00.003 に答える
1

オプション1とオプション3はどちらも実行可能なオプションだと思います。オプション3には、メソッドでウィジェットを変更していることを意味するという点で、自己文書化できるという利点があります。最悪のオプションはオプション2だと思います。ref私にとってのキーワードは、オブジェクトの参照を変更していることを意味しますが、これは間違いなく実行していません。

于 2011-09-22T15:56:29.893 に答える