2010-08-31 84 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不是一种选择,则应该很容易创建您自己的智能指针类:-)