26

私が現在取り組んでいるプロジェクトでは、特別にフォーマットされた文字列を処理のためにサードパーティ サービスに提供する必要があります。そして、私は次のように文字列を構築しています:

string someString = string.Format("{0}{1}{2}: Some message. Some percentage: {3}%", token1, token2, token3, number); 

文字列をハードコードするのではなく、プロジェクト リソースに移動することを考えていました。

string someString = string.Format(Properties.Resources.SomeString, token1, token2, token3, number); 

私の意見では、2 番目のオプションは最初のものほど読みやすくありません。つまり、コードを読む人は、最終結果がどのように見えるかを理解するために文字列リソースをプルアップする必要があります。

どうすればこれを回避できますか? この場合、ハードコーディングされたフォーマット文字列は必要悪ですか?

4

5 に答える 5

20

これは必要悪であり、私が頻繁に使用してきたものだと思います。私がする臭いのあることは、次のとおりです。

// "{0}{1}{2}: Some message. Some percentage: {3}%"
string someString = string.Format(Properties.Resources.SomeString
                                  ,token1, token2, token3, number);

..少なくとも、他の人に見られて恥ずかしい思いをするほどコードが安定するまでは。

于 2009-06-08T02:43:24.793 に答える
17

これを実行する理由はいくつかありますが、唯一の大きな理由は、アプリケーションを別の言語にローカライズする場合です。

リソース文字列を使用している場合は、注意すべき点がいくつかあります。

  1. ローカライズするリソース文字列のセットに、可能な限りフォーマット文字列を含めます。これにより、翻訳者はフォーマットされたアイテムの位置を並べ替えて、翻訳されたテキストのコンテキストにより適したものにすることができます。

  2. あなたの言語のフォーマットトークンに文字列を含めることは避けてください。これらを数字に使用することをお勧めします。たとえば、 「指定し

    た値は{0}から{1}の間でなければなりません」というメッセージが表示されます。

    {0}や{1}が5や10のような数字の場合は素晴らしいです。「5」や「10」のような文字列でフォーマットしている場合、これによりローカリゼーションが困難になります。

  3. リソースに適切な名前を付けるだけで、話している読みやすさの問題を回避できます。

    string someString = string.Format(Properties.Resources.IntegerRangeError、minValue、maxValue);

  4. コード内の適切な抽象化レベルでユーザーに表示される文字列を生成しているかどうかを評価します。一般に、ユーザーに表示されるすべての文字列を、ユーザーインターフェイスにできるだけ近いコードにグループ化する傾向があります。一部の低レベルのファイルI/Oコードでエラーを提供する必要がある場合は、アプリケーションで処理する例外と一貫したエラーメッセージを使用して、これを実行する必要があります。これにより、コード全体にペッパーを付けるのではなく、ローカリゼーションが必要なすべての文字列も統合されます。

于 2009-06-08T03:01:14.337 に答える
3

ハードコードされた文字列を追加したり、リソースファイルへの文字列の追加を高速化したりするためにできることの1つは、CodeRush Xpressを使用することです。CodeRushXpressは、http ://www.devexpress.com/Products/Visual_Studio_Add-in/から無料でダウンロードできます。 CodeRushX /

文字列を記述したら、CodeRushメニューにアクセスして、1つのステップでリソースファイルに抽出できます。非常に素晴らしい。

Resharperにも同様の機能があります。

于 2009-06-08T03:10:17.813 に答える
2

プログラムに書式文字列を含めることがなぜ悪いことなのかわかりません。文書化されていない従来のマジック ナンバーとは異なり、一目見ただけで何をするかは明らかです。もちろん、フォーマット文字列を複数の場所で使用している場合は、冗長性を避けるために適切な読み取り専用変数に格納する必要があります。

ここでそれをリソースに保持することは不必要な間接化であることに同意します。考えられる例外は、プログラムをローカライズする必要があり、リソース ファイルを介してローカライズしている場合です。

于 2009-06-08T02:45:14.947 に答える