операторы возврата внутри функции

Мне было интересно, как люди обрабатывают операторы возврата в функции. У меня есть метод, который выделяет часть памяти, но возвращает 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" ) );

person TheFuzz    schedule 31.08.2010    source источник


Ответы (3)


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

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

person Community    schedule 31.08.2010

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

person GaTechThomas    schedule 31.08.2010
comment
Дело не столько в размере (50 строк), сколько в сложности, особенно во времени, необходимом для понимания того, что делает метод. - person CaffGeek; 31.08.2010

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

person meriton    schedule 31.08.2010