2013-03-26 107 views
3

考慮一個C#API與方法有裁判參數,如自定義的結構:元組對與REF/out參數的方法的異步版本

Person FindPerson(string name, out int searchTime); 

我們不注意out和ref參數通常是一種設計氣味,假設這是一個傳統的API,我們不能改變其現有方法的簽名。但我們需要擴展API以支持異步執行(Windows Phone,WinRT應用程序)。以下是不會編譯的實現:

Task<Person> FindPersonAsync(string name, out int searchTime) 
{ 
    return Task.Factory.StartNew(() => this.FindPersonAsync(name, out searchTime)); 
} 

此實現不會編譯由於參數。所以我們必須改變API簽名。一種方法是將人員任務的結果更改爲人員和人員的元組任務,即委託實現將返回人員元組和元組。第二種選擇是定義一個自定義結構。

元組優勢:使用元組給出了一種非常正式的方法,可以用來爲任何API輕鬆定義異步版本。可預測的實現(沒有新的名字定義)。使用自定義結構需要爲每個這種情況創建新的類型和成員。

自定義結構優勢:使用元組的客戶端代碼需要參考使用項目1項目2名的元組元素。這是模糊的。

我還沒有找到任何建議,暫時決定使用元組。但是,我想知道在使用asyns支持擴展API時是否有推薦的方法來處理這些方法。

+3

這是非常主觀的。它們都工作,既不完美,運行時也不在乎。選擇你的毒藥。做檢查[這個元問題](http://meta.stackexchange.com/questions/142353/why-is-asking-a-question-on-best-practice-a-bad-thing) – 2013-03-27 01:02:59

+0

你的代碼可能更清晰如果你使用'TimeSpan'而不是'int'作爲'searchTime'結果。 – 2013-03-30 05:23:04

+0

同意TimeSpan可能是新API的更好選擇。但是我正在處理現有的版本,並希望保持異步版本儘可能接近原始版本。 – 2013-03-31 09:30:49

回答

1

我不知道有關於此事的任何最佳實踐或建議;但從我自己的經驗Tuple使代碼醜陋和無意義 - 當你看到一個是什麼意思Item1

我總是自定義類去跟上一些約定:

  • 定製類的名稱ResultFindPersonResult結束。
  • 將該類設計爲POCO,在構造函數中沒有特殊的邏輯。這樣可以避免在使用系統的其他部分和其他API時(尤其是序列化和反序列化)出現任何意外。
  • 總是將集合字段/屬性(數組,列表等)的初始值設置爲空值。這在許多情況下也有幫助。

請記住,這些僅僅是我對這件事的個人體驗,對我而言無縫運作。

+0

嗨Kaveh,我同意你基於Tuple的名字的醜陋,當然這是在不同選擇之間進行選擇時的一個重要考慮因素。 – 2013-05-09 10:00:14