2008-09-11 15 views
11

voidを返すのではなく、特定の意味論的意味を持たなくても、クラスへの参照を返したとします。私には、メソッドがどのように呼び出されるかについてのより多くの選択肢があり、流暢なインターフェイスのようなスタイルで使用できるようになり、何もする必要がないので、何の不都合も本当に考えられないようです戻り値で(それを格納する)。voidの代わりにこれを返すのに不利な点はありますか?

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

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

EDIT言って2行を結合することができるようになります

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

を言って:を私は振り返ってみると、私はあることに同意し、気まぐれで以下を尋ねましたその不必要と複雑になる可能性がありますが、これを返すことについての私の質問は空白よりもむしろ立っています。関連ノートで

、あなたたちは言語を持っをどう思いますかシンタックスシュガーの新しいビットが含まれています

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

この演算子は、そうmyObj.Update(優先順位の低い順位を持っているでしょうが)を実行しますUpdateのvoid戻り値ではなく、myObjでGetCurrentValue()を呼び出します。

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

答えて

9

私はJavaで、実際にはvoidメソッドの標準的な動作を考えていることを知っています。あなたがそうするなら、余分な構文的な砂糖は必要ありません。

私が考えることができる唯一の欠点はパフォーマンスです。しかし、それは簡単に測定されます。どのような驚き..

参照を返すvoidを返すよりも少し遅いです:私は

編集:-)数分で結果をあなたに戻って取得します。それが唯一の欠点です。あなたの関数を呼び出すときには、さらに数回目のチックがあります。

+0

smalltalk ftw、これはうまくいけばメソッドチェインを行うことはできませんが、 –

2

"self"または "this"を返すことはよくあるパターンです。"method chaining"と呼ばれることもあります。あなたの提案された構文砂糖については、私はそれほど確かではありません。私は.NETの人ではありませんが、私にはあまり役に立ちません。

+0

オペレータの考えではないかもしれませんが、これ以上の利点を返すためには何が役に立つのか不思議です –

2

このパターンを使用するために使用されたNeXTSTEP Objective-Cフレームワーク。分散オブジェクトシステムが戻り型を認識し、呼び出し側が必要とすると仮定して、selfが同期呼び出しでなければならなかった関数(分散プロシージャ呼び出し、基本的に分散オブジェクト)が言語に追加されると、そのフレームワークでは中断されました関数の結果を知る。

+0

C#またはVBの制限ではありませんが、コード。 –

+0

理論的には、イントロスペクションをサポートするどの言語でも問題になる可能性があります。 –

12

私は一般的な方針として、それは単に意味をなさないと思います。この方法でのメソッド連鎖は、適切に定義されたインタフェースで動作しますが、意味的に意味がある場合にのみ適切です。

あなたの例は意味がないため、適切ではない場合があります。

同様に、適切に設計された流暢なインターフェイスでは構文の砂糖は不要です。

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

+0

ありがとうございます。正確に私のポイント。 – GEOCHET

+0

メソッド連鎖の利点は、ローカル変数を定義するのを避けることができるということです。 –

2

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

public MyCollection remove(Object someElement) 

署名を見るだけで、同じインスタンスへの参照が返されていることは明らかではありません。多分、MyCollectionは不変で、新しいインスタンスを返すでしょう。いくつかのケースでは、このように、これを明確にするためにいくつかの外部ドキュメントが必要になります。

私は実際にこのアイデアが好きですが、私はJava7ですべてのvoidメソッドを「this」への参照を戻すためにいくつかの話があったと考えていますが、最終的には落ちました。

+0

本当ですが、 myCollection.remove(item1).add(item2).swap(item3、item4)などの合理的なコードを書くこともできます –

3

JQueryが利用しているような "流暢なインターフェース"が構築されていませんか? 1つの利点はコードの可読性であると考えられています(ただし、http://en.wikipedia.org/wiki/Fluent_interfaceのwikipediaのエントリには、それがではなくが読めると書かれています)。もう一つの利点はコードの簡潔さです。コードの7行でプロパティを設定し、そのオブジェクトのメソッドを8行目で呼び出す必要がなくなります。

Martin Fowler(ここでは、http://martinfowler.com/bliki/FluentInterface.htmlという用語を使用しています)は、メソッドチェーンよりも流暢なインターフェイスがあると言いますが、メソッドチェーンは流暢なインターフェイスで使用する一般的なテクニックです。

編集:私は実際に私の答えを編集し、私はジョージのコメントは、私はを議論することを忘れなかったことを指摘見たときに、任意の測定方法で、代わりにボイドの本を返すことに何の不利益がないことを追加するためにここに戻って来ていた 質問の質問です。最初の "無意味な"放浪には申し訳ありません。

+0

はいつまり、私はこれが流暢なインターフェーススタイルであると言いました。あなたが言うように、ちょうどメソッド連鎖よりも流暢なインターフェースがあります。問題は実際にはこれに不利な点があるかどうかです。 –

0

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

は、その後、あなたがobj.GetAを呼び出すことができGetBを()ではなく、obj.GetB():

レッツは、あなたが別のオブジェクトを返す。このとGetBを返す二つの方法下駄を持つクラスを持っていると言います。少なくとも一貫していないようですGetA()。

パスカル(およびVisual Basic)では、同じオブジェクトのいくつかのメソッドを呼び出すことができます。

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

この機能の問題は、あなたが簡単にそれがあるべきよりも理解しにくいコードを書くことができるということです。また、新しい演算子を追加することで、おそらくそれは一層難しくなります。

+0

まず、voidを返すメソッドGetA()を持つのは奇妙です。より合理的な例は、obj.UpdateA()です。GetA()私には完璧な意味があります –

+0

質問 - これはobj.GetA()のためのより多くのsesseをしないでしょうか?ここでは読みやすさに妥協していませんか? – Subramanian

+0

あなたはあまりにも多くの例を読んでいます。 'この'は'A * '型である可能性があるので、' GetA 'は' * this 'が完璧な意味を返すようにします。 – Ismael

関連する問題