2010-08-31 166 views
1

我在想如何處理函數中的返回語句。我有一個方法分配一些內存,但返回false;當函數出錯時聲明。該語句位於函數的大約一半處,所以如果該函數失敗,我的內存就會泄漏。這不是唯一的回報......;我在這個函數中有聲明。那麼stackoverflow會推薦做什麼來清理函數中的代碼,並在其中包含一些return語句?函數內的返回語句

if(true == OpenFtpConnection()) 
{ 
    AfxMessageBox(_T("Connection to internet and ftp server found")); 

    // set the directory to where the xml file lives 
    if(false == FtpSetCurrentDirectory(m_ftpHandle, _T(_FTP_XML_LOCATION))) 
     return false; 

    HINTERNET xmlHandle = NULL; 
    WIN32_FIND_DATA fileData; 
    SYSTEMTIME fileWriteTime; 
    xmlHandle = FtpFindFirstFile(m_ftpHandle, _T("TPCFeed.xml"), &fileData, INTERNET_FLAG_RELOAD, 0); 
    if(NULL == xmlHandle) 
     return false; 
    else 
    { 
     // get the write time of the ftp file 
     FileTimeToSystemTime(&fileData.ftLastWriteTime, &fileWriteTime); 

     // get the write time of the local file 
     HANDLE localFileHandle = NULL; 
     localFileHandle = CreateFile(_T(_XML_FILENAME_PATH), FILE_READ_ATTRIBUTES, 
           FILE_SHARE_READ, NULL, OPEN_EXISTING, 
           NULL, NULL); 
     if(INVALID_HANDLE_VALUE == localFileHandle) 
     { 
      AfxMessageBox(_T("opening file failed, file not found")); 
      return false; 
     } 
     else 
     { 
      CloseHandle(localFileHandle); 
     } 


     // close the FtpFindFirstFile() handle 
     InternetCloseHandle(xmlHandle); 
    } 


    // download xml file to disk 
    //if(false == FtpGetFile(m_ftpHandle, _T("TPCFeed.xml"), _T(_XML_FILENAME_PATH), FALSE, 
    //      FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0)) 
    // return false; 

} 
else 
{ 
    AfxMessageBox(_T("No Connection to internet or ftp server found")); 
    return false; 
} 
if(true == CloseFtpConnection()) 
    AfxMessageBox(_T("Connection to internet closed")); 
else 
    AfxMessageBox(_T("Connection to internet not closed")); 

回答

3

清晰度是最重要的。很多時候,具有多個返回點可能會使程序流動不太明顯,從而更容易出現錯誤;但另一方面,有時早期的回報是相當明顯的;其含義和目的是明確的。所以我傾向於避免任何有關這方面的硬性規定。

如果你真的發佈了你想清理的代碼,你可能會獲得更多的里程。

+1

對於「發佈代碼」+1。 – bcat 2010-08-31 19:20:23

+0

true ==「發佈代碼」 – TheFuzz 2010-08-31 19:43:44

1

我們最近已經從「每種方法一種回報」的風格轉變爲「迴歸它有意義的地方」。該開關的一部分是我們將我們的方法中的行數限制在合理的範圍內(比如50行)。通過限制函數大小,代碼變得更加可讀,並且多重返回是自然的,可讀的和高性能的。

+0

它的規模較小(50行),更多關於複雜性,特別是理解該方法所需的時間量。 – CaffGeek 2010-08-31 19:39:49

0

您還沒有指定您的編程語言。假設它是C++:使用Boost's Smart Pointer。這不僅處理多個返回,而且處理方法執行期間拋出的異常。如果使用Boost不是一種選擇,則應該很容易創建您自己的智能指針類:-)