LINUX.ORG.RU

История изменений

Исправление Manhunt, (текущая версия) :

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

Ввод-вывод в одном месте, парсер в другом. Это никак не связанные вещи.

while (read_block (&block, &io_err) && !io_err) {
    if (!parse_block (&block, &state, &parse_err) || parse_err) {
        break;
    }
}
if (io_err) {
    handle_io_err (&io_err);
}
if (parse_err) {
    handle_parse_err (&parse_err);
}



1. В твоем коде парсер не запрашивает данные.
2. Тело while() в твоем коде на 60% посвящено обработке ошибок и на 40% посвящено штатной работе программы. Вот такого смешивания как раз хотелось бы избежать: то есть сделать так, чтобы штатная работа была описана отдельно и не содержала плясок вокруг всех этих io_err/parse_err, а обработка ошибок - отдельно. Примерно вот так:

try
{
    while (read_block (&block)) {
        parse_block (&block, &state);
    }
}
catch (io_err_t io_err)
{
    handle_io_err (&io_err);
}
catch (parse_err_t parse_err)
{
    handle_parse_err (&parse_err);
}


Сравни, насколько легче теперь читается тело while()

Исходная версия Manhunt, :

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

Ввод-вывод в одном месте, парсер в другом. Это никак не связанные вещи.

while (read_block (&block, &io_err) && !io_err) {
    if (!parse_block (&block, &state, &parse_err) || parse_err) {
        break;
    }
    if (io_err) {
        handle_io_err (&io_err);
    }
    if (parse_err) {
        handle_parse_err (&parse_err);
    }
}



1. В твоем коде парсер не запрашивает данные.
2. Тело while() в твоем коде на 60% посвящено обработке ошибок и на 40% посвящено штатной работе программы. Вот такого смешивания как раз хотелось бы избежать: то есть сделать так, чтобы штатная работа была описана отдельно и не содержала плясок вокруг всех этих io_err/parse_err, а обработка ошибок - отдельно. Примерно вот так:

try
{
    while (read_block (&block)) {
        parse_block (&block, &state);
    }
}
catch (io_err_t io_err)
{
    handle_io_err (&io_err);
}
catch (parse_err_t parse_err)
{
    handle_parse_err (&parse_err);
}


Сравни, насколько легче теперь читается тело while()