2011-04-26 12 views
1

返回錯誤列表的結果我遇到了困難,試圖返回結果與函數調用中的一組錯誤相結合。如何從函數

我從以下途徑

List<String> errors; 
bool result = Obj.GetResult(out errors, int id); 

第二步是引入新的類

public class OperationResult 
{ 
    public bool Result {get;set;} 
    public List<string> Errors {get;set;} 

} 

開始,但隨後髒代碼開始出現在調用getResult方法內部。

例如

public OperationResult GetResult(int id) 
{ 
    if (id == 0) 
    { 
    return new OperationResult { Result = false, Errors = {"Error"}}; 
    } 

    if (id < 400) 
    { 
    var result = new OperationResult { Result = false, Errors = {"Error"}}; 
    if (id >200) 
     result.Errors.Add("Error"); 
    return result; 
    } 
} 

然後我開始擔心不允許結果用戶編輯他們得到的結果。

我已經從OpearationResult類中提取了只能讀取數據的接口。

現在我想添加效果器類...

而在這一點上,我開始想,我做錯了什麼。試圖重新發明自行車,或只是在空中製造問題。

請給我一個建議,如何處理所有這些東西。 我也很好奇這是如何在函數式編程語言中處理的。 (我的意思是不變性)

+3

你不使用任何的例外情況的原因? – 2011-04-26 12:18:31

+0

從來不喜歡異常過度使用,其原因可能與迫使MS放棄基於異常的ui驗證的原因相同。 – v00d00 2011-04-26 12:23:14

+1

您只能過度使用throw語句。作爲一個對象返回一個異常很好。返回布爾的方法是非常邪惡的。 – 2011-04-26 12:34:08

回答

3

這可能是開始拋出異常的時候了。 在他的書中Clean Code,當你做對的混亂以及缺乏可讀的代碼羅伯特·馬丁會談是這樣的:

CustomResult result = myUser.CanLogOn(); 

,因爲它會通過閱讀CanLogOn應該簡單地返回一個布爾值指示代碼,如果用戶出現允許登錄,但現在它越來越有錯誤代碼等的自定義結果對象這將導致你進一步污染的東西你的代碼像

if(result.Result) 
    LogOn(); 

,而不是

if(myUser.CanLogOn()) 
    LogOn(); 

甚至更​​好

myUser.LogOn() 

,讓它決定是否能夠或不。

這是一個簡化的例子,因爲我假設除了數據庫異常之外,CanLogOn()方法中可能會出現很多可能的錯誤。

雖然您不應該爲正常流程使用異常,但它們部分是爲了防止此模式的輸出值以及返回時的錯誤代碼,並且需要知道返回代碼200和402和-134。

它會使你的代碼更清潔,更易於閱讀,並且可能會提示你檢查是否真的需要所有這些異常,如果是這樣,這種方法是最好的選擇。

1

例外被髮明,以防止你進入這裏的混亂。

其他方法不返回bool

我可以想想你的方法有其他問題,但主要的問題是:這需要更多的工作(vs投擲),並且這會很容易犯這個錯誤。報告錯誤時出錯...

1

我認爲你需要的保護級別可以通過readonly關鍵字來訪問:

internal class OperationResult 
{ 
    public OperationResult(bool result, List<string> errors) 
    { 
     Result = result; 
     Errors = errors; 
    } 

    readonly bool Result { get; set; } 
    readonly List<string> Errors { get; set; } 
} 

有了這個修改器,2個屬性只能在內部構造函數設置,所以沒有辦法爲你的客戶進行修改。所以,當你想使用它們,只是修改了一下你的程序:設置你的錯誤的列表,然後建立創建OperationResult對象:

public OperationResult GetResult(int id) 
{ 
    if (id == 0) 
    { 
    return new OperationResult(false, new List<string>{"Error"}); 
    } 

    if (id < 400) 
    { 
    var errors = new List<string>{"Error"}; 
    if (id >200) 
     errors.Add("Error"); 
    return new OperationResult(false, errors); 
    } 
}