2011-09-05 42 views
2

我寫了這段代碼。這真的很難看。我想重構它。我必須返回object[]。我在考慮使用bool值來檢查是否必須繼續調用其他方法,並且只需創建最終的object[]如何重構順序ifs?

private object[] TrasferisciSingoloFile(some parameters...) 
{ 
    Result result = new Result; 

    result = FTPRename(some parameters...); 
    if (result.error) 
    { 
     result.SetError("Some Problem 1"); 
     object tip = new object[] { par as ThreadCounterManager, result }; 
     return (object[])tip; 
    } 

    result = FTPDownloadAndCopy(some parameters...); 
    if (result.error) 
    { 
     result.SetError("Some Problem 2"); 
     object tip = new object[] { par as ThreadCounterManager, result }; 
     return (object[])tip; 
    } 

    result = FTPMove(some parameters...); 
    if (result.error) 
    { 
     result.SetError("Some Problem 3"); 
     object tip = new object[] { par as ThreadCounterManager, result }; 
     return (object[])tip; 
    } 

    result = FTPDelete(some parameters...); 
    if (result.error) 
    { 
     result.SetError("Some Problem 4"); 
     object tip = new object[] { par as ThreadCounterManager, result }; 
     return (object[])tip; 
    } 

    object tip1 = new object[] { par as ThreadCounterManager, result }; 

    return (object[])tip1; 
} 
+0

你有什麼問題嗎? –

+0

根據代碼,在任何時間點,無論是1還是無成功。 可能是,對所有這些方法進行委託調用,從而從所有這些方法獲得結果[](假設所有參數都相同)。然後,至少有一個數組shud中的項是真的w.r.t result.error。所以生病的調用其他方法並返回[]。這會將你的代碼從很多ifs中減少到1或2. – Zenwalker

+0

但是,在方法調用中會發生異常,並且分配永遠不會發生,因此結果將爲空或前一個方法的結果。 –

回答

6

讓該套件的所有功能FTPXXXX拋出一個異常時,他們發現了一個錯誤,讓你可以捕捉並在catch(){}塊一次返回錯誤。 「某些問題xxxx消息」可以用您在提出異常時提供的消息來修飾。

+0

+1這個想法,但我不能編輯FTPXXXX,這些方法不是我的。基本上,異常是在FTPXXX內部處理的,當我得到一個異常時,變量結果的錯誤字段不爲空 – dierre

+0

但是解決問題的異常方式很好?我的意思是我們必須做的表現薪酬是正確的? – Zenwalker

+0

@Dierre將所有這些方法都包裝到一個類中,並在出現阻塞錯誤時提升包裝函數 –

1

假設您的FTP函數在代碼中的其他位置,請考慮讓它們拋出異常,並在此函數中使用try/catch子句。

Result result = new Result(); 
try 
{ 
    result = FTPRename(some parameters...); 
    result = FTPDownloadAndCopy(some parameters...); 
    result = FTPMove(some parameters...); 
    result = FTPDelete(some parameters...); 
} 
catch (SomeException e) 
{ 
    return (object[])new object[] { par as ThreadCounterManager, result.SetError(e.Message) }; 
} 

return return (object[])new object[] { par as ThreadCounterManager, result }; 
+0

但是,在方法調用中會發生異常,並且分配永遠不會發生,因此結果將爲空或前一個方法的結果。 –

+0

同意,分配將被跳過,所以你得到最新的「有效」的結果,再加上錯誤信息從錯誤的地方。 –

1

如果你可以修改FTP方式,你也許可以讓他們每個分配錯誤消息本身,使一個輔助方法,用於創建尖端對象。這樣,您不必關心任何事情,只需檢查是否發生錯誤。

private Object[] makeTip(arg1, arg2) { 
    return Object[] {arg1, arg2}; 

} 

Result result = new Result; 

result = FTPRename(some parameters...); 
if(result.error) 
    return makeTip(par as ThreadCounterManager, result); 

result = FTPDownloadAndCopy(some parameters...); 
if(result.error) 
    return makeTip(par as ThreadCounterManager, result); 
... 
return makeTip(par as ThreadCounterManager, result);