История изменений
Исправление 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()