2008-09-11 19 views
11

說你不是返回一個方法,而是返回對類的引用,即使它沒有任何特別的語義意義。在我看來,它會給你更多關於如何調用方法的選項,允許你以流暢的界面風格使用它,並且我不能想到任何缺點,因爲你不必做任何事情與返回值(甚至存儲它)。返回這個而不是void是否有缺點?

因此,假設您在要更新一個對象,然後返回它的當前值的情況是。的 而不是說

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

,你將能夠在兩行合併說

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

編輯:我問之下突發奇想,回想起來,我同意它可能是不必要的和複雜的,但是我關於返回這個而不是空白的問題的立場。

在一個相關的說明,你們認爲有語言的東西包括語法糖新位:)

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

該運營商將具有優先權的低階所以myObj.Update(將執行首先,然後在myObj上調用GetCurrentValue(),而不是Update的無效返回。

基本上我想象的操作員會說「呼籲運營商的右手邊的方法在左邊的第一個有效的對象」。有什麼想法嗎?

回答

9

我知道在Java中他們實際上正在考慮爲無效方法制定這種標準行爲。如果你這樣做,你不需要額外的語法糖。

我能想到的唯一缺點就是性能。但這很容易衡量。我會在幾分鐘內將結果送還給你:-)

編輯:

返回一提的是比返回void慢一點..什麼驚喜。所以這是唯一的缺點。調用你的函數時會多出幾個滴答聲。

+0

smalltalk ftw,雖然你不能做好方法鏈接 – 2011-09-09 13:05:09

2

返回「自」或「這個」的一個共同的模式,有時被稱爲"method chaining"。至於你提出的語法糖,我不太確定。我不是一個.NET人,但對我來說這似乎不是很有用。

+0

是啊也許不是運營商的想法,但我仍然很好奇,可能會有什麼好處返回void – 2008-09-11 17:42:36

2

用於使用此模式的NeXTSTEP Objective-C框架。一旦分佈式對象(基本上是遠程過程調用)被添加到語言中,它在該框架中被終止 - 返回self的函數必須是同步調用,因爲分佈式對象系統看到返回類型並假定調用者需要了解該功能的結果。

+0

我可以看到這將是一個問題,雖然它不是限制在說C#或VB碼。 – 2008-09-11 17:47:59

+0

那麼,它在理論上可能是支持自省的任何語言的問題。 – 2008-09-11 21:37:24

12

我認爲作爲一般政策,它根本沒有意義。以這種方式進行方法鏈接的是適當定義的接口,但只有在語義上有意義時才適用。

你舉的例子是一個最好的一個地方是不恰當的,因爲它沒有任何語義意義。

同樣,您的語法糖是不必要的,適當設計流暢的界面。

流暢的接口或方法鏈接可以工作得很好,但需要仔細設計。

+0

謝謝。我的確切點。 – GEOCHET 2008-09-11 17:49:46

+0

方法鏈的一個優點是它可以避免使用定義局部變量,這是一個很好的習慣。 – 2011-08-12 17:02:38

2

我可以看到的唯一缺點是它使API稍微更混亂。假設你有一個通常會返回void的remove()方法的集合對象。現在您想要返回對集合本身的引用。新的簽名將如下所示:

public MyCollection remove(Object someElement) 

只看簽名,目前還不清楚您是否返回對同一實例的引用。也許MyCollection是不可變的,你正在返回一個新的實例。在某些情況下,像這樣,您需要一些外部文檔來澄清這一點。我真的很喜歡這個想法,並且我相信在Java7中對所有的無效方法進行改進以返回對'this'的引用有一些討論,但它最終通過了。

+0

這是真的,但它也可以讓你寫出精簡的代碼,如 myCollection.remove(item1).add(item2).swap(item3,item4) – 2008-09-11 18:04:00

3

這不就是「流暢接口」 - 就像JQuery使用的那些「流暢接口」一樣嗎?一個好處是應該是代碼可讀性(雖然維基百科條目http://en.wikipedia.org/wiki/Fluent_interface提到有些人發現它不可可讀)。另一個好處是代碼簡潔,您不必在7行代碼中設置屬性,然後在第8行中調用該對象的方法。

Martin Fowler(在這裏創造了這個術語 - http://martinfowler.com/bliki/FluentInterface.html)表示,流暢的接口比方法鏈更多,但是方法鏈接是流暢接口的常用技術。

編輯: 我是真的回來這裏來編輯我的答案,並補充說,沒有缺點的任何可測量的方式返回這個,而不是無效的,當我看到喬治的評論指出,我沒有忘記,討論的問題。對不起,最初的「毫無意義」散漫。

0

乍一看它可能看起來不錯,但對於一致的接口,您將需要所有方法都返回一個對此的引用(它有自己的問題)。

讓說你有兩個方法木屐這回這個和GetB其返回另一個對象的類:

然後就可以調用obj.GetA()GetB(),但不obj.GetB()。 GetA(),至少看起來不一致。

使用Pascal(和Visual Basic),可以調用同一對象的多個方法。

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

具有此功能的問題是,你可以輕鬆地編寫代碼,更難理解比它應該是。另外增加一個新的操作符可能會讓它變得更加困難。

相關問題