вернуть операторы внутри функции - PullRequest
1 голос
/ 31 августа 2010

Мне было интересно, как люди обрабатывают операторы return в функции. У меня есть метод, который выделяет некоторую память, но возвращает ложь; заявление, когда функция идет не так, как надо. это утверждение находится примерно на полпути через функцию, поэтому моя память просачивается при сбое этой функции. Это не единственное возвращение ...; Заявление у меня есть в этой функции. Что порекомендует 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 ]

3 голосов
/ 31 августа 2010

Ясность - самая важная вещь. Много раз наличие нескольких точек возврата может сделать ход программы менее очевидным и, следовательно, более подверженным ошибкам; но с другой стороны, иногда раннее возвращение довольно очевидно; их смысл и цель понятны. Поэтому я стараюсь избегать каких-либо жестких правил по этому поводу.

Вы можете получить больше пробега, если вы действительно разместите код, который хотите очистить.

1 голос
/ 31 августа 2010

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

0 голосов
/ 31 августа 2010

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

...