2010-08-31 2 views
1

Мне было интересно, как люди обрабатывают операторы возврата в функции. У меня есть метод, который выделяет некоторую память, но возвращает false; когда функция идет не так. этот оператор расположен примерно наполовину через функцию, поэтому моя память просачивается, если эта функция не работает. Это не единственное возвращение ...; Я имею в этой функции. Что бы stackoverflow рекомендовал делать, чтобы очистить код в функции с несколькими возвращающими операторами в нем?Операторы возврата внутри функции

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

+0

true == "post code" – TheFuzz

1

Мы недавно перешли от стиля «один возврат к методу», чтобы «вернуться туда, где это имеет смысл». Часть этого переключателя заключалась в том, что мы ограничиваем количество строк в наших методах чем-то разумным (скажем, 50 строк). Ограничивая размер функции, код становится намного читабельнее, а мультипотоки являются естественными, читабельными и эффективными.

+0

Это меньше о размере (50 строк), больше о сложности, в частности о количестве времени, необходимого для понимания того, что делает этот метод. – CaffGeek

0

Вы не указали свой язык программирования. Предполагая, что это C++: используйте Boost's Smart Pointer. Это не только обрабатывает несколько возвратов, но также и исключения, возникающие при выполнении метода. Если использование Boost не является вариантом, должно быть легко создать свой собственный класс интеллектуальных указателей :-)

Смежные вопросы