2012-07-19 137 views
1

我有一個執行某個任務的過程,但是根據它的輸入以兩種稍微不同的方式執行它。具體來說,它在後綴樹中擴展後綴;如果後綴在節點處結束,則情況很簡單,但是當後綴在葉邊內結束時,需要一些額外的工作。我提到這個細節來解釋爲什麼我將這兩個行爲包含在一個函數中(它反映了Dan Gusfield關於後綴樹構造的Ukkonen算法描述的「規則2」:​​)。返回枚舉或通過引用傳遞枚舉?

無論如何,一旦函數完成這項工作,調用者需要知道兩個案例中的哪一個被執行。我認爲枚舉將是分享這些信息的好方法,因爲它使得這些案例變得明確(而不是任意將案例映射到布爾或整數)。

TLDR:爲了與調用者共享信息,我應該通過引用該過程來傳遞一個枚舉還是返回一個枚舉?我想通過引用傳遞一個枚舉更好,因爲它避免了'具有副作用的函數',但想知道是否通常有'正確'的方式來做這件事。或者,這是否確實表明我應該用兩個獨立的程序取代我的單一程序?

+0

我寧願返回枚舉 - 它聽起來像算法的結果的一部分。在這種情況下,按引用傳遞似乎有點奇怪。 – 2012-07-19 16:52:34

回答

3

在我看來,返回枚舉更有意義,因爲它是調用該函數的結果。如果將值傳遞給函數,使用引用會更有意義,並且該函數應該修改該值。

可以從在C++標準庫unordered_map看到insert方法類似的例子:

template <class P> 
std::pair<iterator, bool> insert(P&& value); 

該方法返回一個布爾(一對中)指出的值是否被插入到地圖或沒有。這實際上與你正在處理的情況非常相似。

2

我認爲這是更好TU返回枚舉的,因爲它是更具可讀性和易於編寫的函數的結果:

MyEnum res = myfunc(); 

然後

MyEnum res; 
myfunc(res); 
+0

偉大,簡明的解釋爲什麼在這裏回報更好。請參閱http://en.wikipedia.org/wiki/Fluent_interface進一步閱讀。 – abarnert 2012-07-19 18:51:56

2

我覺得通過枚舉通過參考是更好的,因爲它避免了'有副作用的功能'

恰恰相反,其實......一般來說,如果你修改你的論點,那是一個副作用。

沒有理由避免返回任何東西。

+0

沒錯,但是如果它不返回任何東西,它只會修改某個狀態或者與外部世界有可觀察的交互(如過程),但是如果它也返回,那麼它會返回並修改狀態(我似乎記住由於某種原因是'不好')。 – HorseloverFat 2012-07-19 17:05:02

+1

你記得錯了。函數應該返回值;那是他們的工作。由於C++的限制,有時你必須「僞裝」返回值作爲參考輸出參數,但這絕不是_better_;你這樣做是因爲你別無選擇。 – abarnert 2012-07-19 18:50:16

+0

或者有時您必須接受回調並將「返回」值傳遞給回調,而不是@abarnert所說的相同推理。 – Mehrdad 2012-07-19 20:49:10

0

枚舉值只是整數值,當它們存儲在內存中時,編譯器會強制檢查枚舉值的範圍。話雖如此說整數數據類型是有效和安全的返回值。

除非你的函數真的返回多個值,否則調用者不需要傳遞枚舉值作爲引用並返回結果。

YourEnum result 
result = MyFunc() 

PS:我通常遵循決定的值是否應該返回,或使主叫方傳遞一個指針/引用和返回值是,如果返回的數據是一個簡單的或複雜的數據類型的規則。;)

+1

該規則可能不是一個好規則。看看[返回值優化](http://en.wikipedia.org/wiki/Return_value_optimization),看看爲什麼返回一個向量(例如)可能沒有任何開銷。 – betabandido 2012-07-19 17:13:40

+0

這是一把雙刃劍 - 如果你看到最後提到的字符串示例。 ;) – Tuxdude 2012-07-19 17:49:17