3

いくつかのprintf//ステートメントをsprintf//ステートメントにリファクタリングしたいと思います。問題のコードは、空白のパディングと固定小数点数を使用して、一連の整数と浮動小数点数をきれいに出力します。fprintfostreamsstreamfstream

これは、重要な落とし穴が指摘された、安全で段階的なリファクタリングのマーティンファウラースタイルの記事の良い候補になると私には思えます。もちろん、最初のステップは、レガシーコードをテストハーネスに取り込むことです。これは私が行ったものです。

このリファクタリングを実行するには、どのようなゆっくりと注意深い手順を実行できますか?

4

2 に答える 2

2

リファクタリング自体が目標ではない場合は、tinyformatなどのフォーマットライブラリを使用することで、リファクタリングを完全に回避できます。このライブラリは、printfタイプセーフであり、内部でIOStreamsを使用します。

于 2013-02-05T21:01:35.903 に答える
2

変換の基本的な仕組み:

  • printfスタイルの句%w.pfまたは%w.pew(はフィールド幅、pは精度の桁数)を。に変換し<< setw(w) << setprecision(p) << fixedます。
  • printfスタイルの句%wdまたは%wi、(wフィールド幅)を。に変換し<< setw(w)ます。
  • 必要に応じて変換"\n"endlます。

のプロセスprintf

  • 十分な全幅char[]で(それを呼びましょう)を作成します。text
  • に変換printf(...)sprintf(text, ...)、を使用cout << textして実際にテキストを印刷します。
  • 一般的な手順を使用して完了します。

のプロセスfprintf

  • と同じですが、の代わりにprintf適切なものを使用してください。 fstreamcout
    • FILE現時点でリファクタリングしたくないCスタイルのオブジェクトを既に開いている場合は、少し粘着性があります(ただし、実行できます)。
  • 一般的な手順を使用して完了します。

のプロセスsprintf

  • 書き込まれている文字列が現在のコンテキストでストリームに出力するためだけに使用される場合は、上記の2つのリファクタリングのいずれかを参照してください。
    • それ以外の場合は、を作成し、それに書き込んstringstreamでいるコンテンツをストリーミングすることから始めます。char[]それでもそれからを抽出するつもりならchar*、あなたはすることができますstd::stringstream::str().c_str()
  • 一般的な手順を使用して完了します。

一般的な手順:

  • 各句を1つずつC++スタイルに変換します。
  • 終了したら、必要に応じて宣言を削除*printfします。char[]
  • 他のリファクタリング、特に「ExtractMethod」(Fowler、Refactoring)を必要に応じて適用します。
于 2013-02-05T21:01:51.757 に答える