Рефакторинг Pretty-печати в стиле C в стиле C ++ — Pretty-печати в стиле

Я хочу изменить некоторые printf/sprintf/fprintf заявления в ostream/sstream/fstream заявления. Код, о котором идет речь, печатает ряд целых чисел и чисел с плавающей запятой, используя пробел и фиксированные числа десятичных знаков.

Мне кажется, что это было бы хорошим кандидатом для написания в стиле Мартина Фаулера безопасного, поэтапного рефакторинга с важными замечаниями. Первый шаг, конечно, состоит в том, чтобы вставить унаследованный код в тестовый комплект, что я и сделал.

Какие медленные и осторожные шаги я могу предпринять, чтобы выполнить этот рефакторинг?

3

Решение

Если рефакторинг не является самоцелью, вы можете полностью избежать этого (ну, почти), используя библиотеку форматирования, такую ​​как tinyformat который обеспечивает интерфейс, похожий на printf но является безопасным типом и использует IOStreams внутри.

2

Другие решения

Основные механики конверсии:

  • Конвертировать каждый printfпункт стиля %w.pf или же %w.pe, где w ширина поля и p количество цифр точности, в << setw(w) << setprecision(p) << fixed,
  • Конвертировать каждый printfпункт стиля %wd или же %wi, где w ширина поля, в << setw(w),
  • Перерабатывать "\n" в endl где уместно.

Процесс для printf:

  • Создать char[] (давайте назовем это text) с достаточной общей шириной.
  • Преобразовать printf(...) в sprintf(text, ...)и использовать cout << text на самом деле печатать текст.
  • Завершите, используя общие инструкции.

Процесс для fprintf:

  • Такой же как printf, но используйте соответствующие fstream вместо cout,
    • Если у вас уже есть открытый C-стиль FILE объект, который вы не хотите рефакторинг в это время, становится немного липкий (но осуществимо).
  • Завершите, используя общие инструкции.

Процесс для sprintf:

  • Если записываемая строка используется только для вывода в поток в текущем контексте, обратитесь к одному из двух рефакторингов выше.
    • В противном случае, начните с создания stringstream и потоковое содержимое char[] ты пишешь в это. Если вы все еще собираетесь извлечь char* из него можно сделать std::stringstream::str().c_str(),
  • Завершите, используя общие инструкции.

Общие инструкции:

  • Преобразуйте каждое предложение по одному в стиль C ++.
  • Удалить *printf а также char[] декларации по мере необходимости, когда закончено.
  • Применять другие рефакторинги, в частности, «Метод извлечения» (Фаулер, Рефакторинг) как необходимо.
2

По вопросам рекламы [email protected]