12

void を返す代わりに、特定のセマンティックな意味がなくても、クラスへの参照を返したとします。メソッドの呼び出し方法についてより多くのオプションを提供し、流暢なインターフェースのようなスタイルで使用できるように思われます。何もする必要がないので、デメリットは特に考えられません。戻り値で(それを保存することさえ)。

オブジェクトを更新してから現在の値を返したい状況にあるとします。と言う代わりに

myObj.Update();
var val = myObj.GetCurrentValue();

2行を組み合わせて言うことができます

var val = myObj.Update().GetCurrentValue();

編集: 私は気まぐれに以下を尋ねました。振り返ってみると、それは不必要で複雑になる可能性が高いことに同意しますが、無効ではなくこれを返すことに関する私の質問は立っています.

関連するメモとして、言語に新しい構文糖衣を含めることについてどう思いますか。

var val = myObj.Update()<.GetCurrentValue();

この演算子の優先順位は低いため、myObj.Update() が最初に実行され、次に Update の void リターンの代わりに myObj で GetCurrentValue() が呼び出されます。

基本的に、「左側の最初の有効なオブジェクトの演算子の右側にあるメソッドを呼び出す」という演算子を想像しています。何かご意見は?

4

7 に答える 7

12

一般的な方針として、それは単に意味をなさないと思います。この方法でのメソッドチェーンは、適切に定義されたインターフェイスで機能しますが、セマンティックに意味がある場合にのみ適切です。

あなたの例は、意味的に意味がないため、適切ではない主要な例です。

同様に、適切に設計された流暢なインターフェイスを使用すれば、シンタックスシュガーは不要です。

流暢なインターフェイスまたはメソッドチェーン非常にうまく機能しますが、慎重に設計する必要があります。

于 2008-09-11T17:46:53.807 に答える
10

私はJavaで、彼らが実際にvoidメソッドのこの標準的な振る舞いをすることを考えていることを知っています。そうすれば、余分なシンタックスシュガーは必要ありません。

私が考えることができる唯一の欠点はパフォーマンスです。しかし、それは簡単に測定できます。数分後に結果をお知らせします:-)

編集:

参照を返すことは、voidを返すことよりも少し遅いです..なんて驚きでしょう。これが唯一の欠点です。関数を呼び出すときにさらに数ティック。

于 2008-09-11T17:54:19.107 に答える
3

私が見ることができる唯一の欠点は、APIが少し混乱することです。通常はvoidを返すremove()メソッドを持つコレクションオブジェクトがあるとします。ここで、コレクション自体への参照を返します。新しい署名は次のようになります。

public MyCollection remove(Object someElement)

署名を見るだけでは、同じインスタンスへの参照を返しているかどうかは明らかではありません。MyCollectionは不変であり、新しいインスタンスを返している可能性があります。場合によっては、ここのように、これを明確にするために外部のドキュメントが必要になります。

私は実際にこのアイデアが好きで、Java7のすべてのvoidメソッドを改良して、「this」への参照を返すという話があったと思いますが、最終的には失敗しました。

于 2008-09-11T17:58:33.357 に答える
3

これが、JQuery が利用するような「流暢なインターフェース」の構築方法ではないでしょうか。利点の 1 つは、コードの読みやすさです (ただし、 http://en.wikipedia.org/wiki/Fluent_interfaceのウィキペディアのエントリには、読みにくいと感じる人もいると言及されています)。もう 1 つの利点は、コードが簡潔であることです。7 行のコードでプロパティを設定し、8 行目でそのオブジェクトのメソッドを呼び出す必要がなくなります。

Martin Fowler (ここでこの用語を作り出した人 - http://martinfowler.com/bliki/FluentInterface.html ) は、流暢なインターフェイスにはメソッド チェーンよりも多くの機能があると述べていますが、メソッド チェーンは流暢なインターフェイスで使用する一般的な手法です。

編集:私は実際にここに戻って答えを編集し、測定可能な方法でvoidの代わりにこれを返すことに不利益はないことを追加しました。最初の「意味のない」とりとめのないことを申し訳ありません。

于 2008-09-11T18:04:08.117 に答える
2

このパターンを使用するために使用されるNeXTSTEPObjective-Cフレームワーク。分散オブジェクト(基本的にはリモートプロシージャコール)が言語に追加されると、そのフレームワークでは廃止されましたself。分散オブジェクトシステムは戻り型を認識し、呼び出し元が次のことを行う必要があると想定したため、返される関数は同期呼び出しである必要がありました。関数の結果を知っています。

于 2008-09-11T17:45:15.213 に答える
2

「self」または「this」を返すことは一般的なパターンであり、「メソッド チェーン」と呼ばれることもあります。提案されたシンタックス シュガーについては、よくわかりません。私は .NET の専門家ではありませんが、あまり役に立ちません。

于 2008-09-11T17:41:11.353 に答える
0

一見すると良さそうに見えるかもしれませんが、一貫したインターフェイスのためには、すべてのメソッドがこれへの参照を返す必要があります (これには独自の問題があります)。

これを返す GetA と別のオブジェクトを返す GetB の 2 つのメソッドを持つクラスがあるとします。

次に、obj.GetA().GetB() を呼び出すことができますが、obj.GetB().GetA() を呼び出すことはできません。これは、少なくとも一貫していないようです。

Pascal (および Visual Basic) を使用すると、同じオブジェクトの複数のメソッドを呼び出すことができます。

with obj
  .GetA();
  .GetB();
end with;

この機能の問題点は、必要以上に理解しにくいコードを簡単に記述できることです。また、新しいオペレーターを追加すると、おそらくさらに難しくなります。

于 2008-09-11T22:17:42.843 に答える