Увеличить пример файл программы КПР


Я сейчас смотрю на этот импульс::КПР пример кода который я вставил ниже.

Я всегда стараюсь искать предложения по улучшению мой стиль написания, когда я хорошо написал столкнуться и хорошо отформатированный код.

Этот код, безусловно, выглядит как хороший код, но две вещи меня озадачили по этому поводу:

  • это хорошая практика, чтобы скопировать #определитьд константы к местным константные переменные перед их использованием? Почему это было бы хорошей идеей?

  • это на самом деле приемлемо, чтобы просто опустить скобки вокруг функции тела, если тело это попробовать-поймать-блок?

//  Boost CRC example program file  ------------------------------------------//

//  Copyright 2003 Daryle Walker.  Use, modification, and distribution are
//  subject to the Boost Software License, Version 1.0.  (See accompanying file
//  LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)

//  See <http://www.boost.org/libs/crc/> for the library's home page.

//  Revision History
//  17 Jun 2003  Initial version (Daryle Walker)

#include <boost/crc.hpp>  // for boost::crc_32_type

#include <cstdlib>    // for EXIT_SUCCESS, EXIT_FAILURE
#include <exception>  // for std::exception
#include <fstream>    // for std::ifstream
#include <ios>        // for std::ios_base, etc.
#include <iostream>   // for std::cerr, std::cout
#include <ostream>    // for std::endl


// Redefine this to change to processing buffer size
#ifndef PRIVATE_BUFFER_SIZE
#define PRIVATE_BUFFER_SIZE  1024
#endif

// Global objects
std::streamsize const  buffer_size = PRIVATE_BUFFER_SIZE;


// Main program
int
main
(
    int           argc,
    char const *  argv[]
)
try
{
    boost::crc_32_type  result;

    for ( int i = 1 ; i < argc ; ++i )
    {
        std::ifstream  ifs( argv[i], std::ios_base::binary );

        if ( ifs )
        {
            do
            {
                char  buffer[ buffer_size ];

                ifs.read( buffer, buffer_size );
                result.process_bytes( buffer, ifs.gcount() );
            } while ( ifs );
        }
        else
        {
            std::cerr << "Failed to open file '" << argv[i] << "'."
             << std::endl;
        }
    }

    std::cout << std::hex << std::uppercase << result.checksum() << std::endl;
    return EXIT_SUCCESS;
}
catch ( std::exception &e )
{
    std::cerr << "Found an exception with '" << e.what() << "'." << std::endl;
    return EXIT_FAILURE;
}
catch ( ... )
{
    std::cerr << "Found an unknown exception." << std::endl;
    return EXIT_FAILURE;
}


2877
8
задан 25 ноября 2011 в 08:11 Источник Поделиться
Комментарии
3 ответа

С явной константы на переменную const, теперь у вас есть два способа ссылаясь на то же значение. В принципе, это лишнее, и поэтому его следует избегать. На практике, с констант манифеста всегда виден в глобальном масштабе в C++, это достаточно спорный момент, но он все еще может быть использован для принятия решения в отсутствие любой другой точке. Так что, если есть какие-либо другие соображения не сразу видно в коде, такие как необходимость, чтобы иметь возможность переопределить константы манифеста и в то же время необходимость иметь постоянное со строгой типизацией, то все средства, он должен быть, и желательно документально.

Try оператор используется в качестве тела функции очень странно, что означает, что в среднем на C++ программист, глядя на это пойдут "ВТФ?". В то же время он не выполнит любой могучий подвиг, который сделает еще один добавить " ... О, я понимаю, почему это делается именно так, круто!". Это нормально для метод кодирования, чтобы иметь определенный ВТФ фактором для него, пока он выполняет что-то, аккуратные, за чистотой которого пропорциональна его WTFness, чтобы оправдать его. Все, что попробовать-заявление-используется как функция-тело выполняет это, чтобы избавить нас от необходимости вводить дополнительную, но, как ожидалось, пару фигурных скобок. Таким образом, следует избегать.

6
ответ дан 26 ноября 2011 в 09:11 Источник Поделиться


это хорошая практика, чтобы скопировать #определены константы для местных константный
переменные перед их использованием? Почему это было бы хорошей идеей?

Это не хорошо или плохо, но это определенно странно. Вообще я предпочитаю констант #определяет, потому что они имеют явный тип, которые могут быть проверены во время компиляции. Единственное преимущество (и я не решаюсь назвать) этого кода можно определить PRIVATE_BUFFER_SIZE в другой заголовочный файл и он будет переопределить здесь определение.


это приемлемо, чтобы просто опустить скобки вокруг
тело функции если тело попробовать-catch-блока?

Он может компилировать, но это ужасная практика. Не делай этого! ;)

2
ответ дан 26 ноября 2011 в 01:11 Источник Поделиться

Я бы инвертировать условие и использовать дальше , если есть ошибка с потоком:

for (int i = 1; i < argc; ++i) {
std::ifstream ifs(argv[i], std::ios_base::binary);
if (!ifs) {
std::cerr << "Failed to open file '" << argv[i] << "'." << std::endl;
continue; // or return EXIT_FAILURE;
}

do {
char buffer[buffer_size];

ifs.read(buffer, buffer_size);
result.process_bytes(buffer, ifs.gcount());
} while (ifs);
}

http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html

Я не учитель C++, но, возможно, потоки должны быть где-то закрытые.

(Я знаю, что это не ответ на ваши вопросы, но, возможно, вы найдете ее полезной.)

0
ответ дан 25 ноября 2011 в 09:11 Источник Поделиться